Query SQL LIKE non riuscita - errore irreversibile nell'istruzione preparata
Domanda
Ho il seguente codice:
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("ss", $table, $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Che dovrebbe funzionare bene. Tuttavia ricevo l'errore che:
Si è verificato un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino '? DOVE in alto (ARTICLE_NAME) COME "%?%" "Alla riga 1
Se lo metto
SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '% o %';
La query funziona correttamente. La tabella $ è definita sopra e la query viene ricevuta da GET ed entrambi sono valori validi corretti. Perché non funziona?
modifica: passando a:
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $query);
genera l'errore:
Avvertenza: mysqli_stmt :: bind_param () [mysqli-stmt.bind-param]: il numero di variabili non corrisponde al numero di parametri nell'istruzione preparata in C: \ Programmi \ EasyPHP 3.0 \ www \ prog \ get_records. php on line 38
Comandi non sincronizzati; non puoi eseguire questo comando ora
dove come
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", "%".$query."%");
risulta in
Errore irreversibile: impossibile passare il parametro 2 per riferimento in C: \ Programmi \ EasyPHP 3.0 \ www \ prog \ get_records.php sulla riga 38
e infine
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ? ";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $query);
darà solo:
Comandi non sincronizzati; non puoi eseguire questo comando ora
È impossibile usare un parametro per uno stato COME?
Soluzione
Per la clausola LIKE
, utilizzare questo:
SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ?, '%')
Per quanto riguarda il nome della tabella, è una pessima pratica avere nomi di tabella come parametri.
Se per qualche motivo hai ancora bisogno di farlo, dovrai incorporarlo nel testo della query prima di preparare la query:
$countQuery = "SELECT ARTICLE_NO FROM $table_name WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ? ,'%')";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Altri suggerimenti
Hai emesso
mysqli_free_result($result);
dopo l'ultima query? Questo è il comando fuori errore di sincronizzazione.
Questo dovrebbe funzionare comunque
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", "%".$query."%");
Mi chiedo cosa ci sia nella variabile $ query. Prova a farlo invece
$query = '%'.$query.'%';
$numRecords->bind_param("s", $query);
Prova invece quanto segue:
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("ss", $table, "%$brand%");
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Dopo tutto non puoi usare segnaposto per identificatori con mysqli e preparare istruzioni. Quindi dovresti interpolare manualmente il tablename nella query.