2011-08-30 113 views
3

我知道这个问题以前已经被问过好几次了,但是我无法找到我的方式的错误。MySQL/PHP like百分号不起作用

问题:mysql_num_rows是返回false结果时

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

但是,如果我取代以下任何$ sql中,它将返回true。的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%'"; 
$sql = "SELECT * FROM $topic WHERE $names ='Jack'"; 
$sql = "SELECT * FROM $topic WHERE $names = '$q' "; 

结果如果我改变$ SQL = “SELECT * FROM $话题,其中$名称LIKE '引用%j%'”;

的var_dump为$行[ 'ID']将显示

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

如果你能纠正我在我的方式错误,我会apprecaite它。

$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"; } 
+0

'的var_dump($ _GET [ '搜索'])'。它在你当前的测试场景中实际上包含了什么? – nobody

回答

1

问题是您的$ q "j "中的尾随空格。当然

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

其转换为:

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

返回不同的结果来自:

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

你是对的! ('_位置:account.search.php?search ='。urlencode($ _ GET ['search'])。'&& test ='。urlencode($ _ GET ['test'])。'&& name ='。urlencode(' $ _GET [ '名称']));它确实有一个空间...再次感谢Stackoverflow社区! –

4

尝试使用:

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

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

和调试,尝试输出$ SQL执行前,怎么看变量已被替换

echo $sql; die(); 

从文档210

@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比较运算符。

+1

这应该做到这一点。 – Layke

+0

nope,结果仍然是false –

+0

试图调试查询?看看它是怎么样的,并尝试通过phpMyAdmin或mysql控制台执行它 –