2012-06-04 21 views
5

時にはnullまたは空の値を持つ配列があります。 MySqlでは、それらはヌル可能ではないように設定されていますが、デフォルト値が割り当てられています。なぜ、MySqlは私にエラーを与えますか? Column user_type can not be null。 (私は厳格なモードで実行していない)。このPHP/mysqlのinsert文でnullを処理する方法

私は、クエリを準備するときに値の代わりにキーワードDEFAULTを使用できることを認識していますが、実際にはそれをしたくありません。たとえば、私は使用したいと思います。"INSERT INTO users (user_type, first_name, last_name, password) VALUES (:user_type, :first_name, :last_name, :password)";

私が思い出す限り、これはうまくいきました(つまり、正しいデフォルトで)私が使用するから移動するまで?名前付きパラメータ...

おかげで...

+0

「NULL」であっても、このようにすることはできません:バウンドの際に値*が送られている(全く表示されるため!)と思われます。したがって、値*が指定されたため、MySQLはデフォルト値を適用できません。トリガーはありますが、 "ick!" 1つの「解決策」は、Mapと呼ばれる最小限のクエリージェネレーターを持つことです。 (まだプレースホルダーを使用しています。) –

+0

あなたはPHPについて話していますか?あなたは "Array"について言及しているので、おそらくArrayという言葉に言及する価値はありません –

+0

(同じ挿入構造を持つ '?'マーカーを使って作業していたとは思いません。仕事、どのような魔法を参照してください。) –

答えて

1

にクエリマーカーIをパラメータとして値を受け入れる関数を作成します。連想配列にはデフォルト値があります。いずれかのパラメータの値がNULLの場合、デフォルトの値に置き換えられます。

例えば

function setUpQuery($user_type_in, $first_name_in, $last_name_in, $password_in){ 
     $default_values('user_type' => 'Admin', 'first_name' => 'John', 'last_name' => 'Doe', 'password' => 'XXX'); 
     $user_type = ($user_type_in == NULL)? $default_values['user_type']:$user_type_in; 
     ..... 
     return "INSERT INTO users (user_type, first_name, last_name, password) VALUES ('$user_type', '$first_name', '$last_name', '$password');" 
} 

良い点。

INSERT INTO users(user_type, first_name, last_name,password) values 
(ifnull('$user_type',default(user_type)), ifnull('$first_name', default(first_name)), 
ifnull('$last_name',default(last_name)), ifnull('$password', default(password)); 
+0

これは、 DBのデフォルト値を使用しないという重大な欠点があります。 –

+0

@hgolov、私は、SQL文(およびそのPDOの対応部分)を静的に作成することを望んでいました。これらは、階層マッパークラスの静的メンバーであるため動的ではありません。私は "if!isset($ this - > _ PDOInsert){...}のようなチェックを行います。デフォルトの()関数のアプローチは動作しません。 staticメンバーが設定されています) –

+0

これを解決済みとマークしています。あなたのpdoコードでうまくいきましたか? – hgolov

関連する問題