【问题标题】:PHP Prepared statements issuePHP Prepared statements 问题
【发布时间】:2011-11-10 21:52:10
【问题描述】:

我收到错误消息

Column 'fname' cannot be null 

事实上它不为空。我认为绑定有问题。我也需要绑定 NOW() 吗?

$stmt = $db->prepare("INSERT INTO `users` (`fname`, `mname`, `lname`, `email`, `pass`, `reg_dt`) VALUES (?, ?, ?, ?, ?, NOW())") or die(htmlspecialchars($db->error));

$rc = $stmt->bind_param("sssss", $fname, $mname, $lname, $email, $pass) or die(htmlspecialchars($stmt->error));

??

【问题讨论】:

  • 您可以在表中使用非空值和时间戳。另外,您不需要绑定 NOW();
  • 我不想在行更新时更新时间戳
  • 能否提供你绑定的变量的内容?
  • +1 到@Marcus,更具体地说,您确定$fname 是一个具有非null 值的PHP 变量吗?

标签: php mysql mysqli prepared-statement


【解决方案1】:

您的架构可能具有 fname 的 NOT NULL 属性,这就是您收到 null 错误的原因。

根据您的代码,您似乎正确绑定了参数,您是否测试过 $fname 是否实际上是一个值?

为了清楚起见,另一种构造(我个人不喜欢 ?, ?, ? 绑定)。另外,让我通过说它是 PDO,而不是 mysqli 来限定以下代码,OP 没有指出正在使用哪个,它仅用于演示目的:

$sql = 
    "INSERT INTO `users` " .
    "SET fname = :fname, " .
    "mname = :mname, " .
    "lname = :lname, " .
    "email = :email, " .
    "pass = :pass, " .
    "reg_dt = NOW()";

$stmt = $db->prepare($sql);

$stmt->bindValue(':fname', $fname, PDO::PARAM_STRING);
$stmt->bindValue(':mname', $mname, PDO::PARAM_STRING);
$stmt->bindValue(':lname', $lname, PDO::PARAM_STRING);
$stmt->bindValue(':email', $email, PDO::PARAM_STRING);
$stmt->bindValue(':pass', $pass, PDO::PARAM_STRING);

或者,如果您不喜欢该构造,您可以考虑在时间戳列中添加 CURRENT_TIMESTAMP 属性:

`reg_dt` timestamp NULL default CURRENT_TIMESTAMP

【讨论】:

  • 在我看来像 PDO。语法并没有“完全”错误,只是在我复制/粘贴时忘记从后续行中删除 SET。
  • @Phil:见us3.php.net/manual/en/pdostatement.bindparam.phpINSERT 语法具体有什么问题?您指向 MySQL 文档的链接,例如 #2 备份,我可以做一个 SET 然后用逗号分隔的列和值列表。更不用说我只是从命令行运行相同的查询来确保。
  • 我诚挚的歉意。不知道 MySQL 对 INSERT 语法的混杂。如果您要推送 PDO(我给了 +1),您可能需要解释它与 OP 当前使用的 mysqli 库不同
猜你喜欢
  • 2014-03-29
  • 2015-07-14
  • 1970-01-01
  • 2012-08-23
  • 2013-08-25
  • 1970-01-01
  • 2016-10-25
  • 2013-05-05
  • 2015-09-03
相关资源
最近更新 更多