2009-08-07 14 views
9

Questa è una domanda simile a questa "When not to use Prepared statements?", ma con la parte "how-to" e PostgreSQL.Per utilizzare le istruzioni preparate da PHP per Postgres

So che ho bisogno di istruzioni preparate perché faccio più di una chiamata al mio database durante uno script.

Mi piacerebbe avere esempi concreti circa la following sentence

Guardate fusione di caratteri, convalidare e sanificazione variabili e utilizzando DOP con istruzioni preparate.

So cosa vuol dire convalidare e disinfettare le variabili. Tuttavia, non sono completamente sicuro delle dichiarazioni preparate. Come prepariamo le dichiarazioni? Dai filtri, cioè sanificando? O da qualche strato DOP? Qual è la definizione del livello?

Cosa significano le dichiarazioni preparate nella dichiarazione? Per favore, usa esempi concreti.

+0

Grazie per le vostre risposte! –

risposta

5

Cosa significano le istruzioni preparate in dichiarazione?

Dal documentation:

Questa caratteristica permette di comandi che verranno utilizzati ripetutamente per essere analizzate e programmate solo una volta, anziché ogni volta che vengono eseguiti.

Vedi pg_prepare

Esempio dalla pagina collegata sopra:

<?php 
// Connect to a database named "mary" 
$dbconn = pg_connect("dbname=mary"); 

// Prepare a query for execution 
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1'); 

// Execute the prepared query. Note that it is not necessary to escape 
// the string "Joe's Widgets" in any way 
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets")); 

// Execute the same prepared query, this time with a different parameter 
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes")); 
?> 

Il MySQL documentation for Prepared Statements ben risponde alle seguenti domande:

  • Perché utilizzare le dichiarazioni preparate?
  • Quando utilizzare le istruzioni preparate?
+0

I tuoi esempi hanno le stesse funzionalità di Robot? Sono molto più chiari per me di quelli di Robot. Sembra che usi molti array che li rendono difficili da leggere per me. –

+1

@Masi: gli esempi forniti provengono dalla pagina del documento pg_prepare. Sono più facili da seguire, ma direi che gli esempi di @Glass Robot sono più reali (ad esempio, marcatori denominati). Ti suggerisco di sporcarti le mani il prima possibile. Non esiste un "esempio per domarli tutti". – karim79

+1

La risposta non utilizza PDO. Questo mi suggerisce che puoi usare istruzioni preparate senza PDO. La PDO sembra offrire solo l'indipendenza del database. –

0

Come ci prepariamo dichiarazioni:

si definisce una query una sola volta, e possono chiamato tutte le volte che ti piace con valori diversi.

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1'); 
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets")); 
$result = pg_execute($dbconn, "my_query", array("row two")); 
$result = pg_execute($dbconn, "my_query", array("row three")); 

See (ad esempio in un ciclo.): http://us2.php.net/manual/en/function.pg-execute.php

6

Significa che consente di prevenire gli attacchi di SQL injection eliminando la necessità di citare manualmente i parametri.

Invece di inserire una variabile in sql, si usa un marcatore con nome o punto interrogativo per il quale i valori reali saranno sostituiti quando l'istruzione viene eseguita.

Definizione PDO dal manuale di PHP:
'The PHP Data Objects (PDO) estensione definisce un peso leggero interfaccia coerente per l'accesso ai database in PHP.'

Vedere il manuale php su PDO e PDO::prepare.

Un esempio di una dichiarazione preparata con gli indicatori di nome:

<?php 
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432'); 

$sql = "SELECT username, password 
FROM users 
WHERE username = :username 
AND password = :pass"; 

$sth = $pdo->prepare($sql); 
$sth->execute(array(':username' => $_POST['username'], ':pass' => $_POST['password'])); 
$result = $sth->fetchAll(); 

Un esempio di una dichiarazione preparata con i marcatori punto interrogativo:

<?php 
$pdo = new PDO('pgsql:dbname=example;user=me;password=pass;host=localhost;port=5432'); 

$sql = "SELECT username, password 
FROM users 
WHERE username = ? 
AND password = ?"; 

$sth = $pdo->prepare($sql); 
$sth->execute(array($_POST['username'], $_POST['password'])); 
$result = $sth->fetchAll(); 
+0

I tuoi comandi sembrano selezionare il colonne nome utente e password dagli utenti della tabella quando, ad esempio, username = a e password = a. Questo mi suggerisce che il codice non è pratico nella vita reale perché non ha senso selezionare i due nomi di colonna quando li conosci già. Tuttavia, se selezioni la terza colonna in base alle due, la tua strada sembra funzionare. Sembra che gli input dell'utente siano elaborati in modo tale che un errore/incidente nell'esecuzione delle query con l'input dell'utente non cambi i dati originali, quindi nessuna iniezione SQL: ad esempio, interrompi se fallisce nel preparare ... –

0

risposta alla risposta di Karim79

Questo

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = $1'); 

sembra essere lo stesso di questo

$result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users WHERE email = ?'); 

Conclusione: l'uso di pg_prepare e pg_execute rende PHP molto più efficiente, dal momento che non è necessario prendere in considerazione sanificazione. Ti aiuta anche nell'uso di PDO.

Problemi correlati