【问题标题】:Getting array(0) { } when i should get results当我应该得到结果时获取数组(0){}
【发布时间】:2019-03-14 12:38:13
【问题描述】:

最近几天我一直在尝试,但我就是想不通。我有一个过滤器页面,用户可以在其中选择 start_date、end_date、client 和 payment_status。 Client 和 payment_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
数组(0){}

上面是 $_POST 输入和空数组。我不知道在哪里看。

编辑: SELECT * from service where(date BETWEEN '2019-01-01'AND '2019-07-03') AND clientId=1 AND payment_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 获取数据或只是获取数据?我什么时候需要执行,什么时候可以获取?谢谢

【问题讨论】:

  • 你能显示你对数据库执行的查询吗? (显示结果)
  • 不是缺少$query->execute() 吗?
  • @FatFreddy 说了什么^,您应该将PDO::PARAM_INT 添加到$client 和$payed 作为-&gt;bindParam 的第三个参数。您可能不需要在 :date_start 和 :date_end 周围加上 '' 引号,PDO 会自动引用它们,因为它们的类型为 PDO::PARAM_STR。
  • 当我添加 PDO::PARAM_INT - 同样发生。当我在下面添加 $query-execute(); - 我收到此错误:致命错误:未捕获的 PDOException:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与...中的标记数量不匹配
  • @svrdoljak 你能展示你更新的代码吗? (在上述所有更改的最佳情况下)

标签: php mysql pdo


【解决方案1】:

您收到“..number of bound variables ...”错误,因为正如@Xatenev 所说,您不需要在位置标记周围加上引号。您要求 PDO 准备的是字符串 '...BETWEEN :date_start AND ...,即它查找可能不存在的 STRING VALUE OF ':date_start' 的日期,而不是查找值为 :date_start 的日期值。 如果应该是这样的:

from service where(date BETWEEN :date_start ..... 

只是稍微扩展一下,实际的错误会发生,因为您尝试绑定每个引用占位符的值,但 PDO 根本看不到这些占位符,因为它只能解释您添加的一些字符串和两个占位符

如果您删除引号,则它不再将其视为字符串并将其视为预期的位置标记

更新 -

Re OPs cmets 关于不太了解,假设你有一个变量$values

$values[] 根据输入包含“果酱”、“面包”或“花生酱”。 因此,您想插入一个名为 Sandwich_parts 的表,然后根据输入(或选择,或任何循环)创建查询

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);
}

这将在 execute() as 上发送到 mysql

INSERT INTO sandwich_parts (part) values (':value')
INSERT INTO sandwich_parts (part) values ('jam')
INSERT INTO sandwich_parts (part) values (':value')
INSERT INTO sandwich_parts (part) values ('bread')
INSERT INTO sandwich_parts (part) values (':value')
INSERT INTO sandwich_parts (part) values ('peanut butter')

因为第一个插入总是读取字符串':value',而第二个插入看到位置标记并绑定参数,因此每次第一个查询都会出错,因为它看不到将值绑定到的占位符

我希望对您的理解有所帮助,基本上,您不需要引用占位符,这就是绑定过程的用途

【讨论】:

  • 谢谢!现在工作正常。我把答案放在 EDIT 3 中。你能解释一下我在 EDIT 3 中提出的执行问题吗?非常感谢!
  • 并非没有一些示例代码,您可能最好搜索该问题,或发布新问题。当您认为您没有执行正在使用的查询时,我会冒险猜测(但非常粗略的猜测) ->query("select...etc") 而不是准备查询和绑定值跨度>
  • 还是谢谢!我会做我的研究:) 但是为什么我需要删除引号仍然有点令人困惑。
  • @svrdoljak 请查看更新的答案以获得更多解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多