2011-01-08 31 views
7

ho trovato questo in alcuni esempi di codice, mentre googling:Cosa significa?

$sql = 'INSERT INTO users (username,passwordHash) VALUES (?,?)'; 

è nuovo per me, ma direi che è un metodo di sostituzione ed equivalente a

$sql = "INSERT INTO users (username,passwordHash) VALUES ($username,$passwordHash)";` 

o

$sql = 'INSERT INTO users (username,passwordHash) VALUES (' . $username . ',' . $passwordHash . ')';` 

sarebbe corretto? È una vera sintassi PHP o stava solo cercando di semplificare il suo esempio?


Grazie per il feedback, gente

risposta

12

questo è abbastanza comune in prepared statements. Il ? serve solo come segnaposto, come si è visto al di sotto della documentazione di 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(); 
+6

Inoltre, raramente c'è bisogno dell'elegante lista '-> bindParam'. Si può semplicemente spingere tutti i parametri con la chiamata '-> execute (array ($ name, $ value)'. – mario

2

non è lo stesso. i punti interrogativi vengono utilizzati per le richieste di istruzioni preparate. questi in pratica consentono di eseguire la stessa query più volte mentre solo il sistema analizza la query una sola volta.

4

I punti interrogativi sono segnaposto per i valori nelle istruzioni SQL preparate e rappresentano un'importante protezione contro SQL Injection Attacks. La tua prima alternativa non funzionerebbe correttamente a meno che ogni utente non citi il ​​loro nome tra virgolette * e tu includa l'hash della password tra virgolette. La tua seconda alternativa è vulnerabile agli attacchi SQL Injection.

Con i segnaposto, si passano i valori per i segnaposto quando si esegue l'SQL.

* E Tim O'Reilly sa che deve digitare "'Tim O''Reilly'".