Echec de la requête SQL LIKE - erreur irrécupérable dans une instruction préparée

StackOverflow https://stackoverflow.com/questions/601992

  •  03-07-2019
  •  | 
  •  

Question

J'ai le code suivant:

$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);
}

Ce qui devrait bien fonctionner. Cependant, je reçois le message d'erreur suivant:

Vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser près de '? WHERE supérieur (ARTICLE_NAME) LIKE '%?%' 'À la ligne 1

Si je mets

SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '% o %';

La requête fonctionne bien. $ table est défini ci-dessus et une requête est reçue de GET. Les deux valeurs sont correctes et valides. Pourquoi cela échoue?

modifier: changer pour:

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE '% ? %'";

if ($numRecords = $con->prepare($countQuery)) {

    $numRecords->bind_param("s", $query);

entraîne l'erreur:

Avertissement: mysqli_stmt :: bind_param () [mysqli-stmt.bind-param]: Le nombre de variables ne correspond pas au nombre de paramètres de l'instruction préparée dans C: \ Program Files \ EasyPHP 3.0 \ www \ prog \ get_records. php à la ligne 38

Commandes désynchronisées; vous ne pouvez pas exécuter cette commande maintenant

où comme

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";

if ($numRecords = $con->prepare($countQuery)) {

    $numRecords->bind_param("s", "%".$query."%");

résultats dans

Erreur fatale: impossible de transmettre le paramètre 2 par référence dans C: \ Program Files \ EasyPHP 3.0 \ www \ prog \ get_records.php à la ligne 38

et enfin

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ? ";

if ($numRecords = $con->prepare($countQuery)) {

    $numRecords->bind_param("s", $query);

donnera seulement:

Commandes désynchronisées; vous ne pouvez pas exécuter cette commande maintenant

Est-il impossible d'utiliser un paramètre pour un statut LIKE?

Était-ce utile?

La solution

Pour la clause LIKE , utilisez ceci:

SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ?, '%')

En ce qui concerne le nom de la table, il est extrêmement mauvais d’avoir des noms de table en tant que paramètres.

Si, pour une raison quelconque, vous devez toujours le faire, vous devez l'intégrer au texte de la requête avant de préparer la requête:

$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);
}

Autres conseils

Avez-vous publié

mysqli_free_result($result);

après la dernière requête? C'est la commande hors erreur de synchronisation.

Cela devrait fonctionner cependant

$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", "%".$query."%");

Vous vous demandez ce qu'il y a dans la variable $ query. Essayez de faire cela à la place

$query = '%'.$query.'%';
$numRecords->bind_param("s", $query);

Essayez plutôt le suivant:

$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);
}

Bien entendu, vous ne pouvez pas utiliser d’espaces réservés pour les identifiants avec mysqli ni pour préparer des instructions. Vous devez donc interpoler manuellement le nom de la table dans la requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top