【问题标题】:MySQL like query not working?MySQL之类的查询不起作用?
【发布时间】:2014-04-11 12:12:26
【问题描述】:

我在 PDO 中成功连接到我的 MySQL 数据库,我目前正试图让它查询数据库中的 itmes,例如搜索查询。

<?php
include ('connection.php');

function doSearch() {
    $output = '';
    if(isset($_POST['search'])) {
        $searchq = $_POST['search'];
        $searchq = preg_replace ("#[^0-9a-z]#i","",$searchq);
    $sql = "SELECT * FROM entries WHERE name LIKE :searchq or description LIKE :searchq or content LIKE :searchq";

    global $conn;
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(":searchq",$searchq,PDO::PARAM_STR);
    $stmt->execute();
    $count = $stmt->rowCount();
 if($count == 0) {
            $output = 'No results found, buddy.';
        } else {
            while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                $eName = $row['name'];
                $eDesc = $row['description'];
                $eCont = $row['content'];
                $id = $row['id'];
                $elvl = $row['level'];
                $ehp = $row['hp'];

                $output .= '<tr><td><a href="http://ccc.aaaa.whatever/' .$eName. '" onclick="document.linkform.submit();">'.$eName.'</a></td><td>'.$eDesc.'</td><td>'.$elvl.'</td><td>'.$ehp.'</td></tr>';
            }
        }            

    return $output;
    }
 }
?>

我正在努力让它搜索。除非查询仅与名称完全匹配,否则不会显示任何结果。

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:

    LIKE 运算符不会进行部分匹配,除非有明确指示。也许您的意思是在搜索字符串之前/附加一个% 通配符:

    $searchq = '%' . $searchq . '%';
    

    【讨论】:

    • 我试过了,这实际上阻止了搜索工作。当我想到它时,问题可能出在“或”语句上。因为它现在只会搜索名称。
    • 真的吗?您可以发布您使用的代码吗? OR 应该没问题
    • 哦,既然您已经编辑了答案,我知道我可能错过了一些东西,让我试一试。
    • 不,这会破坏它。你可以自己试试这个页面,seersvillage.com/v1.3/search.php。搜索僵尸,它的描述中也有亡灵。搜索亡灵,僵尸不显示。我还添加了另一个条目,搜索 Meep。什么都没有出现。
    【解决方案2】:

    我在查询的 SQL 文本中没有发现任何错误。

    最简单的解释是,您希望发送到数据库的 SQL 不是正在发送的。

    我建议你试试这个:

    在语句中使用唯一绑定变量名,每个绑定变量只使用一次。

    曾经在 PDO 中存在一个带有命名绑定变量的错误(不确定是否已修复。在幕后,命名绑定参数被转换为位置符号,并且当同一个绑定变量两次或更多次时,发送到 MySQL 的查询不是我们所期望的。

    例如:

     $sql = "SELECT e.* 
               FROM entries e
              WHERE e.name        LIKE :searchq1
                 OR e.description LIKE :searchq2
                 OR e.content     LIKE :searchq3";
    
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(":searchq1",$searchq,PDO::PARAM_STR);
    $stmt->bindParam(":searchq2",$searchq,PDO::PARAM_STR);
    $stmt->bindParam(":searchq3",$searchq,PDO::PARAM_STR);
    

    当我们遇到问题时,我们没有使用服务器端准备好的语句,只是常规的客户端准备;发送到服务器的 SQL 包括文字,而不是占位符。在 MySQL 中打开 general_log 可以让我们看到发送到数据库的实际 SQL 语句。

    您可能会遇到同样的问题。但我建议将此作为调试问题的一个步骤,至少可以验证它不是问题所在。

    【讨论】:

    • 您好,SELECT e.* 与 SELECT * 相比会做什么?
    • ALSO:我发现它没有显示其中有空格的结果。我以为这就是 preg_replace 的用途?那么问题可能是它卡在那里了?
    • @Jack Miller: SELECT e.*SELECT * 在这个查询的上下文中是完全一样的;没有区别。 preg_replace 的结果是您可以 echo 或 printf 的结果。您也可以尝试用bindValue 代替bindParam。不幸的是,debugDumpParams 不显示参数的实际值,只显示占位符及其类型。另请注意foo LIKE 'bar'foo = 'bar' 相同。要获得通配符匹配,您需要包含通配符 _%,例如foo LIKE 'bar%' 查找以 'bar' 开头的 foo。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多