PDO无效的布尔参数



我正在尝试使用以下方法更新我的表:

$stmt = $db->prepare("
UPDATE Business SET
Business.Name = ?,
Business.Phone = ?,
Business.Fax = ?,
Business.Address = ?,
Business.City = ?,
Business.StateId = ?,
Business.Zip = ?,
Business.Referral = ?,
Business.IsRemindedWeekly = ?,
Business.DeletedOn = ?
WHERE
Business.BusinessId = ?");
// Execute the query
$stmt->execute(array(
$_POST["Name"],
$_POST["Phone"],
$_POST["Fax"],
$_POST["Address"],
$_POST["City"],
$_POST["StateId"],
$_POST["Zip"],
$_POST["Referral"],
$_POST["IsRemindedWeekly"],
($_POST["DeletedOn"] && $_POST["DeletedOn"] != "0000-00-00" ? $_POST["DeletedOn"] : null),
$_POST["BusinessId"]
));

我的架构如下所示:

CREATE TABLE `business` (
`BusinessId` int(11) NOT NULL,
`Name` varchar(255) NOT NULL,
`Phone` char(10) DEFAULT NULL,
`Fax` char(10) DEFAULT NULL,
`Address` varchar(255) DEFAULT NULL,
`City` varchar(64) DEFAULT NULL,
`StateId` int(11) DEFAULT NULL,
`Zip` char(5) DEFAULT NULL,
`Signature` blob DEFAULT NULL,
`Referral` varchar(255) DEFAULT NULL,
`IsRemindedWeekly` bit(1) NOT NULL DEFAULT b'0',
`DeletedOn` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

但是,无论发送到请求的值如何,"IsRemindedWeek"列始终设置为 1。检查网络选项卡时,有效负载似乎正在发送字符串值"1",但即使我将参数化值更改为:

($_POST["IsRemindedWeekly"] == "1" ? 1 : 0)

(请注意非类型比较运算符(但无论如何,更新操作后我的数据库中的值仍然是 1。我错过了什么吗?

更新

我对线程被关闭有点沮丧,因为我仍然遇到困难。我决定使用bindValue但它仍然不起作用。我试过:

// Passing a 1 or 0 with PARAM_INT always returns false
$stmt->bindValue(":isRemindedWeekly", ($_POST["IsRemindedWeekly"] == "1" ? 1 : 0), PDO::PARAM_INT);
// Passing a 1 or 0 with PARAM_BOOL always returns false
$stmt->bindValue(":isRemindedWeekly", ($_POST["IsRemindedWeekly"] == "1" ? 1 : 0), PDO::PARAM_BOOL);
// Passing a true or false with PARAM_INT always returns false
$stmt->bindValue(":isRemindedWeekly", $_POST["IsRemindedWeekly"], PDO::PARAM_INT);
// Passing a true or false with a PARAM_BOOL always returns true
$stmt->bindValue(":isRemindedWeekly", $_POST["IsRemindedWeekly"], PDO::PARAM_BOOL);

当它期望PDO::PARAM_BOOL时,你可能应该为它提供boolean

$_POST["IsRemindedWeekly"] == "1" // this evaluates to boolean

虽然将列更改为TINYINT并使用01通常更容易,因为您必须将 bindValue(( 的数据类型定义为int $data_type = PDO::PARAM_BOOL。这可能是一个品味问题,因为这两种方法都没有错 - 但在读取时转换为boolean比写入时要省力。


您从$_POST中得到的内容将始终是数据类型string
例如。对于int,您必须键入:(int) $_POST["IsRemindedWeekly"].

而且您缺少要boolean的类型转换,正如我上面建议的那样:

$stmt->bindValue(":isRemindedWeekly", $_POST["IsRemindedWeekly"] == "1", PDO::PARAM_BOOL);

另请参阅类型 Juggling 的 PHP 手册,这非常重要。

最新更新