mysql_real_escape_stringの問題
-
05-10-2019 - |
質問
入力した場合
'
私の検索バーには、「刺し傷」が逃げられていないので、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;
}
?>
とにかく、私はクエリの投稿の後にこれを修正できますか?
解決
いつ magic_quotes_gpc
オフです(そうあるべきです!)、 $_POST['q']
単に文字列です '
, 、たった1人の文字として。そのため、このようなSQLコードに表示されています。
%' OR Location LIKE '%'%' OR Map LIKE '%'%' LIMIT 0, 16
エラーはで行われます '%'%'
なぜなら LIKE
文字列は時期尚早に終了しています。
使用することができます mysql_real_escape_string()
の上 $_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());
他のヒント
あなたは「私はそれが現在文字列だとは思わない」と書いた...それは文字列です。あなたはそれを渡すことができます mysql_real_escape_string()
結果を使用して、クエリを安全で信頼できるものにします。スクリプトが受け取るすべて $_POST
, $_GET
, $_REQUEST
と $_COOKIE
パラメーションは、配列であることを除いて、文字列として使用できます。
あなたに理解させるために。
クエリを見てください:
LIKE '%search string%'
検索文字列を区切るために使用したアポストロフィに注意してください。
これらのアポストロフィは、内部のデータを意味します は 文字列。
すべての 引用符をクエリに入れます。文字列です。
すべての クエリに引用符を入れます しなければならない 逃げる。
考えたり、検討したり、推定したりする必要はありません。ルールはシンプルで明確です。引用されたテキストは常に逃げる必要があります。