最近几天我一直在尝试,但是我无法弄清楚这个。我有一个过滤器页面,用户可以在其中选择开始日期,结束日期,客户和paying_status。客户和paying_status引用主服务表。
我什至回显了所有的$ _POST并获得正确的输入,但是我的SQL查询没有产生任何结果。当我在数据库上运行相同的查询时,我得到正确的结果。这些天来,我看不到任何错误,或者我对自己的错误视而不见。
<?php
include "../controller/session.php";
include "../controller/pdo.php";
$submit = isset($_POST["filter-submit"]) ? $_POST["filter-submit"] : "";
$date_start = isset($_POST["date_start"]) ? $_POST["date_start"] : "";
$date_end = isset($_POST["date_end"]) ? $_POST["date_end"] : "";
$client = isset($_POST["client"]) ? $_POST["client"] : "";
$payed = isset($_POST["payed"]) ? $_POST["payed"] : "";
echo $date_start . "<br>" . $date_end . "<br>" . $client . "<br>" . $payed . "<br>";
if ($submit == "Filter") {
$query = $db->prepare("SELECT * from service where(date BETWEEN ':date_start'AND ':date_end') AND clientId=:client AND paying_status=:payed;");
$query->bindParam(':date_start', $date_start);
$query->bindParam(':date_end', $date_end);
$query->bindParam(':client', $client);
$query->bindParam(':payed', $payed);
$results = $query->fetchAll(PDO::FETCH_OBJ);
var_dump($results);
}
2019-01-01
2019-07-03
1
1
array(0){}
上面是$ _POST输入和空数组。我不知道在哪里看。
编辑: 从服务中选择*(日期在'2019-01-01'和'2019-07-03'之间)AND clientId = 1 AND paying_status = 1; 这在我的数据库上工作正常。
编辑2:更新了代码。仍然不起作用。
if ($submit == "Filter") {
$query = $db->prepare("SELECT * from service where(date BETWEEN ':date_start'AND ':date_end') AND clientId=:client AND paying_status=:payed;");
$query->bindParam(':date_start', $date_start);
$query->bindParam(':date_end', $date_end);
$query->bindParam(':client', $client, PDO::PARAM_INT);
$query->bindParam(':payed', $payed, PDO::PARAM_INT);
$query->execute();
$results = $query->fetchAll(PDO::FETCH_OBJ);
var_dump($results);
}
编辑3:
if ($submit == "Filter") {
$query = $db->prepare("SELECT * from service where(date BETWEEN :date_start AND :date_end) AND clientId=:client AND paying_status=:payed;");
$query->bindParam(':date_start', $date_start);
$query->bindParam(':date_end', $date_end);
$query->bindParam(':client', $client, PDO::PARAM_INT);
$query->bindParam(':payed', $payed, PDO::PARAM_INT);
$query->execute();
$results = $query->fetchAll(PDO::FETCH_OBJ);
var_dump($results);
}
这有效!有人可以解释为什么我有时需要执行查询,而有时我只能使用fetchAll来获取数据还是只是获取吗?我什么时候需要执行,什么时候可以获取?谢谢
答案 0 :(得分:1)
您收到“ ..绑定变量数...”错误,因为正如@Xatenev所说,您不需要在位置标记周围加引号。您要PDO准备的是字符串'...BETWEEN :date_start AND ...
,即它查找STRING VALUE OF':date_start'可能不存在的日期,而不是查找具有{{1 }}。
如果应如下所示:
:date_start
只是略微扩展,然后会出现实际错误,因为您尝试绑定每个引用的占位符的值,但是PDO根本看不到这些占位符,因为它可以解释的只是您添加的一些字符串和两个占位符
如果删除引号,它将不再将其视为字符串,而是将其视为预期的位置标记
更新-
关于OP不太了解的评论,假设您有一个变量from service where(date BETWEEN :date_start .....
$ values []包含“果酱”,“面包”或“花生酱”,具体取决于输入。 因此,您想插入一个名为sandwich_parts的表中,并根据输入(或选择或循环进行查询)创建查询
$values
这将在execute()上发送给mysql
foreach($values as $value){
$q1->prepare("INSERT INTO sandwich_parts (part) values (':value'));
$q2->prepare("INSERT INTO sandwich_parts (part) values (:value));
$q->bindValue(':value',$value,PDO::PARAM_STR);
}
因为第一个插入项始终读取字符串':value',而第二个插入项则看到位置标记并绑定了参数,因此每次第一次查询都会出错,因为它看不到将值绑定到的占位符
我希望这可以帮助您稍微了解一下,基本上,您不需要引用占位符即是绑定过程的目的