PHP PDO查询未读取绑定值

时间:2018-10-30 10:54:43

标签: php pdo execute

因此,我正在尝试执行以下sql查询:

$stmt = $connect->query("SELECT `FID`,`StorageID`,`DestructionDate` FROM `files` WHERE `DestructionDate` < ':date'");
$stmt->bindValue(":date",$date);
$stmt->execute();

while ($row = $stmt->fetch()) {
$fid = $row['FID'];
echo  $fid . " ";
}

上面的代码将返回文件中的所有记录,它只是完全忽略了WHERE语句,并且需要明确的是,当我在phpMyAdmin上运行相同的语句时,它运行得很好,实际上我什至尝试将值绑定到内部这样的查询本身

$stmt = $connect->query("SELECT FID,StorageID,DestructionDate FROM files WHERE DestructionDate < '$date'");

并且查询已正确执行,并且只给了我满足WHERE条件的记录,因此错误肯定在bindValue()和execute()行中。

2 个答案:

答案 0 :(得分:4)

来自docs

  

PDO::query执行一条SQL语句,返回结果集作为PDOStatement对象

您可能想要PDO::prepare()后跟PDOStatement::execute()。 (通常无需一一痛苦地绑定参数。)

此外,您在占位符周围有假引号:

':date'

您会注意到,由于参数不匹配,因此在执行语句后立即出现。

答案 1 :(得分:1)

2个解决方案:

第一:

$stmt = $connect->prepare("SELECT `FID`,`StorageID`,`DestructionDate` FROM `files` WHERE `DestructionDate` < :date");
$stmt->execute(array('date' => $date);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

第二:

$stmt = $connect->prepare("SELECT `FID`,`StorageID`,`DestructionDate` FROM `files` WHERE `DestructionDate` < ?");
$stmt->execute(array($date));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

在两种情况下,您都不需要用“引号”代替要替换的字符串(:date或?),因为PDO会解析与要匹配的列相对应的正确类型的值。