因此,我正在尝试执行以下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()行中。
答案 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会解析与要匹配的列相对应的正确类型的值。