BindParam और bindValue में क्या अंतर है?


जवाबों:


190

इसका उत्तर दस्तावेज में है 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'

667

के लिए मैनुअल प्रविष्टि से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'

9
शानदार, धन्यवाद! प्रश्न - आप एक के बाद एक का उपयोग क्यों करना चाहते हैं? जैसे कि यह उपयोगी होगा या आवश्यक है कि बाइंड पैरामीटर का निष्पादन केवल () समय पर किया जाए?
कोल्डब्लैकाइसिस

32
@Coldblackice यदि आप अलग-अलग डेटा के साथ कई बार क्वेरी निष्पादित कर रहे थे। साथ bindValueआप डेटा हर बार-बाँध फिर नहीं करनी होंगी। इसके साथ bindParamआपको केवल चर को अपडेट करना होगा। bindValueस्थैतिक डेटा का उपयोग करने का मुख्य कारण शाब्दिक तार या संख्या होगा।
lonesomeday

1
उदाहरण के लिए, आप फ़ंक्शन रिटर्न मानों के साथ bindValue का उपयोग करना चाहते हैं: $ stmt-> bindValue (': status', strtolower ($ status), PDO :: PARAM_STR);
payforbychrist

1
उत्थान करना चाहता था, लेकिन क्योंकि यह 666 है, मैं इसे छोड़
दूंगा

219

यहाँ कुछ मैं सोच सकता हूँ:

  • के साथ bindParam, आप केवल चर पास कर सकते हैं; मान नहीं
  • के साथ bindValue, आप दोनों (मान, स्पष्ट रूप से, और चर) पास कर सकते हैं
  • bindParamकेवल चर के साथ काम करता है क्योंकि यह "संदर्भ" (और एक मान PHP में एक वैध "संदर्भ नहीं है) द्वारा इनपुट / आउटपुट के रूप में दिए जाने वाले मापदंडों को अनुमति देता है : यह ड्राइवरों के साथ उपयोगी है जो (मैनुअल को उद्धृत करते हुए):

संग्रहीत प्रक्रियाओं के आह्वान का समर्थन करते हैं जो डेटा को आउटपुट मापदंडों के रूप में वापस करते हैं, और कुछ इनपुट / आउटपुट मापदंडों के रूप में भी हैं जो दोनों डेटा में भेजते हैं और इसे प्राप्त करने के लिए अपडेट किए जाते हैं।

कुछ डीबी इंजनों के साथ, संग्रहीत प्रक्रियाओं में पैरामीटर हो सकते हैं जो दोनों इनपुट के लिए इस्तेमाल किया जा सकता है (PHP से प्रक्रिया के लिए एक मूल्य दे) और ouput (PHP के लिए संग्रहीत खरीद से एक मूल्य लौटा); उन मापदंडों को बाँधने के लिए, आपको bindParam का उपयोग करना है, न कि bindValue का।


@PascalMartin बस मैं जो जानना चाहता था, क्या आप bindParam के साथ मूल्यों को बांध सकते हैं। चीयर्स।
तुहुदा

1
मुझे अभी भी कोई सुराग नहीं है कि इसका क्या मतलब है, वास्तव में चर क्या हैं और मूल्य क्या हैं। मैं एक प्लेसहोल्डर के लिए एक मान को बांधने के लिए bindParam का उपयोग करता हूं और bindValue के साथ मैं ऐसा ही कर सकता हूं! - मेरे उदाहरण में कम से कम ...
रिचर्ड

29

से तैयार बयान और संग्रहित प्रक्रियाओं

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();

27

सबसे सामान्य उद्देश्य के लिए, आपको उपयोग करना चाहिए 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


4

आप किसी भी लंबे समय तक संघर्ष करने की जरूरत नहीं है, जब वहाँ एक तरह से यह मौजूद है:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 

4

व्यवहार द्वारा संस्मरण के लिए इसे परिप्रेक्ष्य में रखने का सबसे सरल तरीका (PHP के संदर्भ में):

  • bindParam: संदर्भ
  • bindValue: परिवर्तनशील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.