我有一个生成MySQL select语句的PHP脚本:
从word ='Classic'
的单词中选择*单词表中只有一个单词,变量单词等于Classic。
当我的PHP页面执行时,我从查询中得不到任何结果。如果我回显用于执行查询的字符串,将其剪切并粘贴到数据库中PHPMyAdmin的SQL窗口中,我也没有得到任何结果。但是,如果我将该EXACT字符串重新键入PHPMyAdmin的SQL窗口(使用相同的引号字符),我会得到一行的正确结果。
select语句中的经典一词来自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];
?>
答案 0 :(得分:3)
请拜托,请消毒那个词。 mysql_real_escape_string()
应该做到这一点。
$selectStr = "SELECT * FROM words WHERE word LIKE '" . $sanitized_word_i_promise . "'";
应该有效:)
只是解释:“=”应该适用于完全匹配。这包括大写/小写,空格等。在查询中使用它之前,您应该首先修剪该结果。
如果您在数据库中存储了foo
(请注意末尾的空格) - 它将与foo
不匹配,没有空格。您可能希望使用LIKE 'foo%'
- 。
无论哪种方式,Sourabh是对的,虽然性能明智,但在尝试匹配完全字符串时这不是一个大打击,你应该首先在其他地方寻找问题(例如,数据库中的项目是否准确匹配吗?)。
答案 1 :(得分:2)
首先,您不应该接受任何用户输入并直接将其输入到查询中,而无需对其进行清理或使用预准备语句。
现在我们已经解决了这个问题:你试过用变量和你的字符串写入strcmp()吗?如
echo strcmp($ _ GET ['word'],“Classic”)
如果得到的结果不是0,则意味着它们不相同,很可能在$ _GET变量中会有某种空格。在其上使用trim()
来取出空格。也可能是一个区分大小写的问题。