2

これが私の最初の質問です。すぐに答えが得られるほど簡単であることを願っています。

基本的に、私は次のコードを持っています:

$variable = curPageURL();
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable' ;

$ variableをエコーすると、現在のページのurl(私のページのjavascript)が出力されます。

最終的に、私が望んでいるのは、検索語が現在のページのURLであり、前後にワイルドカードを使用して検索できるようにすることです。これが可能かどうか、または単に構文エラーが発生しただけなのかどうかはわかりません。エラーが発生せず、結果が発生しないためです。

私は試した :

    $query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '"echo $variable" ' ;

しかし、繰り返しになりますが、私はおそらく行方不明であるか、置き忘れた'";などを使用しています。

私が間違っていることを教えてください!

4

6 に答える 6

24

最終的に、私が望むのは、検索用語が現在のページの URL であり、前後にワイルドカードを使用して検索できるようにすることです。

SQL ワイルドカード文字はパーセント記号です。したがって:

$variable = curPageURL();
$variable = mysql_real_escape_string($variable);
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '%{$variable}%'";

注: 余分なコードを追加しました。mysql_real_escape_string()ユーザーが意図的または誤って SQL ステートメントを壊す文字を入力することから保護します。パラメーター化されたクエリを使用する方が良いですが、それはこの単純な修正よりも複雑なトピックです。

また、注意してください:文字列の引用も修正しました。文字列が二重引用符で囲まれていて、末尾に引用符がない場合にのみ、文字列内の変数を直接使用できます$query

編集 2015 年 1 月 17 日:賛成票を獲得したので、それを念頭に置いて、関数をもう使用しないでください。mysql_*

于 2009-12-03T23:02:58.673 に答える
7

使用する:

$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '{$variable}'" ;

上記のようなSQLインジェクション攻撃を防ぐ理由を理解するために、「お母さんのエクスプロイト」を提出します。

代替テキスト

于 2009-12-03T22:58:50.537 に答える
5

これを行わないでください。SQLインジェクションに対して脆弱です(これは、アプリケーションに戻る前に読み、吸収し、理解する必要がある138のStackOverflow質問のリストです)。パラメータ化されたクエリまたはストアドプロシージャを使用します。

于 2009-12-03T22:58:21.247 に答える
2

変数値を置き換える必要がある場合は、二重引用符を使用します。

## this code is open for SQL injection attacks
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable'";

または、文字列を手動で連結します。

## this code is open for SQL injection attacks
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE "' . $variable . '"';
于 2009-12-03T23:05:27.970 に答える
1

コードは SQL インジェクション攻撃に対して脆弱です。ユーザー提供のデータを SQL クエリ文字列に直接配置しないでください。代わりに、最初に などの関数でサニタイズする必要がありますmysql_real_escape_string()

于 2009-12-03T23:36:29.623 に答える
0

構文エラーが通知されない理由について: エラー報告の設定が正しく設定されていない可能性があります。

を開いphp.iniて、以下が設定されていることを確認します。

display_errors = On

と:

error_reporting = E_ALL
于 2009-12-03T23:19:03.437 に答える