Question

Si je tape

  

dans ma barre de recherche je reçois une erreur de MySQL comme « piqûre » n'a pas été escaped- il pense.

Mais la raison pour laquelle je ne peux pas y échapper est parce que je ne pense pas qu'il est actuellement une chaîne.

la zone de recherche génère des résultats de recherche de façon dynamique avec ajax est que je tape et il trouve les résultats que je reçois l'erreur:

    You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near '%' OR Location
LIKE '%'%' OR Map LIKE '%'%' LIMIT 0, 16' at line 2

Ceci est la requête MySQL:

<?php 
    if($_POST['q']!=""){
  include $_SERVER['DOCUMENT_ROOT'] . "/include/datebasecon.php";
        $result = mysql_query("
          SELECT id, Name, Location,  Map
          FROM Accommodation WHERE Name LIKE '%".$_POST['q']."%' OR Location LIKE '%".$_POST['q']."%' OR Map LIKE '%".$_POST['q']."%' LIMIT 0, 16") 
        or die(mysql_error());
        $output = "";
        while($row = mysql_fetch_array($result)){
            $N = preg_replace("/(".$_POST['q'].")/i","<span>$1</span>",$row['Name']);
            $L = preg_replace("/(".$_POST['q'].")/i","<span>$1</span>",$row['Location']);
            $M = preg_replace("/(".$_POST['q'].")/i","<span>$1</span>",$row['Map']);
            $output .= "<p>".$N." - ".$L."</p>";    
        }

        print $output;

    }
?>

Y at-il de toute façon je peux résoudre ce problème après son après la requête peut-être?

Était-ce utile?

La solution

Quand magic_quotes_gpc est éteint (comme il devrait l'être!), $_POST['q'] est tout simplement la chaîne ', comme un seul caractère. Voilà pourquoi il est apparaissant dans votre code SQL comme ceci:

%' OR Location LIKE '%'%' OR Map LIKE '%'%' LIMIT 0, 16

L'erreur a lieu à '%'%' car la chaîne de LIKE est interrompue prématurément.

Vous pouvez simplement utiliser mysql_real_escape_string() sur $_POST['q'] et il sera échappé:

$q = mysql_real_escape_string($_POST['q']);
$result = mysql_query("
  SELECT id, Name, Location,  Map
  FROM Accommodation WHERE Name LIKE '%".$q."%' OR Location LIKE '%".$q."%' OR Map LIKE '%".$q."%' LIMIT 0, 16") 
or die(mysql_error());

Autres conseils

Vous avez écrit: « Je ne pense pas qu'il est actuellement une chaîne » ... il est une chaîne. Vous pouvez passer à mysql_real_escape_string() et utiliser le résultat pour rendre votre requête sécurisée et fiable. Tout ce que votre script reçoit les $_POST, $_GET, $_REQUEST et $_COOKIE params peut être utilisé en tant que chaîne, sauf qu'il est un tableau.

Pour vous faire comprendre.
Regardez votre requête:

LIKE '%search string%'

note que vous avez Apostrophes utilisé pour délimiter la chaîne de recherche.
Ces apostrophes signifie que l'intérieur de données IS une chaîne.
Tout vous mettez entre guillemets dans la requête est une chaîne.
Tout vous mettez entre guillemets dans la requête doit être échappées.
Pas besoin de réfléchir, considérer ou estimer. La règle est simple et sans ambiguïté. Texte cité doit toujours être échappé

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