2011-11-27 18 views
7

मैं पीडीओ पर पढ़ा तैयार करें और मैं पीडीओ के बारे में Stackoverflow पर खोज की है और बयान तैयार करते हैं। मैं जानना चाहता हूं कि लाभ क्या हैं या तैयार कथन का उपयोग कर रहे हैं। उदाहरण के लिए:पीएचपी पीडीओ प्रश्नों

$sql = 'SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'; 
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
$sth->execute(array(':calories' => 150, ':colour' => 'red')); 
$red = $sth->fetchAll(); 

बनाम

$sql = "SELECT name, colour, calories FROM fruit WHERE calories < $calories AND colour = $colour"; 
$result = $connection->query($query); 
$row = $result->fetch(PDO::FETCH_ASSOC); 

दोनों प्रश्नों क्यों तैयार का उपयोग कर तो एक ही परिणाम वापस आ जाएगी, मेरे लिए ऐसा लगता है कि यह वाला धीमी हो रहा है जब से तुम एक अतिरिक्त कदम पर अमल करने की है।

धन्यवाद

+1

आपका दूसरे उदाहरण वास्तव में काम नहीं करता है - आप मूल्यों के साथ क्वेरी में पैरामीटर की जगह नहीं है! –

+0

@ फ्रांसिसीएविला, ठीक है .. आप ** सही मूल्यों को इंजेक्ट कर सकते हैं, लेकिन, हाँ, डिफ़ॉल्ट रूप से यह काम नहीं करेगा। –

+0

ओपी के पहले संस्करण में, '$ कैलोरी' सिर्फ 'कैलोरी 'था। तो हाँ, मेरी टिप्पणी अब लागू नहीं होती है। –

उत्तर

12

तैयार बयान कर रहे हैं:

  1. सुरक्षित: पीडीओ या अंतर्निहित डेटाबेस पुस्तकालय आप के लिए बाध्य चर बचने का ख्याल रखना होगा। यदि आप हमेशा तैयार कथन का उपयोग करते हैं तो आप एसक्यूएल इंजेक्शन हमलों के लिए कभी भी कमजोर नहीं होंगे।
  2. (कभी-कभी) तेज़: कई डेटाबेस एक तैयार कथन के लिए क्वेरी प्लान को कैश करेंगे और संपूर्ण क्वेरी टेक्स्ट को पुनः प्रेषित करने के बजाय एक प्रतीक द्वारा तैयार कथन देखेंगे। यह सबसे अधिक ध्यान देने योग्य है यदि आप केवल एक बार एक कथन तैयार करते हैं और फिर विभिन्न चर के साथ तैयार कथन ऑब्जेक्ट का पुन: उपयोग करते हैं।
इन दोनों के

, # 1 दूर अधिक महत्वपूर्ण है और तैयार बयान अपरिहार्य बनाता है! यदि आपने तैयार वक्तव्यों का उपयोग नहीं किया है, तो सॉफ्टवेयर में इस सुविधा को फिर से कार्यान्वित करने के लिए केवल एकमात्र चीज होगी। (मैं कई बार किया है के रूप में जब मैं mysql ड्राइवर का उपयोग करने के लिए मजबूर किया गया था और PDO उपयोग नहीं कर सका।)

+0

"आह हाँ, 'लिटिल बॉबी टेबल्स', हम उसे फोन ..." http://xkcd.com/327/ – Olie

1

तैयार तेजी से जब प्रश्नों का एक बहुत का उपयोग कर (आप पहले से ही क्वेरी तैयार) है और यह अधिक सुरक्षित है।

आपकी दूसरी कोड शायद काम नहीं करेगा - आप किसी क्वेरी में पैरामीटर का उपयोग कर रहे हैं, लेकिन आप उन्हें परिभाषित करने नहीं कर रहे हैं।

क्वेरी के साथ() आप मैन्युअल रूप से बोली का उपयोग कर क्वेरी को भरने के लिए है() - यह अधिक काम है और प्रोग्रामर लापरवाह बनाने के लिए जाता है।

+0

मैं समस्या – joel

+0

को सही और अपनी अपडेट किए गए कोड में आप प्रदर्शित आप क्वेरी का उपयोग क्यों नहीं करना चाहिए()। अभी यह '$ कैलोरी 'बदलकर, एक एसक्यूएल इंजेक्शन करने के लिए * बहुत * आसान है। आपका तैयार() उदाहरण इंजेक्शन सबूत होगा। –

0

तैयार और बाध्यकारी मापदंडों एसक्यूएल इंजेक्शन को रोकने के लिए है,
,
डेटाबेस को भेजने, जबकि अपने दूसरे प्रश्न है कि इस पर कोई रक्षा से पहले चर बचने अधिनियम पसंद है।

0

वास्तव में तीसरा विकल्प आपको याद नहीं है:

$stmt = $dbh->prepare(' 
    SELECT 
     name, 
     colour, 
     calories 
    FROM fruit 
    WHERE calories < :calories 
    AND colour = :colour 
'); 
$stmt->bindParam(':calories', $calories, PDO::PARAM_INT); 
$stmt->bindParam(':colour', $colour, PDO::PARAM_STR, 64); 
if ($sth->execute()) 
{ 
    $data = $sth->fetchAll(PDO::FETCH_ASSOC); 
} 

हो सकता है कि मैं याद आ रही है कुछ, लेकिन कर्सर विकल्पों को सेट करना थोड़ा सा व्यर्थ लगता है, अगर आप fetchAll() वैसे भी कर रहे हैं।

संबंधित मुद्दे