-2

我正在尝试使用以下内容更新我的表:

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

但是,无论发送到请求的值如何,IsRemittedWeekly 列始终设置为 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);
4

1 回答 1

0

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

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

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


您从中获得的$_POST将始终是 data-type string
例如。因为int您必须进行类型转换:(int) $_POST["IsRemindedWeekly"].

boolean正如我在上面建议的那样,你错过了类型转换为 :

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

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

于 2020-01-29T05:06:24.717 回答