Apa perbedaan antara PDOStatement::bindParam()
dan PDOStatement::bindValue()
?
378
Apa perbedaan antara PDOStatement::bindParam()
dan PDOStatement::bindValue()
?
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. DenganbindParam
Anda hanya perlu memperbarui variabel. Alasan utama untuk menggunakanbindValue
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):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.
sumber
Dari pernyataan Disiapkan dan prosedur tersimpan
Gunakan
bindParam
untuk menyisipkan banyak baris dengan satu kali penjilidan:sumber
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 dijalankanexecute()
. Ini, tentu saja, dapat menyebabkan bug halus yang mungkin sulit ditangkap.Sumber: http://php.net/manual/en/pdostatement.bindparam.php#94711
sumber
Anda tidak perlu berjuang lagi, ketika ada cara lilke ini:
sumber
Cara termudah untuk menempatkan ini dalam perspektif untuk menghafal oleh perilaku (dalam hal PHP):
bindParam:
referensibindValue:
variabelsumber