Ecco il mio tentativo:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Ecco il mio tentativo:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Risposte:
L'ho capito subito dopo aver pubblicato:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
}
Per coloro che utilizzano parametri denominati, ecco come utilizzarli LIKE
con la %
corrispondenza parziale per i database MySQL :
WHERE nome_colonna LIKE CONCAT ('%',: dangerousstring, '%')
dove si trova il parametro denominato :dangerousstring
.
In altre parole, usa %
segni esplicitamente senza caratteri di escape nella tua query che sono separati e sicuramente non l'input dell'utente.
Modifica: la sintassi di concatenazione per i database Oracle utilizza l'operatore di concatenazione:, ||
quindi diventerà semplicemente:
WHERE nome_colonna LIKE '%' || : dangerousstring || '%'
Tuttavia ci sono avvertimenti in quanto @bobince menziona qui che:
La difficoltà arriva quando si desidera consentire un letterale
%
o un_
carattere nella stringa di ricerca, senza che agisca come un carattere jolly.
Quindi è qualcos'altro a cui prestare attenzione quando si combinano like e parametrizzazione.
LIKE CONCAT('%', :something, '%')
. Riferimento: stackoverflow.com/a/661207/201648
SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' )
questo mi avrebbe dato un errore.
and it means named placeholders can be used
. Com'è anche un problema con i segnaposto con nome quando si concatena in PHP? Ovviamente la concatenazione in PHP supporta sia nominativi che posizionali e più portabili in quanto è possibile utilizzare la stessa query per qualsiasi database. Io non capisco il motivo per cui così tante persone pensano che ci sia alcuna differenza tra i segnaposto di nome e di posizione.
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();
if (!$query->rowCount() == 0)
{
while ($results = $query->fetch())
{
echo $results['column'] . "<br />\n";
}
}
else
{
echo 'Nothing found';
}
bindValue
protegge dagli attacchi di iniezione? La risposta accettata fondamentalmente nega il valore dell'utilizzo di ?
segnaposto concatenando la stringa di ricerca in modo che %
piaccia ai vecchi tempi.
Puoi anche provare questo. Affronto un problema simile ma ho ottenuto risultati dopo la ricerca.
$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');
$stmt= $pdo_connection->prepare($query);
$stmt->execute(array(':search' => '%'.$search_term.'%'));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
L'ho preso da php delusions
$search = "%$search%";
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
E per me funziona, molto semplice. Come dice lui, devi "preparare prima il nostro letterale completo" prima di inviarlo alla query
PDO sfugge a "%" (può portare a sql injection) : l'uso del codice precedente darà i risultati desiderati quando si cerca di abbinare stringhe parziali MA se un visitatore digita il carattere "%" otterrai comunque risultati anche se non lo fai non avere nulla memorizzato nel database (potrebbe portare a iniezioni sql)
Ho provato molte varianti, tutte con lo stesso risultato che PDO sfugge a "%" portando risultati di ricerca indesiderati / non stimolati.
Ho pensato che valesse la pena condividere se qualcuno ha trovato una parola attorno ad essa, per favore condividila
like
si usa più? come deve essere eseguito l'array di esecuzione in ordine?