PHP DOP istruzioni preparate e stored procedure
Manuale PHP DOP di riferimento
Molti database più maturi supportano il concetto di dichiarazioni preparate.
Che cosa è istruzioni preparate? Pensate a come un modello compilato che si desidera eseguire SQL, che può essere personalizzato utilizzando parametri variabili. istruzioni preparate offrono due vantaggi principali:
- Query solo risolve (o pre-trattamento) una volta, ma può essere eseguito più volte con gli stessi o differenti parametri. Quando la query è pronto, il database sarà analizzare, compilare ed eseguire il piano di ottimizzazione delle query. Per le query complesse, questo processo richiede molto tempo, se hai bisogno di essere ripetuto molte volte con parametri diversi la stessa query, allora il processo ridurrà di molto la velocità dell'applicazione. Usando il evitare di dichiarazione preparata ripetendo analizzare / compilare ciclo / ottimizzare. In breve, preparati dichiarazioni utilizzano meno risorse e quindi più veloci.
- Fornire i parametri per le istruzioni preparate non è necessario utilizzare le virgolette, il driver sarà gestito automaticamente. Se l'applicazione utilizza solo le istruzioni preparate, siamo in grado di garantire che nessun tipo SQL injection. (Tuttavia, se altre parti della query non venga neutralizzato dall'ingresso di costruire, allora vi è ancora il rischio di iniezione SQL).
istruzioni preparate così utile che si presentano solo la elaborazione analogica quando il conducente non supporta la DOP. Ciò assicura che, indipendentemente dal fatto che il database ha una funzione, è possibile garantire che le applicazioni possono utilizzare gli stessi modelli di accesso ai dati.
PreparedStatements ripetuto inserimento
Il seguente esempio sostituendo il nome segnaposto appropriata con il nome e il valore per eseguire una query di inserimento
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
PreparedStatements ripetuto inserimento
Il seguente esempio sostituendo nome e il valore? Segnaposto per eseguire una query di inserimento.
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
Ottenere i dati utilizzando le istruzioni preparate
Il seguente esempio sotto forma di accesso basata su chiave ai dati già disponibile. L'input dell'utente è racchiuso automaticamente tra virgolette, quindi non c'è rischio di attacchi di SQL injection.
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?>
Se il supporto driver di database, applicazione può anche legare parametri di ingresso e di uscita parametri di output sono tipicamente utilizzati per ottenere i valori dalla stored procedure. Parametri di uscita da usare rispetto parametri di input per essere un po 'più complicato, perché quando l'associazione di un parametro di output, è necessario conoscere i parametri di una data lunghezza. Se il valore del parametro è superiore alle raccomandazioni vincolanti della lunghezza, si genera un errore.
Chiamata di una stored procedure con un parametro di output
<?php $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $return_value\n"; ?>
È inoltre possibile specificare sia valori di ingresso e di uscita dei parametri, la sintassi è simile a parametri di output. Nel prossimo esempio, la stringa "ciao" è passato alla stored procedure quando i rendimenti stored procedure, ciao viene sostituito con il valore di ritorno della stored procedure.
Con l'input / output per i parametri di chiamare una stored procedure
<?php $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $value\n"; ?>
Utilizzo non valido di segnaposto
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'"); $stmt->execute(array($_GET['name'])); // 占位符必须被用在整个值的位置 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?"); $stmt->execute(array("%$_GET[name]%")); ?>