Qual è la differenza tra bindParam e bindValue?


Risposte:


190

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'

667

Dalla voce manuale perPDOStatement::bindParam :

[Con bindParam] A differenza PDOStatement::bindValue()della variabile, la variabile è associata come riferimento e verrà valutata solo al momento della PDOStatement::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'

9
Fantastico, grazie! Domanda: perché dovresti voler usare l'uno sull'altro? Come quando sarebbe utile o necessario avere il parametro bind valutato solo al momento di execute ()?
Coldblackice,

32
@Coldblackice Se si eseguiva la query più volte con dati diversi. Con bindValueavresti bisogno di ri-associare i dati ogni volta. Con bindParamavresti solo bisogno di aggiornare la variabile. Il motivo principale per l'utilizzo bindValuesarebbe dato dai dati statici, ad esempio stringhe o numeri letterali.
lunedì

1
Ad esempio, si desidera utilizzare bindValue con i valori restituiti dalla funzione: $ stmt-> bindValue (': status', strtolower ($ status), PDO :: PARAM_STR);
paidforbychrist,

1
volevo votare, ma poiché è il 666, lo lascerò
eddy147 il

219

Eccone alcuni a cui posso pensare:

  • Con bindParam, puoi solo passare variabili; non valori
  • con bindValue, puoi passare entrambi (valori, ovviamente e variabili)
  • bindParamfunziona 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.


@PascalMartin Proprio quello che volevo sapere, puoi legare i valori con bindParam. Saluti.
yehuda,

1
Non ho ancora idea di cosa significhi esattamente, quali sono esattamente le variabili e quali sono i valori. Uso bindParam per associare un valore a un segnaposto e con bindValue posso fare lo stesso! - almeno nel mio esempio ...
Richard

29

Da dichiarazioni preparate e procedure memorizzate

Utilizzare bindParamper 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();

27

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à $valuein 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


4

Non devi più lottare, quando esiste un modo come questo:

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

4

Il modo più semplice di metterlo in prospettiva per la memorizzazione in base al comportamento (in termini di PHP):

  • bindParam: riferimento
  • bindValue: variabile
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.