0

入力すると

'

「スティング」がエスケープされていないため、検索バーにmysqlエラーが表示されます。

しかし、私がそれを逃れることができない理由は、現在それが文字列であるとは思わないからです.

検索ボックスは、入力したとおりに ajax を使用して検索結果を動的に生成し、エラーが発生する結果を見つけます。

    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

これは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;

    }
?>

クエリを投稿した後にこれを修正できる方法はありますか?

4

3 に答える 3

3

がオフの場合magic_quotes_gpc(そうあるべきです!)、$_POST['q']は単に文字列'であり、1 文字です。そのため、次のように SQL コードに表示されます。

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

文字列が途中で終了している'%'%'ため、エラーが発生します。LIKE

mysql_real_escape_string()onを使用するだけ$_POST['q']でエスケープされます。

$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());
于 2010-09-25T13:37:41.373 に答える
1

あなたは「現在は文字列だとは思わない」と書いています...文字列です。これを に渡しmysql_real_escape_string()、その結果を使用して、クエリを安全かつ信頼できるものにすることができます。$_POST$_GET$_REQUESTおよびparamsによってスクリプトが受け取るものはすべて$_COOKIE、配列である場合を除き、文字列として使用できます。

于 2010-09-25T13:43:32.643 に答える
1

理解してもらうために。
あなたのクエリを見てください:

LIKE '%search string%'

検索文字列を区切るために使用したアポストロフィに注意してください。
これらのアポストロフィは、IS内のデータが文字列であることを意味します。クエリに引用符で囲んだものは
すべて文字列です。クエリに引用符で囲んだものは
すべてエスケープする必要があります。
考えたり、検討したり、見積もったりする必要はありません。ルールは単純で明確です。引用されたテキストは常にエスケープする必要があります。

于 2010-09-25T13:49:43.533 に答える