2010-09-25 6 views
0

Si je tape dans ma barre de recherchemysql_real_escape_string NUMÉRO

'

Je reçois une erreur de MySQL comme « aiguillon » n'a pas été escaped- il pense.

Mais la raison pour laquelle je ne peux pas échapper c'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; 

    } 
?> 

Est là de toute façon je peux résoudre ce problème après son post la requête peut-être?

+0

«Je ne pense pas que ce soit actuellement une chaîne.» Et qu'est-ce que c'est? –

Répondre

3

Lorsque magic_quotes_gpc est désactivé (comme il se doit!), $_POST['q'] est simplement la chaîne ', comme un seul caractère. Voilà pourquoi il est apparaître dans votre code SQL comme ceci:

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

L'erreur a lieu à '%'%' parce que la chaîne LIKE est mis fin prématurément.

Vous pouvez simplement utiliser mysql_real_escape_string() sur $_POST['q'] et il va être é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()); 
1

Vous avez écrit: « Je ne pense pas qu'il est actuellement une chaîne » ... il est une chaîne. Vous pouvez le 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 par les paramètres $_POST, $_GET, $_REQUEST et $_COOKIE peut être utilisé comme chaîne, sauf s'il s'agit d'un tableau.

1

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 signifient que les données à l'intérieur 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é.
Pas besoin de réfléchir, d'envisager ou d'estimer. La règle est simple et non ambiguë: le texte entre guillemets doit toujours être échappé.

+0

Merci pour cela, je suis assez nouveau pour PHP, cela a beaucoup aidé – AJFMEDIA

Questions connexes