Apa perbedaan antara PDOStatement::bindParam()
dan PDOStatement::bindValue()
?
Apa perbedaan antara PDOStatement::bindParam()
dan PDOStatement::bindValue()
?
Jawaban:
Jawabannya ada dalam dokumentasi untuk bindParam
:
Tidak seperti PDOStatement :: bindValue (), variabel terikat sebagai referensi dan hanya akan dievaluasi pada saat PDOStatement :: execute () dipanggil.
Dan execute
panggil PDOStatement :: bindParam () untuk mengikat variabel PHP ke penanda parameter: variabel terikat meneruskan nilainya sebagai input dan menerima nilai output, jika ada, dari penanda parameter terkait
Contoh:
$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'
atau
$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'
Dari entri manual untukPDOStatement::bindParam
:
[Dengan
bindParam
] Tidak seperti ituPDOStatement::bindValue()
, variabel terikat sebagai referensi dan hanya akan dievaluasi pada saat ituPDOStatement::execute()
disebut.
Jadi, misalnya:
$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'
atau
$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
Anda harus mengikat kembali data setiap kali. Dengan bindParam
Anda hanya perlu memperbarui variabel. Alasan utama untuk menggunakan bindValue
data statis, misalnya string atau angka literal.
Inilah beberapa yang dapat saya pikirkan:
bindParam
, Anda hanya dapat meneruskan variabel; bukan nilaibindValue
, Anda bisa melewati keduanya (nilai, jelas, dan variabel)bindParam
hanya bekerja dengan variabel karena memungkinkan parameter diberikan sebagai input / output, dengan "referensi" (dan nilainya bukan "referensi" yang valid dalam PHP) : ini berguna untuk driver yang (mengutip manual):mendukung permintaan prosedur tersimpan yang mengembalikan data sebagai parameter output, dan beberapa juga sebagai parameter input / output yang sama-sama mengirimkan data dan diperbarui untuk menerimanya.
Dengan beberapa mesin DB, prosedur tersimpan dapat memiliki parameter yang dapat digunakan untuk input (memberikan nilai dari PHP ke prosedur) dan ouput (mengembalikan nilai dari proc yang disimpan ke PHP); untuk mengikat parameter tersebut, Anda harus menggunakan bindParam, dan bukan bindValue.
Dari pernyataan Disiapkan dan prosedur tersimpan
Gunakan bindParam
untuk menyisipkan banyak baris dengan satu kali penjilidan:
<?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();
Untuk tujuan paling umum, Anda harus menggunakan bindValue
.
bindParam
memiliki dua perilaku rumit atau tidak terduga:
bindParam(':foo', 4, PDO::PARAM_INT)
tidak berfungsi, karena ini membutuhkan melewati variabel (sebagai referensi).bindParam(':foo', $value, PDO::PARAM_INT)
akan berubah $value
menjadi string setelah dijalankan execute()
. Ini, tentu saja, dapat menyebabkan bug halus yang mungkin sulit ditangkap.Sumber: http://php.net/manual/en/pdostatement.bindparam.php#94711
Anda tidak perlu berjuang lagi, ketika ada cara lilke ini:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);