我有以下代码,除标题字段外,所有搜索功能都有效。所以我可以按流派,日期,地点等搜索......但不是按标题搜索。当尝试按标题搜索时,根本不会返回任何内容。任何人都可以帮我这个吗?
此外,是否有一种更有效的方法来计算所有字段,然后再限制它用于分页?
$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);
答案 0 :(得分:2)
所有搜索功能都有效
使用给定的查询不是真的
来自PDO tag wiki:
占位符不能表示查询的任意部分,而只能表示完整的数据文字。 文字的任何部分,也不能用预处理语句替换任何复杂表达式或语法关键字。
首先准备全文:$ name =“%$ name%”;然后绑定它。
至于“更有效”的分页方法 - 是的,哦,是的
使用您当前的数据计数方式,您实际上不需要其他查询。因为你已经拥有了所有数据,并且可以对其进行分页
但当然它很快就会污染所有的记忆。因此,如果您想从数据库中获取行数,请计算:运行相同的查询,而不是SELECT *
使其成为"SELECT count(*)
没有任何错误返回,这就是为什么我这么困惑
再次从PDO标签wiki:
必须将
ERRMODE_EXCEPTION
设置为连接选项,因为它会让PDO在连接错误上抛出异常。此模式是处理PDO错误的唯一可靠方法。