使用PDO执行高级搜索查询的问题

时间:2013-04-07 18:33:32

标签: php mysql pdo

我有以下代码,除标题字段外,所有搜索功能都有效。所以我可以按流派,日期,地点等搜索......但不是按标题搜索。当尝试按标题搜索时,根本不会返回任何内容。任何人都可以帮我这个吗?

此外,是否有一种更有效的方法来计算所有字段,然后再限制它用于分页?

$today = date("Y-m-d");
$query = "SELECT * FROM TABLE_NAME WHERE Date >= '$today'";

$bind = Array();

if ($_GET["Title"] && $_GET["Title"] != "") {
    $query .= " and Title like %?%";
    $bind['Title'] = $_GET['Title'];
}
if ($_GET["Genre"] && $_GET["Genre"] != "") {
    $query .= " and Genre like %?%";
    $bind['Genre'] = $_GET['Genre'];
}
if ($_GET["Location"] && $_GET["Location"] != "") {
    $query .= " and Location like %?%";
    $bind['Location'] = $_GET['Location'];
}
if ($_GET["Date"] && $_GET["Date"] != "") {
    $query .= " and Date = %?%";
    $bind['Date'] = $_GET['Date'];
}

$stmt = $db->prepare($query);
$stmt->execute($bind);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$num = count($rows);

$query .= " ORDER BY Date LIMIT $limit, 9";
$stmt = $db->prepare($query);
$stmt->execute($bind);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

修改:在大家的帮助之后我想我会发布我现在修改过的代码以供将来参考。事实证明其他字段不起作用,但由于if语句,所有这些都嵌套在代码中,只是没有被执行。

$today = date("Y-m-d");
$query = "SELECT * FROM TABLE_NAME WHERE Date >= '$today'";
$countq = "SELECT count(*) FROM TABLE_NAME WHERE Date >= '$today'";

$bind = Array();

if ($_GET["Title"] && $_GET["Title"] != "") {
    $query .= " and Title like :title";
    $countq .= " and Title like :title";
    $bind[':title'] = "%{$_GET['Title']}%";
}
if ($_GET["Genre"] && $_GET["Genre"] != "") {
    $query .= " and Genre like :genre";
    $countq .= " and Genre like :genre";
    $bind[':genre'] = "%{$_GET['Genre']}%";
}
if ($_GET["Location"] && $_GET["Location"] != "") {
    $query .= " and Location like :loc";
    $countq .= " and Location like :loc";
    $bind[':loc'] = "%{$_GET['Location']}%";
}
if ($_GET["Date"] && $_GET["Date"] != "") {
    $query .= " and Date = :date";
    $countq .= " and Date = :date";
    $bind[':date'] = "{$_GET['Date']}";
}

$stmt = $db->prepare($countq);
$stmt->execute($bind);
$rows = $stmt->fetchAll();
$num = count($rows);

$query .= " ORDER BY Date LIMIT $limit, 9";
$stmt = $db->prepare($query);
$stmt->execute($bind);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

1 个答案:

答案 0 :(得分:2)

  

所有搜索功能都有效

使用给定的查询不是真的

来自PDO tag wiki

  

占位符不能表示查询的任意部分,而只能表示完整的数据文字。 文字的任何部分,也不能用预处理语句替换任何复杂表达式或语法关键字。

     

首先准备全文:$ name =“%$ name%”;然后绑定它。

至于“更有效”的分页方法 - 是的,哦,是的 使用您当前的数据计数方式,您实际上不需要其他查询。因为你已经拥有了所有数据,并且可以对其进行分页 但当然它很快就会污染所有的记忆。因此,如果您想从数据库中获取行数,请计算:运行相同的查询,而不是SELECT *使其成为"SELECT count(*)

  

没有任何错误返回,这就是为什么我这么困惑

再次从PDO标签wiki:

  

必须将ERRMODE_EXCEPTION设置为连接选项,因为它会让PDO在连接错误上抛出异常。此模式是处理PDO错误的唯一可靠方法。