【问题标题】:MySQL query fails on integrity constraint violationMySQL 查询因违反完整性约束而失败
【发布时间】:2009-03-09 02:00:54
【问题描述】:

这个查询一直失败

违反完整性约束:1048 列 'login_name' 不能为空

我的插入语句是...

    $insertUserQuery = 'INSERT INTO `users` (
                    `login_name`,
                    `password`, 
                    `first_name`,
                    `last_name`,
                    `company_name`,
                    `company_address`,
                    `country`,
                    `email`,
                    `phone_number`,
                    `agency_type`,
                    `sold_before`,
                    `authorised`,
                    `current_module`
                    )
                    VALUES (
                   :login_name, :login_password, :first_name, :last_name, :company_name, :company_address, :country, :email, :phone_number, :agency_type, :sold_before, 0, 0);';

    $bindings = array(':login_name'      => $loginName,
                      ':login_password'  => sha1($password . Config::PASSWORD_SALT),
                      ':first_name'      => $firstName,
                      ':last_name'       => $lastName,
                      ':company_name'    => $companyName,
                      ':company_address' => $companyAddress,
                      ':country'         => $country,
                      ':email'           => $emailAddress,
                      ':phone_number'     => $phone,
                      ':agency_type'     => null,
                      ':sold_before' => null  
                      );

print_r($bindings);                 

    Db::query($insertUserQuery, $bindings);

我的数据库类可以在at another question找到。 print_r() 告诉我该数组肯定有一个值。

使用“密码”这个词可能与我有关,它也是一个 MySQL 函数?

PDO 是否以与使用 SELECT 相同的方式支持使用 INSERT 准备好的语句?

我是否需要在值周围加上引号,例如 ':login_name'?

【问题讨论】:

  • 您确定 $loginName 不为空吗?您是否尝试过调试数据库包装类? (虽然看起来还可以)
  • 是的,我已经回显了所有绑定数据,并且输出正确。
  • 请尝试以下方法,而不是使用 DB::query() 函数:$statement = DB::getInstance()->prepare($insertUserQuery); $statement->execute($bindings);另外,您可以尝试从执行()的绑定数组中的名称中删除冒号
  • @Itay Moav,绑定发生在静态类中。
  • 我认为 DB 类存在缺陷——因为它使用的是 bindParam() 而不是 bindValue()。 bindParam 期望变量通过引用传递 - 它可能是一些奇怪行为的罪魁祸首......

标签: mysql pdo


【解决方案1】:

PDO::query 不支持准备好的语句语法吗?阅读 PDO::preparePDOStatement::execute。你可能想要这样的东西:

$insertUserQuery = 'INSERT INTO `users` (`login_name`, ...) ' .
    'VALUES (:login_name, ...);';
$bindings = array(':login_name' => $loginName, ...);
$stmt = Db::prepare($insertUserQuery);
$stmt->execute($bindings);

您也可以调用$stmt->bindValue(),而不是构建绑定数组。我认为显式绑定每个值会更好一些,因为您可以在此处验证类型。

编辑:对不起,jcinacio,直到我发布后,我才看到您的评论几乎相同。

【讨论】:

  • 我认为我最好放弃我的单例模式,因为我对 PDO 进行了更多的抽象(我想这会抽象出 MySQL 特定的命令)。谢谢你的回答。
猜你喜欢
  • 2014-11-09
  • 2015-06-07
  • 2018-03-20
  • 2016-04-24
  • 2021-06-10
  • 2021-03-24
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多