ความแตกต่างระหว่างPDOStatement::bindParam()และPDOStatement::bindValue()คืออะไร?
ความแตกต่างระหว่างPDOStatement::bindParam()และPDOStatement::bindValue()คืออะไร?
คำตอบ:
คำตอบอยู่ในเอกสารประกอบสำหรับ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'
จากรายการคู่มือสำหรับ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) : มันมีประโยชน์กับไดรเวอร์ที่ (อ้างถึงคู่มือ):สนับสนุนการเรียกใช้โพรซีเดอร์ที่เก็บที่ส่งคืนข้อมูลเป็นพารามิเตอร์เอาต์พุตและบางส่วนเป็นพารามิเตอร์อินพุต / เอาต์พุตที่ส่งข้อมูลทั้งคู่และได้รับการอัปเดตเพื่อรับ
ด้วยเอ็นจิ้น DB บางตัวโพรซีเดอร์ที่เก็บสามารถมีพารามิเตอร์ที่สามารถใช้สำหรับอินพุตทั้งสอง (ให้ค่าจาก PHP ไปยังโพรซีเดอร์) และ ouput (ส่งคืนค่าจาก proc ที่เก็บไว้ไปยัง 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]);
วิธีที่ง่ายที่สุดในการทำให้มุมมองสำหรับการท่องจำตามพฤติกรรม (ในแง่ของ PHP):
bindParam: การอ้างอิงbindValue: ตัวแปร