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 。

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

4

5 回答 5

1

现在试试这个代码。

请记住,当您想在 PHP 中调试某些东西时,更快的方法是var_dump而不是echo。此外,您应该避免使用 mysql_api,因为它们已被弃用,在 PHP.net 上使用 PDO 代替 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);
于 2013-02-01T10:30:07.063 回答
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);
}
于 2013-02-01T10:32:54.420 回答
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.

注意 2: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%'”。

于 2013-02-01T10:36:52.373 回答
0

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

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

所以你现在的查询应该是

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

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

于 2013-02-01T10:37:56.680 回答
0

如果你删除 WHERE 标记 = '$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";
}
于 2013-02-01T10:43:32.140 回答