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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top