जैसा कि लगभग सभी "मैं PHP के भीतर से SQL कैसे करूँ" प्रश्नों के साथ - आप वास्तव में तैयार बयानों का उपयोग करना चाहिए। यह इतना कठिन नहीं है:
$ids = array(2, 4, 6, 8);
// prepare an SQL statement with a single parameter placeholder
$sql = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = ?";
$stmt = $mysqli->prepare($sql);
// bind a different value to the placeholder with each execution
for ($i = 0; $i < count($ids); $i++)
{
$stmt->bind_param("i", $ids[$i]);
$stmt->execute();
echo "Updated record ID: $id\n";
}
// done
$stmt->close();
वैकल्पिक रूप से, आप इसे इस तरह कर सकते हैं:
$ids = array(2, 4, 6, 8);
// prepare an SQL statement with multiple parameter placeholders
$params = implode(",", array_fill(0, count($ids), "?"));
$sql = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id IN ($params)";
$stmt = $mysqli->prepare($sql);
// dynamic call of mysqli_stmt::bind_param hard-coded eqivalent
$types = str_repeat("i", count($ids)); // "iiii"
$args = array_merge(array($types), $ids); // ["iiii", 2, 4, 6, 8]
call_user_func_array(array($stmt, 'bind_param'), ref($args)); // $stmt->bind_param("iiii", 2, 4, 6, 8)
// execute the query for all input values in one step
$stmt->execute();
// done
$stmt->close();
echo "Updated record IDs: " . implode("," $ids) ."\n";
// ----------------------------------------------------------------------------------
// helper function to turn an array of values into an array of value references
// necessary because mysqli_stmt::bind_param needs value refereces for no good reason
function ref($arr) {
$refs = array();
foreach ($arr as $key => $val) $refs[$key] = &$arr[$key];
return $refs;
}
अन्य फ़ील्ड के लिए अधिक पैरामीटर प्लेसहोल्डर जोड़ें जैसा आपको उनकी आवश्यकता है।
कौन सा चुनना है?
-
पहला संस्करण डेटाबेस को कई बार हिट करते हुए, रिकॉर्ड की एक चर संख्या के साथ काम करता है। यह UPDATE और INSERT संचालन के लिए सबसे उपयोगी है।
-
दूसरा संस्करण भी रिकॉर्ड की एक चर संख्या के साथ काम करता है, लेकिन यह केवल एक बार डेटाबेस को हिट करता है। यह पुनरावृत्त दृष्टिकोण से कहीं अधिक कुशल है, जाहिर है कि आप केवल सभी प्रभावित रिकॉर्डों के लिए एक ही काम कर सकते हैं। यह SELECT और DELETE ऑपरेशंस के लिए सबसे उपयोगी है, या जब आप एक ही डेटा के साथ कई रिकॉर्ड्स को अपडेट करना चाहते हैं।
कथन क्यों तैयार किए?
- तैयार किए गए कथन अधिक सुरक्षित हैं क्योंकि वे SQL इंजेक्शन हमलों को असंभव बनाते हैं। तैयार बयानों का उपयोग करने का यह प्राथमिक कारण है, भले ही उन्हें लिखना अधिक काम हो। इसमें शामिल होने की एक समझदार आदत है:हमेशा तैयार बयानों का उपयोग करें, भले ही आपको लगता है कि यह "वास्तव में आवश्यक नहीं है।" उपेक्षा आएगी और आपको (या आपके ग्राहकों को) काटेगी।
- अलग-अलग पैरामीटर मानों के साथ एक ही तैयार किए गए कथन का कई बार पुन:उपयोग करना डेटाबेस में एकाधिक पूर्ण SQL स्ट्रिंग भेजने की तुलना में अधिक कुशल है, क्योंकि डेटाबेस को केवल एक बार कथन को संकलित करने की आवश्यकता होती है और इसका पुन:उपयोग भी कर सकते हैं। ली>
- डेटाबेस को केवल पैरामीटर मान
execute()
पर भेजे जाते हैं , इसलिए कम डेटा को बार-बार उपयोग करने पर वायर पर जाने की आवश्यकता होती है।
लंबे लूप में तैयार स्टेटमेंट का उपयोग करने और प्लेन SQL भेजने के बीच निष्पादन समय का अंतर ध्यान देने योग्य हो जाएगा।