MySQL像查询不工作?

时间:2014-03-08 05:25:20

标签: php mysql sql pdo

我在PDO中成功连接到我的MySQL数据库,我正在尝试让它查询数据库中的搜索查询。

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

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

2 个答案:

答案 0 :(得分:0)

除非特别指示,否则LIKE运算符不会进行部分匹配。也许您的意思是在搜索字符串前加/附加%通配符:

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

答案 1 :(得分:0)

我没有在查询的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语句。

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