ความแตกต่างระหว่าง bindParam และ bindValue คืออะไร?


คำตอบ:


190

คำตอบอยู่ในเอกสารประกอบสำหรับbindParam:

แตกต่างจาก PDOStatement :: bindValue () ตัวแปรถูกผูกไว้เป็นการอ้างอิงและจะถูกประเมินในเวลาที่เรียก PDOStatement :: execute () เท่านั้น

และ execute

เรียก PDOStatement :: bindParam () เพื่อผูกตัวแปร PHP กับตัวทำเครื่องหมายพารามิเตอร์: ตัวแปรที่ถูกผูกไว้จะส่งผ่านค่าเป็นอินพุตและรับค่าเอาต์พุตหากมีของตัวทำเครื่องหมายพารามิเตอร์ที่เกี่ยวข้อง

ตัวอย่าง:

$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
ยอดเยี่ยมขอบคุณ! คำถาม - ทำไมคุณถึงอยากใช้อันอื่น? เช่นเมื่อใดจะมีประโยชน์หรือจำเป็นที่จะต้องประเมินค่าพารามิเตอร์ bind เฉพาะเวลา execute ()?
Coldblackice

32
@Coldblackice หากคุณกำลังดำเนินการค้นหาหลายครั้งด้วยข้อมูลที่แตกต่างกัน ด้วยbindValueคุณจะต้องผูกข้อมูลใหม่ทุกครั้ง ด้วยbindParamคุณเพียงแค่ต้องปรับปรุงตัวแปร เหตุผลหลักในการใช้งานbindValueคือข้อมูลคงที่เช่นสตริงตัวอักษรหรือตัวเลข
lonesomeday

1
ตัวอย่างเช่นคุณต้องการใช้ bindValue กับค่าส่งคืนฟังก์ชัน: $ stmt-> bindValue (': สถานะ', strtolower (สถานะ $), PDO :: PARAM_STR);
Paidforbychrist

1
ต้องการ
อัปโหลด

219

นี่คือบางส่วนที่ฉันสามารถคิดเกี่ยวกับ:

  • ด้วยbindParamคุณสามารถส่งผ่านตัวแปรเท่านั้น ไม่ใช่ค่า
  • ด้วยbindValueคุณสามารถส่งผ่านทั้งสองอย่าง (ค่าชัดและตัวแปร)
  • bindParamทำงานเฉพาะกับตัวแปรเพราะอนุญาตให้พารามิเตอร์ให้เป็นอินพุต / เอาต์พุตโดย "การอ้างอิง" (และค่าไม่ใช่การอ้างอิง "ที่ถูกต้อง" ใน PHP) : มันมีประโยชน์กับไดรเวอร์ที่ (อ้างถึงคู่มือ):

สนับสนุนการเรียกใช้โพรซีเดอร์ที่เก็บที่ส่งคืนข้อมูลเป็นพารามิเตอร์เอาต์พุตและบางส่วนเป็นพารามิเตอร์อินพุต / เอาต์พุตที่ส่งข้อมูลทั้งคู่และได้รับการอัปเดตเพื่อรับ

ด้วยเอ็นจิ้น DB บางตัวโพรซีเดอร์ที่เก็บสามารถมีพารามิเตอร์ที่สามารถใช้สำหรับอินพุตทั้งสอง (ให้ค่าจาก PHP ไปยังโพรซีเดอร์) และ ouput (ส่งคืนค่าจาก proc ที่เก็บไว้ไปยัง PHP); ในการผูกพารามิเตอร์เหล่านั้นคุณต้องใช้ bindParam ไม่ใช่ bindValue


@PascalMartin สิ่งที่ฉันอยากรู้คุณสามารถผูกค่ากับ bindParam ได้ไหม ไชโย
yehuda

1
ฉันยังไม่รู้ว่าหมายถึงอะไรตัวแปรคืออะไรและมีคุณค่าอย่างไร ฉันใช้ bindParam เพื่อผูกค่ากับตัวยึดตำแหน่งและด้วย bindValue ฉันสามารถทำเช่นเดียวกัน! - ในตัวอย่างของฉันอย่างน้อย ...
Richard

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: ตัวแปร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.