2009-03-02 6 views
1

Je le code suivant:requête SQL LIKE défaut - erreur fatale dans la déclaration préparée

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

qui devrait fonctionner correctement. Cependant, je reçois l'erreur suivante:

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de? Where upper (ARTICLE_NAME) LIKE '%?%' » À la ligne 1

Si je mets

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

La requête fonctionne très bien. $ table est défini ci-dessus et la requête est reçue de GET, et les deux sont des valeurs valides correctes. Pourquoi est-ce échouer?

modifier: changer à:

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

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

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

résultats dans l'erreur:

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

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

où que

$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: ne peut pas passer le paramètre 2 par référence dans C: \ Program Files \ EasyPHP 3.0 \ www \ prog \ get_records.php sur 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 état LIKE?

+0

double possible de [exception SQL lorsque vous essayez de faire une déclaration préparée] (http://stackoverflow.com/questions/460920/sql-exception-when-trying-make-an-prepared -statement) – outis

Répondre

7

Pour LIKE clause, utilisez ceci:

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

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

Si pour une raison quelconque, vous avez encore besoin de le faire, vous aurez besoin de l'intégrer dans le 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); 
} 
+1

D'autres personnes ont dit cela, mais passer le nom de la table comme paramètre fonctionne bien? Est-ce une mauvaise pratique de le faire? –

+0

Passer le nom de la table en paramètre ne fonctionnera pas, MySQL ne sera pas capable de préparer une telle déclaration. Vous ne pouvez pas avoir une instruction préparée avec un nom de table en tant que paramètre. – Quassnoi

0

Effectuez les opérations suivantes au lieu:

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

non, cela ne le résout pas, ou des astuces similaires. –

0

AFAIK vous ne pouvez pas utiliser des espaces réservés pour les identifiants avec mysqli et préparer des déclarations. Vous devez donc interpoler manuellement le nom de table dans la requête.

+0

huh. Ils ont échoué avant quand je n'ai pas eu le nom de table comme paramètre. –

2

Avez-vous émis

mysqli_free_result($result); 

après la dernière requête? C'est la commande hors de l'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 qui est dans la variable de requête $. Essayez de faire cela au lieu

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

Je n'ai aucune idée d'où émettre ce .. J'ai libéré tout autant que je peux voir, et toujours obtenir cette erreur. –

+0

Cela peut arriver, par exemple, si vous utilisez mysql_use_result() et essayez d'exécuter une nouvelle requête avant d'avoir appelé mysql_free_result(). Cela peut aussi arriver si vous essayez d'exécuter deux requêtes qui renvoient des données sans appeler mysql_use_result() ou mysql_store_result() entre les deux. –

Questions connexes