0

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

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

$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);
4

1 回答 1

2

所有搜索功能都有效

对于给定的查询,它是不正确的

来自PDO 标签维基

占位符不能代表查询的任意部分,而只能代表完整的数据文字。文字的任何部分,或者任何复杂的表达式或语法关键字都不能用准备好的语句替换。

首先准备完整的文字: $name = "%$name%"; 然后绑定它。

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

没有返回任何错误,这就是我如此困惑的原因

再次从 PDO 标签维基:

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

于 2013-04-07T18:39:53.253 回答