Qual è la differenza tra PDOStatement::bindParam()
e PDOStatement::bindValue()
?
Qual è la differenza tra PDOStatement::bindParam()
e PDOStatement::bindValue()
?
Risposte:
La risposta è nella documentazione per bindParam
:
A differenza di PDOStatement :: bindValue (), la variabile è associata come riferimento e verrà valutata solo nel momento in cui viene chiamato PDOStatement :: execute ().
E execute
chiama PDOStatement :: bindParam () per associare le variabili PHP ai marker dei parametri: le variabili associate passano il loro valore come input e ricevono l'eventuale valore di output dei loro marker dei parametri associati
Esempio:
$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'
o
$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'
Dalla voce manuale perPDOStatement::bindParam
:
[Con
bindParam
] A differenzaPDOStatement::bindValue()
della variabile, la variabile è associata come riferimento e verrà valutata solo al momento dellaPDOStatement::execute()
chiamata.
Quindi, per esempio:
$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'
o
$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
avresti bisogno di ri-associare i dati ogni volta. Con bindParam
avresti solo bisogno di aggiornare la variabile. Il motivo principale per l'utilizzo bindValue
sarebbe dato dai dati statici, ad esempio stringhe o numeri letterali.
Eccone alcuni a cui posso pensare:
bindParam
, puoi solo passare variabili; non valoribindValue
, puoi passare entrambi (valori, ovviamente e variabili)bindParam
funziona solo con variabili perché consente di fornire parametri come input / output, tramite "riferimento" (e un valore non è un "riferimento" valido in PHP) : è utile con i driver che (citando il manuale):supportare l'invocazione di stored procedure che restituiscono i dati come parametri di output e alcuni anche come parametri di input / output che inviano i dati e vengono aggiornati per riceverli.
Con alcuni motori DB, le procedure memorizzate possono avere parametri che possono essere utilizzati sia per l'input (dando un valore da PHP alla procedura) sia per l'outut (restituendo un valore dal proc memorizzato a PHP); per associare quei parametri, devi usare bindParam e non bindValue.
Da dichiarazioni preparate e procedure memorizzate
Utilizzare bindParam
per inserire più righe con un'associazione unica:
<?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();
Per lo scopo più comune, è necessario utilizzare bindValue
.
bindParam
ha due comportamenti difficili o inaspettati:
bindParam(':foo', 4, PDO::PARAM_INT)
non funziona, poiché richiede il passaggio di una variabile (come riferimento).bindParam(':foo', $value, PDO::PARAM_INT)
cambierà $value
in stringa dopo l'esecuzione execute()
. Questo, naturalmente, può portare a bug sottili che potrebbero essere difficili da rilevare.Fonte: http://php.net/manual/en/pdostatement.bindparam.php#94711
Non devi più lottare, quando esiste un modo come questo:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);