ความแตกต่างระหว่าง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:
ตัวแปร