MySQL / PHP как с процентами не работает - PullRequest
4 голосов
/ 30 августа 2011

Мне известно, что этот вопрос задавался несколько раз ранее, но я не могу найти ошибку в моих путях.

Вопрос: 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% '";

var_dump для $ row ['ID'] отобразит

"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"; }

Ответы [ 2 ]

4 голосов
/ 30 августа 2011

попробуйте использовать:

$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.

1 голос
/ 30 августа 2011

Проблема в том, что в вашем $ q "j " есть пробелы в конце.Конечно,

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

, что переводится как:

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

возвращает различные результаты из:

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