PHP PDO 查询未读取绑定值

PHP PDO Query isn't reading bind values

所以我正在尝试执行以下 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 . " ";
}

上面的代码将 return 文件中的所有记录,它根本忽略了 WHERE 语句,只是为了清楚起见,当我 运行 在 phpMyAdmin 上使用相同的语句时 运行很好,事实上我什至试过像这样在查询本身中绑定值

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

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

来自docs

PDO::queryExecutes an SQL statement, returning a result set as a PDOStatement object

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

此外,您在占位符周围使用了伪造的引号:

':date'

您会注意到,一旦您执行该语句,因为参数不匹配。

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

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