0

当我按章节编号搜索任何记录时,它就可以工作。

但问题是当我从下拉列表中选择第 1 章或第 2 章并搜索该章中包含的所有记录时。

它显示包含在 1,11,21,31...或 2,21,12,...中的所有记录,如下所示。

我知道我在那里写了“喜欢”,这就是它发生的原因。但是当我写“ = ”运算符时,我在我的代码中评论了它也对我不起作用。

解决这个问题的完美查询是什么?

我的代码:

   <?php
         include("conn.php");         
     $name=$_POST['fname'];
     $name2=$_POST['chapter'];        
         $sql="SELECT distinct * FROM $user WHERE question like '%".$name."%' and Chapter like '%".$name2."%'";
  // $sql="SELECT * FROM $user WHERE question='$name' and Chapter='$name2'";
         $result=mysql_query($sql,$connection) or die(mysql_error());
         while($row=mysql_fetch_array($result)) {           
   ?> 
4

4 回答 4

1

我很想看看返回的查询中'Chapter'的类型是什么,并尝试看看为什么相等比较不起作用。如果打字很简单(即它实际上只是普通的旧字符串),那么我会寻找空白字符或类似的东西来阻止相等比较。

同样,我想知道是否是“问题”上的相等性弄乱了您的备用查询。

猜测一下,尝试以下方法之一:

$sql="SELECT distinct * FROM $user WHERE question like '%".$name."%' and Chapter like '$name2'";

$sql="SELECT distinct * FROM $user WHERE question like '%".$name."%' and Chapter='$name2'";

哦,你真的应该做一些事情来正确地转义这些参数以避免任何讨厌的 SQL 注入攻击。

于 2013-09-03T12:17:43.900 回答
0

问题是第一个查询的这一部分:

Chapter like '%".$name2."%'

如果=不起作用,那么我可以想到两件事。第一个Chapter是真的是一个列表,可能是一个逗号分隔的列表。二是数据库中有多余的字符。

如果Chapter真的是一个列表,请find_in_set()改用:

find_in_set($name2, Chapter) > 0
于 2013-09-03T12:11:20.367 回答
0

您查询中的主要问题在本节中

比如'%".$name."%'

只需从您编写的整个查询中删除 % 符号,然后检查您的查询是否可以正常工作。

于 2013-09-03T12:21:02.857 回答
0

您在 SQL 查询中直接使用 $_POST 变量,这会使您容易受到 SQL 注入攻击。请查看此页面以了解解决方法: http: //bobby-tables.com/php.html。您应该使用其中一个mysql_real_escape_string或准备好的语句(更好)。最好的解决方案可能是使用PDO

此外,如果您想要更好的答案,请格式化您的问题以便于阅读,包括示例输入、输出和数据库内容,并确保您的代码正确缩进。

我现在只能假设您的数据库字段可能包含比您要匹配的数据更多的数据。前导/尾随空间还是什么?

于 2013-09-03T12:11:27.120 回答