Sự khác biệt giữa PDOStatement::bindParam()
và là PDOStatement::bindValue()
gì?
Sự khác biệt giữa PDOStatement::bindParam()
và là PDOStatement::bindValue()
gì?
Câu trả lời:
Câu trả lời là trong tài liệu cho bindParam
:
Không giống như PDOStatement :: bindValue (), biến được ràng buộc như một tham chiếu và sẽ chỉ được đánh giá tại thời điểm PDOStatement :: exec () được gọi.
Và execute
gọi PDOStatement :: bindParam () để liên kết các biến PHP với các dấu tham số: các biến bị ràng buộc chuyển giá trị của chúng làm đầu vào và nhận giá trị đầu ra, nếu có, của các dấu tham số liên quan của chúng
Thí dụ:
$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'
hoặc là
$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'
Từ mục nhập thủ công choPDOStatement::bindParam
:
[Với
bindParam
] Không giống nhưPDOStatement::bindValue()
, biến được ràng buộc như một tham chiếu và sẽ chỉ được đánh giá tại thời điểmPDOStatement::execute()
được gọi.
Ví dụ:
$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'
hoặc là
$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
bạn cần phải liên kết lại dữ liệu mỗi lần. Với bindParam
bạn chỉ cần cập nhật biến. Lý do chính để sử dụng bindValue
sẽ là dữ liệu tĩnh, ví dụ: chuỗi hoặc số bằng chữ.
Đây là một số tôi có thể nghĩ về:
bindParam
, bạn chỉ có thể truyền các biến; không phải giá trịbindValue
, bạn có thể chuyển cả hai (giá trị, rõ ràng và biến)bindParam
chỉ hoạt động với các biến vì nó cho phép các tham số được đưa ra làm đầu vào / đầu ra, bởi "tham chiếu" (và một giá trị không phải là "tham chiếu" hợp lệ trong PHP) : rất hữu ích với các trình điều khiển (trích dẫn thủ công):hỗ trợ việc gọi các thủ tục được lưu trữ trả về dữ liệu dưới dạng tham số đầu ra và một số cũng là tham số đầu vào / đầu ra vừa gửi dữ liệu và được cập nhật để nhận dữ liệu.
Với một số công cụ DB, các thủ tục được lưu trữ có thể có các tham số có thể được sử dụng cho cả hai đầu vào (đưa ra một giá trị từ PHP cho thủ tục) và ouput (trả về một giá trị từ Proc được lưu trữ cho PHP); để liên kết các tham số đó, bạn phải sử dụng bindParam chứ không phải bindValue.
Từ các báo cáo đã chuẩn bị và các thủ tục được lưu trữ
Sử dụng bindParam
để chèn nhiều hàng với ràng buộc một lần:
<?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();
Đối với mục đích phổ biến nhất, bạn nên sử dụng bindValue
.
bindParam
có hai hành vi khó khăn hoặc bất ngờ:
bindParam(':foo', 4, PDO::PARAM_INT)
không hoạt động, vì nó yêu cầu chuyển một biến (như tham chiếu).bindParam(':foo', $value, PDO::PARAM_INT)
sẽ thay đổi $value
thành chuỗi sau khi chạy execute()
. Điều này, tất nhiên, có thể dẫn đến các lỗi tinh vi có thể khó bắt.Nguồn: http://php.net/manual/en/pdostatement.bindparam.php#94711