BindParam ve bindValue arasındaki fark nedir?


Yanıtlar:


190

Cevap aşağıdaki belgelerde bulunmaktadır bindParam:

PDOStatement :: bindValue () öğesinin aksine, değişken bir başvuru olarak bağlanır ve yalnızca PDOStatement :: execute () çağrıldığında değerlendirilir.

Ve execute

PHP değişkenlerini parametre işaretleyicilerine bağlamak için PDOStatement :: bindParam () yöntemini çağırın: bağlı değişkenler değerlerini girdi olarak iletir ve varsa ilişkili parametre işaretleyicilerinin çıktı değerini alır

Misal:

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

veya

$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

İçin manuel giriştenPDOStatement::bindParam :

Bunun bindParamaksine PDOStatement::bindValue(), değişken bir referans olarak bağlanır ve yalnızca PDOStatement::execute()çağrılan zamanda değerlendirilir .

Yani mesela:

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

veya

$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
Harika, teşekkürler! Soru - neden birini diğerinin üzerinde kullanmak isteyebilirsiniz? Bind parametresinin yalnızca execute () zamanında değerlendirilmesinin ne zaman faydalı veya gerekli olduğu gibi?
Coldblackice

32
@Coldblackice Sorguyu farklı verilerle birden çok kez yürütüyorsanız. Bununla birlikte bindValue, verileri her seferinde yeniden bağlamanız gerekir. İle bindParamsize sadece değişkeni güncellemeniz gerekiyordu. Kullanmanın ana nedeni bindValue, sabit dizeler veya sayılar gibi statik veriler olacaktır.
lonesomeday

1
Örneğin, işlev döndürme değerleriyle bindValue kullanmak istiyorsunuz: $ stmt-> bindValue (': status', strtolower ($ status), PDO :: PARAM_STR);
paidforbychrist

1
oy vermek istedim, ama 666 olduğu için bırakacağım
eddy147

219

Düşünebileceğim bazı şeyler:

  • İle bindParamyalnızca değişkenleri iletebilirsiniz; değerler değil
  • ile bindValueher ikisini de aktarabilirsiniz (değerler, açıkça ve değişkenler)
  • bindParamparametrelerin "başvuru" ile giriş / çıkış olarak verilmesine izin verdiği için yalnızca değişkenlerle çalışır (ve değer PHP'de geçerli bir "başvuru" değildir) : (kılavuzdan alıntı yaparak):

verileri çıktı parametresi olarak döndüren saklı yordamların çağrılmasını ve bazılarını hem veri gönderen hem de almak üzere güncellenen girdi / çıktı parametreleri olarak destekler.

Bazı DB motorlarında, saklı yordamlar hem girdi (PHP'den yordama bir değer vererek) hem de çıkış (depolanan proc'dan PHP'ye bir değer döndürerek) için kullanılabilecek parametrelere sahip olabilir; bu parametreleri bağlamak için bindValue değil bindParam kullanmanız gerekir.


@PascalMartin Bilmek istediğim, değerleri bindParam ile bağlayabilir misin? Şerefe.
yehuda

1
Hala bunun ne anlama geldiğini, değişkenlerin tam olarak ne olduğunu ve değerlerin ne olduğunu bilmiyorum. Bir değeri bir yer tutucusuna bağlamak için bindParam kullanıyorum ve bindValue ile aynı şeyi yapabilirim! - en azından benim
Richard

29

Gönderen Hazırlanan tablolar ve saklı yordamlar

bindParamTek seferlik ciltlemeyle birden çok satır eklemek için kullanı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

En yaygın amaç için kullanmalısınız bindValue.

bindParam iki zor veya beklenmedik davranışa sahiptir:

  • bindParam(':foo', 4, PDO::PARAM_INT) (referans olarak) bir değişken geçirmeyi gerektirdiği için çalışmaz.
  • bindParam(':foo', $value, PDO::PARAM_INT)$valueçalıştırdıktan sonra dizeye değişecektir execute(). Bu, elbette, yakalanması zor olabilecek ince hatalara yol açabilir.

Kaynak: http://php.net/manual/en/pdostatement.bindparam.php#94711


4

Artık bunu yapmanın bir yolu olduğunda, artık mücadele etmek zorunda değilsin:

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

4

Bunu davranışla ezberlemek için perspektif haline getirmenin en basit yolu (PHP açısından):

  • bindParam: referans
  • bindValue: değişken
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.