PHP Prepared语句问题

时间:2011-11-10 21:52:10

标签: php mysql mysqli prepared-statement

我收到错误消息

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

...

1 个答案:

答案 0 :(得分:1)

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

根据您的代码,您似乎正确地绑定了params,您是否测试过$ 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