php - outer - update mysql
php mysqli preparato istruzione LIKE (2)
aggiornato
Dai commenti si trova che i caratteri jolly LIKE ( _
e %
) non vengono sfuggiti per impostazione predefinita nelle query con parametri e pertanto possono causare risultati imprevisti.
Pertanto, quando si usano le istruzioni "LIKE", utilizzare questo Regex 'lookahead negativo' per assicurarsi che questi caratteri siano sfuggiti:
$param = preg_replace('/(?<!\\\)([%_])/g', '\\\$1',$param);
In alternativa alla risposta data sopra puoi anche usare la funzione MySQL CONCAT :
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
$stmt->bind_param("s", $param);
$stmt->execute();
Il che significa che non è necessario modificare il valore $param
ma creare query leggermente più lunghe.
Come posso con mysqli effettuare una query con LIKE e ottenere tutti i risultati?
Questo è il mio codice ma non funziona:
$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);
$stmt->fetch();
Questo codice non sembra funzionare. L'ho cercato molto. Inoltre può restituire più di 1 riga. Quindi, come posso ottenere tutti i risultati anche se restituisce più di 1 riga?
Ecco come recuperare correttamente il risultato
$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);
while ($stmt->fetch()) {
echo "Id: {$id}, Username: {$username}";
}
oppure puoi anche fare:
$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM)) {
foreach ($row as $r) {
print "$r ";
}
print "\n";
}
Spero tu ti renda conto di avere la risposta direttamente dal manuale here e da here , che è dove avresti dovuto andare per primo.