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
bindParamaksinePDOStatement::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 bindParamsize 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:
bindParamyalnızca değişkenleri iletebilirsiniz; değerler değilbindValueher 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.
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();
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]);