2

MySQLselectステートメントを生成するPHPスクリプトがあります。

select * from words where word ='Classic'

単語テーブルには、Classicと等しい可変単語を持つ単語が1つだけあります。

PHPページを実行しても、クエリの結果が得られません。クエリの実行に使用されている文字列をエコーし​​、それを切り取ってデータベースのPHPMyAdminのSQLウィンドウに貼り付けると、結果も得られません。ただし、その正確な文字列をPHPMyAdminのSQLウィンドウに(同じ引用符で)再入力すると、1行の適切な結果が得られます。

selectステートメントのClassicという単語は、PHP GETから取得されます(以下のコードを参照)。$ word変数をエコーし​​て、「Classic」の正しい結果を得ることができます。私は何が間違っているのですか?

これが私のコードです:

<?php

  require ('dbconnect.php');

  $word = $_GET["word"];

  $selectStr = "SELECT * FROM words WHERE word = '" . $word . "'";

  if ($results = MySQL($dbName, $selectStr))
  {
    $rowCount = MySQL_NUMROWS($results);
  }

  $resultRow = MYSQL_FETCH_ROW($results);

  $wordID = $resultRow[0];

?>
4

2 に答える 2

3

その言葉を消毒してください。mysql_real_escape_string()トリックを行う必要があります。

$selectStr = "SELECT * FROM words WHERE word LIKE '" . $sanitized_word_i_promise . "'";動作するはずです:)

説明するだけです: "="は、完全に一致する場合に機能するはずです。これには、大文字/小文字、スペースなどが含まれます。クエリで使用する前に、その結​​果も最初にトリミングする必要があります。

fooデータベースに保存している場合(最後のスペースに注意してください)、スペースがないと一致fooしません。あなたは使いたくなるでしょうLIKE 'foo%'-おそらく。

いずれにせよ、Sourabhは正しいですが、パフォーマンスに関しては、これは正確な文字列を一致させようとするときに大ヒットではありません。最初に他の場所で問題を探す必要があります(たとえば、データベース内のアイテムが完全に一致していますか?) 。

于 2012-09-05T17:07:38.517 に答える
2

まず、ユーザー入力を取得して、サニタイズしたり、プリペアドステートメントを使用したりせずに、クエリに直接入力しないでください。

これで、邪魔にならないようになりました。変数と文字列を書き込んでstrcmp()を実行してみましたか?そのような

echo strcmp($ _ GET ['word']、 "クラシック")

0以外の結果が得られた場合は、それらが同じではないことを意味します。おそらく、$_GET変数になんらかの空白があります。trim()空白を取り除くためにそれを使用します。また、大文字と小文字の区別の問題である可能性もあります。

于 2012-09-05T17:10:02.603 に答える