Qual è la differenza tra BindParam e bindValue?
Domanda
Qual è la differenza tra PDOStatement::bindParam()
e PDOStatement::bindValue()
?
Soluzione
La risposta è nella documentazione per bindParam
:
A differenza PDOStatement :: bindValue (), la variabile è legato come riferimento e sarà valutata soltanto al momento PDOStatement :: execute () è chiamato.
chiamare PDOStatement :: BindParam () per associare variabili PHP agli indicatori di parametro: variabili legate passano il loro valore di ingresso e ricevono il valore di uscita, se del caso, i loro indicatori di parametro 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'
Altri suggerimenti
l'inserimento manuale per PDOStatement::bindParam
:
[Con
bindParam
] DiversamentePDOStatement::bindValue()
, la variabile è vincolata come riferimento e verrà valutata solo nel momento in cui viene chiamatoPDOStatement::execute()
.
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'
Ecco alcuni riesco a pensare:
- Con
bindParam
, è possibile passare solo le variabili; non valori - con
bindValue
, è possibile passare entrambi (valori, ovviamente, e le variabili) -
bindParam
funziona solo con variabili perché permette parametri da fornire in ingresso / uscita, da "riferimento" (e un valore non è un "riferimento" valido per PHP) : è utile con driver che (citando il manuale):
supportare l'invocazione di memorizzata procedure che restituiscono dati come output parametri, e alcuni anche come parametri di ingresso / uscita che sia invia nei dati e sono aggiornati a riceverlo.
Con alcuni motori DB, stored procedure possono avere parametri che possono essere utilizzati sia in ingresso (dando un valore da PHP alla procedura) e output (restituisce un valore proc memorizzato per PHP); di legare questi parametri, hai avuto modo di utilizzare BindParam, e non bindValue.
dichiarazioni preparate e stored procedure
Usa bindParam
per inserire più righe con il legame una volta:
<?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();
Ai fini più comune, è necessario utilizzare bindValue
.
bindParam
ha due comportamenti ingannevoli o imprevisti:
-
bindParam(':foo', 4, PDO::PARAM_INT)
non funziona, in quanto richiede passaggio di una variabile (come riferimento). -
bindParam(':foo', $value, PDO::PARAM_INT)
cambierà$value
a stringa dopo l'esecuzioneexecute()
. Questo, naturalmente, può portare a bug sottili che potrebbero essere difficili da catturare.
Fonte: http://php.net/manual/en/pdostatement.bindparam.php#94711
Non è necessario lottare più a lungo, quando esiste un modo simile a questo:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
Il modo più semplice per mettere questo in prospettiva per la memorizzazione da un comportamento (in termini di PHP):
-
bindParam:
di riferimento -
bindValue:
variabile