बीच क्या अंतर है PDOStatement::bindParam()
और PDOStatement::bindValue()
?
बीच क्या अंतर है PDOStatement::bindParam()
और PDOStatement::bindValue()
?
जवाबों:
इसका उत्तर दस्तावेज में है bindParam
:
PDOStatement :: bindValue () के विपरीत, चर एक संदर्भ के रूप में बाध्य है और केवल उस समय मूल्यांकन किया जाएगा जब PDOStatement :: execute () कहा जाता है।
तथा execute
PDOStatement :: bindParam () को पैरामीटर मार्करों के लिए पीएचपी वेरिएबल्स को बांधने के लिए: बाध्य चर इनपुट के रूप में उनके मूल्य को पास करते हैं और आउटपुट मान प्राप्त करते हैं, यदि कोई हो, उनके संबंधित पैरामीटर मार्करों के।
उदाहरण:
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'
या
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'
के लिए मैनुअल प्रविष्टि सेPDOStatement::bindParam
:
[के साथ
bindParam
] इसके विपरीतPDOStatement::bindValue()
, चर एक संदर्भ के रूप में बाध्य है और केवल उस समय का मूल्यांकन किया जाएगाPDOStatement::execute()
जिसे कहा जाता है।
इसलिए, उदाहरण के लिए:
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'
या
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'
bindValue
आप डेटा हर बार-बाँध फिर नहीं करनी होंगी। इसके साथ bindParam
आपको केवल चर को अपडेट करना होगा। bindValue
स्थैतिक डेटा का उपयोग करने का मुख्य कारण शाब्दिक तार या संख्या होगा।
यहाँ कुछ मैं सोच सकता हूँ:
bindParam
, आप केवल चर पास कर सकते हैं; मान नहींbindValue
, आप दोनों (मान, स्पष्ट रूप से, और चर) पास कर सकते हैंbindParam
केवल चर के साथ काम करता है क्योंकि यह "संदर्भ" (और एक मान PHP में एक वैध "संदर्भ नहीं है) द्वारा इनपुट / आउटपुट के रूप में दिए जाने वाले मापदंडों को अनुमति देता है : यह ड्राइवरों के साथ उपयोगी है जो (मैनुअल को उद्धृत करते हुए):संग्रहीत प्रक्रियाओं के आह्वान का समर्थन करते हैं जो डेटा को आउटपुट मापदंडों के रूप में वापस करते हैं, और कुछ इनपुट / आउटपुट मापदंडों के रूप में भी हैं जो दोनों डेटा में भेजते हैं और इसे प्राप्त करने के लिए अपडेट किए जाते हैं।
कुछ डीबी इंजनों के साथ, संग्रहीत प्रक्रियाओं में पैरामीटर हो सकते हैं जो दोनों इनपुट के लिए इस्तेमाल किया जा सकता है (PHP से प्रक्रिया के लिए एक मूल्य दे) और ouput (PHP के लिए संग्रहीत खरीद से एक मूल्य लौटा); उन मापदंडों को बाँधने के लिए, आपको bindParam का उपयोग करना है, न कि bindValue का।
से तैयार बयान और संग्रहित प्रक्रियाओं
bindParam
एक समय बंधन के साथ कई पंक्तियों को सम्मिलित करने के लिए उपयोग करें :
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
सबसे सामान्य उद्देश्य के लिए, आपको उपयोग करना चाहिए bindValue
।
bindParam
दो मुश्किल या अप्रत्याशित व्यवहार हैं:
bindParam(':foo', 4, PDO::PARAM_INT)
काम नहीं करता है, क्योंकि इसके लिए एक चर (संदर्भ के रूप में) की आवश्यकता होती है।bindParam(':foo', $value, PDO::PARAM_INT)
$value
चलाने के बाद स्ट्रिंग में बदल जाएगा execute()
। यह, ज़ाहिर है, सूक्ष्म कीड़े पैदा कर सकता है जिन्हें पकड़ना मुश्किल हो सकता है।स्रोत: http://php.net/manual/en/pdostatement.bindparam.php#94711
आप किसी भी लंबे समय तक संघर्ष करने की जरूरत नहीं है, जब वहाँ एक तरह से यह मौजूद है:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);