MySQL/PHP中使用百分号的LIKE查询无效

4

我知道这个问题之前已经问过多次了,但是我无法找到我的错误所在。

问题:当使用mysql_num_rows时,它返回错误的结果。

$sql = "SELECT * FROM $topic WHERE $names LIKE '%$q%'";

但是,如果我将 $sql 替换为以下任何一个,它都会返回 true。

$sql = "SELECT * FROM $topic WHERE $names LIKE '%j%'";
$sql = "SELECT * FROM $topic WHERE $names ='Jack'";
$sql = "SELECT * FROM $topic WHERE $names = '$q' ";

var_dump结果

string(8) "Cust_Reg" string(5) "fName" string(2) "j " 
resource(8) of type (mysql result) 
string(46) "SELECT * FROM Cust_Reg WHERE fName LIKE '%j %'"

如果我改变$sql = "SELECT * FROM $topic WHERE $names LIKE '%j%'";

$row['ID']的var_dump将会显示

"SELECT * FROM Cust_Reg WHERE fName LIKE '%j%'" string(4) "NjA=" 
string(4) "NjE=" string(4) "NjQ=" string(4) "NjY=" string(4) "ODI="

如果您能纠正我错误的地方,我将不胜感激。
    $q = mysql_real_escape_string($_GET['search']);
    $q = strtolower($q);
    $topic = mysql_real_escape_string($_GET['test']);
    $names = mysql_real_escape_string($_GET['name']);

    // SELECT * from Account_Reg where Account_Name LIKE '%$q%'
    $table = "<table style='width:400px; padding:10; display:block;'><tbody>            
                <tr><td>ID</td><td>Account</td><td>First Name</td><td>Email</td></tr>"; 

        $sql = "SELECT * FROM $topic WHERE $names LIKE '%{$q}%'";
        $result = mysql_query($sql) or die (mysql_error());

        var_dump($topic);
        var_dump($names);
        var_dump($q);   
        var_dump($result);
        var_dump($sql); 

    if(is_resource($result) && mysql_num_rows($result) > 0){

        while($row = mysql_fetch_array($result)) {                              
            $table .= "<tr><td>".$row['ID']."</td>";
            $cryt = base64_encode($row['ID']);
            $row['ID'] = htmlspecialchars($cryt);
            $link = "profile.cust.update.php?id=". urlencode($row['ID']);
            $link = htmlentities($link);    

            if($names == "fName"){      
                $name = $row['fName'];

            }elseif($names == "Account_Name"){
                $name = $row['Account_Name'];
                $row['email_add'] = "";     
            }   

            $table .="<td></td><td><a href='" .$link ."'</a>"  .$name."</td><td>".$row['email_add']."</td></a> </tr>";
        }$table .="</tbody</table";
  }else{$table = "No row is selected"; }

var_dump( $_GET['search'] )сђѓтюеТѓетйЊтЅЇуџёТхІУ»Ћтю║ТЎ»СИГ№╝їт«Ѓт«ъжЎЁтїЁтљФС╗ђС╣ѕ№╝Ъ - nobody
2个回答

4

尝试使用以下方法:

$sql = "SELECT * FROM $topic WHERE $names LIKE '%{$q}%'";

或者

$sql = "SELECT * FROM $topic WHERE $names LIKE '%" . $q . "%'";

而且在调试时,尝试在执行之前输出 $sql,以查看变量是如何被替换的。

echo $sql; die();

@AdamWaite 来自文档:

http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html

MySQL提供标准的SQL模式匹配和一种基于扩展正则表达式的模式匹配,类似于Unix实用程序(如vi、grep和sed)所使用的。

SQL模式匹配使您可以使用“_”来匹配任何单个字符,“%”来匹配任意数量的字符(包括零个字符)。在MySQL中,SQL模式默认情况下是不区分大小写的。这里显示了一些示例。当使用SQL模式时,不要使用=或<>;而应该使用LIKE或NOT LIKE比较运算符。


使用phpMyAdmin如何查询? - Marek Sebera
SELECT * FROM Cust_Reg WHERE fName LIKE '%j%'; 将会返回5行...var_dump确认了字符串...但是LIKE似乎并没有像$string那样正确工作。 - crash_course
呵呵,你还没有理解我的意思。我想让你在问题中添加变量($_GET、$sql和$result)的var_dump命令输出,而不是在问题主题中添加那一行。 - Marek Sebera
百分号(%)符号在编程中有什么作用?或者它叫什么名字?在谷歌上找不到任何相关信息,可能是输入的关键词不正确。 - Adam Waite
1
@AdamWaite 我在答案底部添加了解释。 - Marek Sebera
显示剩余3条评论

1
问题在于您的 $q 中存在尾随空格,即"j "
"SELECT * FROM $topic WHERE $names LIKE '%$q%'"

这个短语的意思是:

"SELECT * FROM $topic WHERE $names LIKE '%j %'"

与以下代码返回不同的结果:

"SELECT * FROM $topic WHERE $names LIKE '%j%'"

你是正确的!header('Location: account.search.php?search='. urlencode($_GET['search']). ' &&test='. urlencode($_GET['test']).'&&name='. urlencode($_GET['name'])); 它确实有一个空格...再次感谢Stackoverflow社区! - crash_course

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