2011-10-31 11 views
1
$categories_query ="SELECT p.products_id 
, p.products_quantity 
, p.products_price 
, p.products_status 
,p.products_image 
, pd.products_name 

FROM products_description AS pd 
INNER JOIN products AS p 
ON p.products_id = pd.products_id 
WHERE p.products_status = 1 and p.products_id <> $pid and pd.products_name LIKE CONCAT(LEFT('$products_name',10),'%')"; 

相対的な項目がなくても、一部のページは正常に実行されています。 $products_nameA Bug's Life "Multi Pak" Special 2003 Collectors Editionの場合です。それはエラーを示します:sqlコマンドでエラーが表示される理由

1064 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 's Life "Multi Pak" Special 2003 Collectors Edition',10),'%')' at line 11 
in: 
[SELECT p.products_id... 

なぜですか?それを修正する方法は?

答えて

1

$ products_nameの値の例には 'symbolが含まれているため、sqlクエリが正しく処理されません。クエリの瞬間の一部で

その

ようなものになるだろう...(LEFT(「バグズライフ 『マルチパック』特別2003コレクターズ・エディション」、10)...

。なお、 'gとsの間に'が最初のアポストロフィを終了し、残りの$ products_nameは実行されたクエリの文字列値ではありません。

代わりにprepared statementを使用する必要があります。現在のコードの脆弱性。

EDIT:http://php.net/manual/en/mysqli.prepare.php

  • PDO::私は個人的にPDOを好むhttp://php.net/manual/en/pdo.prepared-statements.php
  • あなたはどちらか

    +0

    代わりにprepared statementを使用する必要がありますか?どうすればいいですか?ありがとうございました – dreamchaser

    +0

    @dreamchaser私はコード例へのリンクで答えを更新しました。 –

    2

    $ product nameにmysql_real_escape_string()を使用する必要があります。 "'"はそのエラーの理由であり、mysql_real_escape_string()はそれを修正します。 mysqlに送信する前に、常にすべての変数をフィルタリングする必要があります。そうしないと、mysql注入による悪意のあるSQLコードのリスクが発生します。 mysql_real_escape_string() on php.net

    関連する問題