Apa perbedaan antara bindParam dan bindValue?

Jawaban:

190

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'
pelakon
sumber
667

Dari entri manual untukPDOStatement::bindParam :

[Dengan bindParam] Tidak seperti itu PDOStatement::bindValue(), variabel terikat sebagai referensi dan hanya akan dievaluasi pada saat itu PDOStatement::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'
lonesomeday
sumber
9
Cemerlang, terima kasih! Pertanyaan - mengapa Anda ingin menggunakan yang satu? Seperti kapan akan berguna atau perlu untuk memiliki parameter bind dievaluasi hanya pada waktu execute ()?
Coldblackice
32
@ Coldblackice Jika Anda menjalankan kueri beberapa kali dengan data yang berbeda. Dengan bindValueAnda harus mengikat kembali data setiap kali. Dengan bindParamAnda hanya perlu memperbarui variabel. Alasan utama untuk menggunakan bindValuedata statis, misalnya string atau angka literal.
lonesomeday
1
Misalnya, Anda ingin menggunakan bindValue dengan nilai pengembalian fungsi: $ stmt-> bindValue (': status', strtolower ($ status), PDO :: PARAM_STR);
paidforbychrist
1
ingin membesarkan hati, tetapi karena itu adalah 666, saya akan meninggalkannya
eddy147
219

Inilah beberapa yang dapat saya pikirkan:

  • Dengan bindParam, Anda hanya dapat meneruskan variabel; bukan nilai
  • dengan bindValue, Anda bisa melewati keduanya (nilai, jelas, dan variabel)
  • bindParamhanya 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.

Pascal MARTIN
sumber
@ PascalMartin Hanya apa yang ingin saya ketahui, dapatkah Anda mengikat nilai dengan bindParam. Bersulang.
yehuda
1
Saya masih tidak tahu apa artinya sebenarnya, apa sebenarnya variabel dan apa nilainya. Saya menggunakan bindParam untuk mengikat nilai ke placeholder dan dengan bindValue saya bisa melakukan hal yang sama! - dalam contoh saya setidaknya ...
Richard
29

Dari pernyataan Disiapkan dan prosedur tersimpan

Gunakan bindParamuntuk 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();
Nezar Fadle
sumber
27

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 $valuemenjadi 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

Denilson Sa Maia
sumber
4

Anda tidak perlu berjuang lagi, ketika ada cara lilke ini:

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

Cara termudah untuk menempatkan ini dalam perspektif untuk menghafal oleh perilaku (dalam hal PHP):

  • bindParam: referensi
  • bindValue: variabel
tfont
sumber