Domanda

È stato utile?

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.

execute

  

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] Diversamente PDOStatement::bindValue(), la variabile è vincolata come riferimento e verrà valutata solo nel momento in cui viene chiamato PDOStatement::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'esecuzione execute(). 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top