2012-09-05 75 views
2

我有一个生成一个MySQL的SELECT语句中的PHP脚本:MySQL的SELECT语句GET变量

SELECT * FROM话,其中一句话=“经典”

有中字表中只有一个字可变字等于经典。

当我的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]; 

?> 
+8

你应该永远不要直接在SQL语句上使用请求变量。 – samura

+1

它不回答你的问题,但请记住你**必须**总是在用户输入之前清理用户输入,然后在查询中使用它以避免SQL注入! – Marco

+0

会不会有任何区分大小写问题? – Sourabh

回答

3

请,请,请消毒这个词。 mysql_real_escape_string()应该做的伎俩。

$selectStr = "SELECT * FROM words WHERE word LIKE '" . $sanitized_word_i_promise . "'";应该工作:)

只是解释: “=” 必须精确匹配工作。这包括大写/小写,空格等。在查询中使用它之前,您应该先修剪该结果。

如果您有foo存储在数据库中(请注意最后的空格) - 它不会匹配foo,没有空格。你可能想要使用LIKE 'foo%'。无论哪种方式,Sourabh都是对的,虽然表现明智,但在尝试匹配确切字符串时这不是一个大问题,您应该首先在其他地方查找问题(例如,是数据库中的项目完全符合?)。

+1

当他想要完全匹配时,使用like不是一个好选择。性能会很差 – Sourabh

+0

你说得对。我被这个变量吓到了。更新:) – Claudiu

+1

好的。了解。用消毒这个词,并使用LIKE语句,我使它正常工作。谢谢! –

2

首先,您不应该接受任何用户输入并直接将其输入到查询中,而无需进行消毒或使用预准备语句。

现在我们已经明白了:您是否尝试过使用变量和您的字符串写入strcmp()?如

回声的strcmp($ _ GET [ '字'], “经典”)

如果你获得比0的结果,这意味着他们是不一样的,很有可能会出现$ _GET变量中的某种空白。使用trim()来取出空格。也可能是一个区分大小写的问题。

+0

我得到一个1,这意味着单词是不一样的。但我已经尝试使用trim()和mysql_real_escape_string(),并且字符串仍然不匹配。 –

+0

可能是一些大/小写问题。 – Claudiu