Arasındaki fark nedir PDOStatement::bindParam()
ve PDOStatement::bindValue()
?
Arasındaki fark nedir PDOStatement::bindParam()
ve PDOStatement::bindValue()
?
Yanıtlar:
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'
İçin manuel giriştenPDOStatement::bindParam
:
Bunun
bindParam
aksinePDOStatement::bindValue()
, değişken bir referans olarak bağlanır ve yalnızcaPDOStatement::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'
bindValue
, verileri her seferinde yeniden bağlamanız gerekir. İle bindParam
size sadece değişkeni güncellemeniz gerekiyordu. Kullanmanın ana nedeni bindValue
, sabit dizeler veya sayılar gibi statik veriler olacaktır.
Düşünebileceğim bazı şeyler:
bindParam
yalnızca değişkenleri iletebilirsiniz; değerler değilbindValue
her ikisini de aktarabilirsiniz (değerler, açıkça ve değişkenler)bindParam
parametrelerin "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.
Gönderen Hazırlanan tablolar ve saklı yordamlar
bindParam
Tek 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();
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
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]);