1

このクエリは失敗し続けます

整合性制約違反: 1048 列 'login_name' を null にすることはできません

私の挿入文は...

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

私のデータベース クラスは別の質問にあります。はprint_r()、配列が確実に値を持っていることを示しています。

MySQL の機能でもある「パスワード」という単語を使用していることに関係があるのでしょうか?

PDO は、SELECT の場合と同じように、INSERT の準備済みステートメントをサポートしますか?

':login_name' のように、値を引用符で囲む必要がありますか?

4

1 に答える 1

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 さん、申し訳ありません。投稿するまで、あなたのコメントがほぼ同じであることに気付きませんでした。

于 2009-03-09T02:47:15.677 に答える