2

我有一个生成 MySQL 选择语句的 PHP 脚本:

select * from words where word = 'Classic'

单词表中只有一个单词的变量 word 等于 Classic。

当我的 PHP 页面执行时,我没有从查询中得到任何结果。如果我回显用于执行查询的字符串,将其剪切并粘贴到数据库中 PHPMyAdmin 的 SQL 窗口中,我也没有得到任何结果。但是,如果我在 PHPMyAdmin 的 SQL 窗口中重新键入 EXACT 字符串(使用相同的引号字符),我会得到一行的正确结果。

select 语句中的 Classic 一词是从 PHP GET 获得的(请参见下面的代码)。我可以回显 $word 变量,并得到“经典”的正确结果。我究竟做错了什么?

这是我的代码:

<?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 回答