Sự khác biệt giữa bindParam và bindValue là gì?


Câu trả lời:


190

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.

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'

667

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ểm PDOStatement::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'

9
Rực rỡ, cảm ơn! Câu hỏi - tại sao bạn có thể muốn sử dụng cái này hơn cái kia? Giống như khi nào sẽ hữu ích hoặc cần thiết để tham số liên kết chỉ được đánh giá tại thời gian thực hiện ()?
Coldblackice

32
@Coldblackice Nếu bạn đang thực hiện truy vấn nhiều lần với các dữ liệu khác nhau. Với bindValuebạn cần phải liên kết lại dữ liệu mỗi lần. Với bindParambạn chỉ cần cập nhật biến. Lý do chính để sử dụng bindValuesẽ là dữ liệu tĩnh, ví dụ: chuỗi hoặc số bằng chữ.
cô đơn

1
Ví dụ: bạn muốn sử dụng bindValue với các giá trị trả về hàm: $ stmt-> bindValue (': status', strtolower ($ status), PDO :: PARAM_STR);
payforbychrist

1
muốn upvote, nhưng vì nó là 666, tôi sẽ rời khỏi nó
eddy147

219

Đây là một số tôi có thể nghĩ về:

  • Với bindParam, bạn chỉ có thể truyền các biến; không phải giá trị
  • với bindValue, bạn có thể chuyển cả hai (giá trị, rõ ràng và biến)
  • bindParamchỉ 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.


@PascalMartin Chỉ cần những gì tôi muốn biết, bạn có thể liên kết các giá trị với bindParam không. Chúc mừng.
yehuda

1
Tôi vẫn không biết chính xác điều đó có nghĩa là gì, chính xác các biến là gì và các giá trị là gì. Tôi sử dụng bindParam để liên kết một giá trị với một trình giữ chỗ và với bindValue tôi có thể làm như vậy! - trong ví dụ của tôi ít nhất ...
Richard

29

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

27

Đố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 $valuethà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


4

Bạn không phải vật lộn nữa, khi có một cách lilke này:

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

4

Cách đơn giản nhất để đưa điều này vào viễn cảnh để ghi nhớ theo hành vi (về mặt PHP):

  • bindParam: tài liệu tham khảo
  • bindValue: Biến đổi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.