2012-06-20 11 views
27

Sono in esecuzione problemi nell'attuazione LIKE in DOPimplementare COME query in DOP

ho questa query:

$query = "SELECT * FROM tbl WHERE address LIKE '%?%' OR address LIKE '%?%'"; 
$params = array($var1, $var2); 
$stmt = $handle->prepare($query); 
$stmt->execute($params); 

ho controllato il $var1 e $var2 che contengono sia le parole che voglio per la ricerca, la mia PDO sta funzionando bene dal momento che alcune delle mie query SELECTINSERT funzionano, è solo che non mi è familiare in LIKE qui in PDO.

Il risultato non è stato restituito. Il mio $query è sintatticamente corretto?

risposta

61

Bisogna includere i % segni nel $params, non nella query:

$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?"; 
$params = array("%$var1%", "%$var2%"); 
$stmt = $handle->prepare($query); 
$stmt->execute($params); 

Se ci si guarda alla domanda generata in il tuo codice precedente, vedresti qualcosa come SELECT * FROM tbl WHERE address LIKE '%"foo"%' OR address LIKE '%"bar"%', perché l'istruzione preparata sta citando i tuoi valori all'interno di una stringa già quotata.

+0

+1 per la spiegazione .. Ma non penso che ci sia un modo per guardare la query generata .. c'è qualcosa del genere? – Vignesh

+0

Non riuscivo a capirlo per la vita di me e mi ero completamente dimenticato di questo. Risposta fantastica Grazie! – b3tac0d3

5

No, non è necessario citare preparare segnaposto. Inoltre, includi i segni% all'interno delle tue variabili.

LIKE ? 

E nella variabile: %string%

+0

Hmm, il perdono, ma io non sono molto sicuro come implementare quello che hai appena suggerito. –

+0

Sono al cellulare ma cercherò di spiegare il meglio che posso. Vedi la mia modifica. –

4
$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?"; 
$params = array("%$var1%", "%$var2%"); 
$stmt = $handle->prepare($query); 
$stmt->execute($params); 
2

Potete vedere di seguito esempio

$title = 'PHP%'; 
$author = 'Bobi%'; 
// query 
$sql = "SELECT * FROM books WHERE title like ? AND author like ? "; 
$q = $conn->prepare($sql); 
$q->execute(array($title,$author)); 

Spero che funzionerà.

1

è sufficiente utilizzare il seguente:

$query = "SELECT * FROM tbl WHERE address LIKE CONCAT('%', :var1, '%') 
      OR address LIKE CONCAT('%', :var2, '%')"; 

$ar_val = array(':var1'=>$var1, ':var2'=>$var2); 
if($sqlprep->execute($ar_val)) { ... } 
+0

Questo è più lento dell'aggiunta della% direttamente alle variabili bindate. – CristiC