PHP MySQL查询返回NULL

4

我有一个MySQL表格,长这样:

index  |  tag  |  posts
-------------------------
  1    | cats  |   9,10
  2    | a cat |   9,10
  3    | kitty |   9,10
  4    | meow  |   9,10

我尝试返回与搜索查询匹配的行。

我使用一个简单的?search=cats参数来传递搜索参数。

以下是我使用的PHP代码:

$search = $_GET['search'];
$query  = mysql_query("SELECT * FROM tags WHERE tag = '$search'");
echo(mysql_num_rows($query));
$result = mysql_fetch_array($query);
$print  = $result['posts'];
echo($print);

然而mysql_num_rows($query)返回0,$print返回NULL。我可以使用($print == "")进行检查,它的值为TRUE,mysql_num_rows($query)返回4。我尝试将搜索查询设置为表中不存在的内容,它按预期返回FALSE。我还尝试删除WHERE tag = '$search',它像应该返回表格一样工作。
我是否忽略了什么? 编辑 采纳了大家的建议,我现在使用的代码是:
$search = mysql_real_escape_string($_GET['search']);
var_dump($search); //prints   string(4) "cats"   just like it should
$queryText = "SELECT * FROM tags WHERE tag = '%".$search."%'";
echo($queryText); //SELECT * FROM tags WHERE tag = '%cats%'
$query  = mysql_query($queryText) or die(mysql_error()); //no error
$rows   = mysql_num_rows($query); //this returns 0 and I know it should match 1 row
echo('rows: '.$rows);
$result = mysql_fetch_array($query);
$print  = $result['posts'];
echo($print); //empty

仍然存在同样的问题。 mysql_query 返回 NULL 而不是行或 FALSE(如果不匹配)。

(将来我会使用 mysqli API,但我想在 mysql 中完成这个项目。感谢您的建议和意见。)


1
2件事:
  1. 在 $search = $_GET['search']; 后面加上 echo,以确保搜索词已填写。
  2. 将查询更改为 $query = mysql_query("SELECT * FROM tags WHERE tag = '$search'") or die(mysql_error()); 并告诉我们输出结果是什么。
- Orel Eraki
2
欢迎来到Stack Overflow!请勿在新代码中使用mysql_*函数。它们已不再维护,并已正式弃用。看到红框了吗?学习prepared statements,并使用PDOMySQLi - 本文将帮助您决定选择哪个。如果您选择PDO,这里有一个好的教程 - Touki
确保您清楚地知道发送到MySQL服务器的内容。$queryText = "SELECT * FROM tags WHERE tag = '$search'"; print($queryText); 还可以尝试将 or die(mysql_error); 放在与 mysql_query() 相同的行上。 - EM-Creations
1
请记得使用函数mysql_real_escape_string() - ryder
@OrelEraki 我检查了 $_GET['search'],它确实是我想要的。我还添加了 or die(mysql_error()),但没有返回任何错误。感谢你的帮助。 - thunder618
5个回答

1

现在尝试这段代码。

记住,当您想要调试PHP中的某些内容时,更快的方法是使用var_dump而不是echo。此外,应避免使用mysql_api,因为它们已过时,请改用PDO PHP.net上的PDO

var_dump($_GET); // Just for debuggin if as something

$search = $_GET['search'];
$query  = mysql_query("SELECT * FROM tags WHERE tag = '".mysql_real_escape_string($search)."'");
// echo(mysql_num_rows($query));
$result = mysql_fetch_array($query);
var_dump($result);
//$print  = $result['posts'];
//echo($print);

我看不出来这样做会如何解决问题。它增加了安全性,但是……这绝对不是答案。 - EM-Creations
他应该先知道$_GET是否有内容...这就是目的。 - ExoticSeagull
这不是答案,你应该将其作为评论添加,而不是作为答案。 - EM-Creations
其他人的答案都是相同的,只是改变了一些风格和代码。 - ExoticSeagull
你在说什么啊? - EM-Creations
显示剩余2条评论

0

注意:

$search = $_GET['search'];
$query  = mysql_query("SELECT * FROM tags WHERE tag = '$search'");

这非常危险:它允许 SQL 注入代码进入您的数据库。您必须始终转义从客户端获取的所有内容。

$search = mysql_real_escape_string($_GET['search']); //It require open database connection.

注意: mysql_query已经过时,请使用mysqli代替 ;-)
答案:
如果您没有得到答案,可能是其他部分出现了错误。 请尝试。
//1) Look if your search has a correct value
var_dump($search);
//2) Replace the query with (just for debugging):
$query  = mysql_query("SELECT * FROM tags WHERE tag = 'cats';");

如果您想要更灵活的搜索,也可以使用类似于“tag like '%cats%'”这样的标签。


谢谢。我添加了'%cats%'mysql_real_escape_string() - thunder618

0
如果您删除 WHERE tage = '$search',它将无法像应该返回表格,因为您的 mysql_fetch_array 不在 while 循环中... 但是这一点先不提...
// make sure before you execute the code to check that $_GET['search'] is not empty

// start with escaping the search-value (for mysql-injection)
$search = msyql_real_escape_string($_GET['search']);

// changed the query so it searches for tags containing the search value.
// if you would have records with tags "blue cat" and "red cat" it shows them both
// when searching for "cat"
$query  = mysql_query("SELECT * FROM tags WHERE tag LIKE '%".$search."%'");

// put the number of rows in a var
$num = mysql_num_rows($query);

// check this var if it's not 0
if ($num != '0'){
    while ($row = mysql_fetch_array($query){
        echo $row['posts'];
        // etc...
    }
} else {
    // 0 rows found
    echo "nothing found";
}

是的,当我移除了WHERE tage = '$search'后,我使用了 while($result[] = mysql_fetch_array($query)) 进行验证。感谢'%".$var."%'的提示! - thunder618

0
$search = $_GET['search'];
echo $select_query="SELECT * FROM tags WHERE tag = '".mysql_real_escape_string($search)."'";
$query  = mysql_query($select_query);
echo(mysql_num_rows($query));
while($result = mysql_fetch_array($query))
{
  print_r($result);
}

0

好的,参考您所做的上述编辑后,这里是解决方案

在使用通配符“%”时,请使用“LIKE”而不是“=”

因此,您现在的查询应该是

$queryText = "SELECT * FROM tags WHERE tag LIKE '%" . $search . "%'";

[我在本地系统上创建了完全相同的数据库,并运行了您提供的相同代码,在进行以上更改后,它按预期运行]


根据 PHP 手册(链接),$_GET 已经被解码,我不应该在其上使用 urldecode() 函数。那么我应该使用它吗? - thunder618
那我一定做错了什么。我要切换到 mysqli。谢谢你的帮助! - thunder618

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接