query con PDO

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.044
150
63
PR
www.borgo-italia.it
ciao
usando il classico metodo della query per renderla dinamica si puo fare es
PHP:
<?php
//...
$wh="";
if($nome !=""){
	$wh =" AND nome='$nome' ";
}
$ris=mysql_query("SELECT * FROM mia_tab WHERE 1=1 $wh");
//...
?>
utilizzando le PDO
così
PHP:
<?php
//....
$stm = $pdo->query("SELECT * FROM mappe WHERE 1=1 $wh");
//...
?>
oppure
PHP:
<?php
//...
$stm = $pdo->prepare("SELECT * FROM mappe WHERE 1=1 ?");
$stm->execute($wh);
//...
?>
analogo discorso per le altre eventuali clausole della query es
PHP:
<?php
//....
$stm = $pdo->query("SELECT * FROM mappe WHERE 1=1 $wh ORDER BY $nome_campo");
//...
?>
oppure
PHP:
<?php
//...
$stm = $pdo->prepare("SELECT * FROM mappe WHERE 1=1 ? ORDER BY ?");
$stm->execute($wh, $nome_campo);
//...
?>
 
I prepared statements servono a due cose:
  1. Ti consentono di passare valori provenienti dall'input in tutta sicurezza.
  2. Velocizzano l'esecuzione di query simili, perché parte dei dati viene riutilizzata.
Nel tuo caso nessuno degli esempi funzionerà perché PDO metterà automaticamente gli apici singoli attorno alla clausola WHERE o ORDER BY, trattandolo come un dato in input. Puoi usare quella tecnica solamente per i campi.

Io avrei fatto qualcosa simile a questo:
PHP:
$wh = '';
$params = array();

if ($nome != '') {
    $wh .= ' AND nome = :nome';
    $params[':nome'] = $nome;
}

// sia $pdo un'istanza di PDO

$stm = $pdo->prepare("SELECT * FROM tabella WHERE 1 = 1{$wh}";
$stm->execute($params);

print_r($stm->fetchAll(PDO::FETCH_ASSOC));
Come vedi qui i parametri hanno un nome, anche se puoi benissimo usare il punto interrogativo finché sono in ordine. Usare il nome è anche utile in fase di debug (se una query va male puoi vedere subito i valori dei vari parametri senza andarli a contare).
 
ciao
l'ho letto, ma sei sicuro che l'autore sia affidabile? :rolleyes:

comunque per iniziare va benissimo, ma secondo me il SOMMO e/o il vampiro potrebbero preparare un articolo (tabella comparativa) con le corrispondenze tra le "vecchie" istruzioni e quelle pdo (!!!non in ostrogoto, ma nel linguaggio di dante).
es.
$ci_sono=mysql_num_rows($query)
la pdo ?
ecc...

poi ti faccio un es. dopo aver letto dello stesso autore le istru alla phpmailer, l'ho scaricata (fatta copia di bck) e aperta, pian piano mi sono letto tutte le istruzioni capendo (sin dove sono potuto arrivare col mio infimo q.i.) cosa e come poteva fare, ma con la pdo non mi sembra di poterlo fare (non esiste pdo.php, immagino)
 
Credo che dovrai fare pace con l'Inglese: molta documentazione (non parlo di PDO in particolare, magari la versione in Italiano c'è anche) si trova solo in questa lingua, specialmente quando si tratta di progetti nuovi. :p
In ogni caso, i nomi delle funzioni sono piuttosto auto-descrittivi. Devi solo stare attento a distinguere tra i metodi della classe PDO e quelli di PDOStatement.
 
Con borgo al massimo si deve linkare documentazione in dialetto :book:
 
es.
$ci_sono=mysql_num_rows($query)
la pdo ?

Ci sarebbe PDOStatement::rowCount(), ma ora ti rivelo una cosa, PDO è ottima come alternativa alla libreria MySQL ma in quanto ad astrazione non è un granché, il metodo rowCount() per esempio non funziona con alcuni DBMS.
Per cui consiglio sempre di passare SELECT COUNT(*) a PDO::query() + fetchColumn() per simulare mysql_num_rows().

Ad esempio:
PHP:
$query = "SELECT COUNT(*) FROM tbl WHERE cmp > 10";
if ($rs = $cn->query($query)) {

  if ($rs->fetchColumn() > 0) {
 //.....
 
Ultima modifica:
ciao
intanto ringrazio tutti per le risposte.
@alex: mi sa di sì
@luigi777: leggo e ti so dire (però meglio COT che CRUD)
@vampiro: al che si dimostra che la vecchia "a spagetti" è meglio (chi lascia la via vecchia per la nuova presto o tardi mal si ritrova)
@nefty: non conosco il dialetto, sono nato dove manzoni ha sciacquato i panni
:)
 
In realtá PDO è parte di una mistificazione che sta coinvolgendo pesantemente PHP negli ultimi anni; si tenta di dargli una "dignitá" che a qualcuno sembra manchi per il solo fatto che è un liguaggio semplice per sua natura.
Allora vai con i traits per supplire alle mancanze dell'ereditarietá, namespaces per ripetersi impunemente, goto per spaghettare, MVC e mokey per non perdere terreno rispetto a Ror.
Il tutto senza ancora un supporto decente per Unicode.
Ma non dirlo a nessuno :-)
 

Discussioni simili