2012-03-21 8 views
1

ここに私のコードです(または機能?):PHP ADOdbのアクティブレコード::置き換え()バグ

$user->user_id = 3; 
$user->email=''; 
$user->password=md5('123456'); 
$user->Replace(); 

それはSQLを生成:

UPDATE pre_user SET email=,password='e10adc3949ba59abbe56e057f20f883e' WHERE user_id=3 

ちょうどあなたが見ることができるもののように、空文字列の引用符はありません。その後、私はADODB-アクティブrecord.inc.phpで)(doquoteを機能させるコードは、次のとおり631と怒鳴るコードを見つけました:

case 'C'://I think this means 'Char' and email field should be this. 
    case 'X': 
     if (is_null($val)) return 'null'; 

     if (strlen($val)>0 && 
      (strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) { 
      return $db->qstr($val); 
      break; 
     } 

strlenを場合、それは($ val)で伝えます> 0 ...

空の文字列に引用符を追加しないのはなぜですか?

答えて

0

$user->email=''はnullでなく長さが0で、doquote()はこの特定のシナリオを処理しません。

$user->email = NULL; 

をしかし、あなたのデータベースには、そのフィールドのNULL値を許可することがあります。

あなたは試すことができます。

+0

? update/saveのような他の関数では、すべて空文字列に引用符を追加します。 – missingcat92

0

adodb-active-recordを使用して同じバグが発生しました。 メタタイプルックアップ機能adodb-datadict.inc.phpは、Email列を 'X'にマップする 'LVARCHAR'として分類する責任があると私は信じています。

これは、doquoteコードが長さゼロの文字列の場合をキャッチしない理由です。

私はに調整する場合を「X」追加することによって、自分のコードベースでこれを固定:

シナリオを処理しませdoquoteなぜ
case 'X': 
    if (is_null($val)) return 'null'; 

    if (strlen($val)>0 && 
     (strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) { 
     return $db->qstr($val); 
     break; 
    } 
    else { 
     return 'null'; 
     break; 
    } 
関連する問題