我应该得到结果时得到array(0){}

时间:2019-03-14 12:38:14

标签: php mysql pdo

最近几天我一直在尝试,但是我无法弄清楚这个。我有一个过滤器页面,用户可以在其中选择开始日期,结束日期,客户和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来获取数据还是只是获取吗?我什么时候需要执行,什么时候可以获取?谢谢

1 个答案:

答案 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',而第二个插入项则看到位置标记并绑定了参数,因此每次第一次查询都会出错,因为它看不到将值绑定到的占位符

我希望这可以帮助您稍微了解一下,基本上,您不需要引用占位符即是绑定过程的目的