2016-07-28 7 views
1

APIからデータを保存していて、ON DUPLICATE KEY UPDATEを実行しています。 、(0行が挿入された)私はphpMyAdminの中に手動でSQLを実行し、それが動作する以下のerrorInfo()MySQL PDO - 重複していないKEY UPDATEは変更がない場合にfalseを返しますか?

Array ([0] => 00000 [1] => [2] =>) 

で、事はそれが周りに行く最初にエラーが発生することなく保存されたということですが、連続して実行するにはfalseを返します変更が加えられていない場合はfalseを返しますか?ここで恐ろしいコードの

私の謝罪は、PDOインスタンスは$this->db (私はこの機能にいくつかのJSONを保存していますので、通常は下ので、「メークによる」ソリューション、:にerroringた脱出の準備として保存されます)

public function update($table, $valuePairs) 
{ 
    $columns = ''; 
    $values = ''; 
    $updates = ''; 
    foreach ($valuePairs as $column => $value) 
    { 
     if($value !== null and $value !== '') { 
      $columns .= '`'.$column.'`, '; 
      $values .= $this->db->quote($value).', '; 
      $updates .= '`'.$column.'` = VALUES(`'.$column.'`), '; 
     } 
    } 
    $columns = rtrim($columns, ', '); 
    $values = rtrim($values, ', '); 
    $updates = rtrim($updates, ', '); 

    $sql = 'INSERT INTO '.$table.' ('.$columns.') 
      VALUES ('.$values.') 
      ON DUPLICATE KEY UPDATE '.$updates; 

    $result = $this->db->exec($sql); 
    if(!$result) 
    { 
     print_r($this->db->errorInfo()); 
     echo '<br><br>'; 
    } 

    return $result; 
} 
+0

あなたのコードを教えてもらえますか? –

+0

質問が更新されました。 –

答えて

2

のはPDO::exec() manual pageを注意深く見てみましょう:

戻る

PDO :: Execの値()を変更したり、発行したSQL文によって を削除された行数を返します。どの行)が( 戻り0

警告

ブールFALSEを返すことができるだけでなく、FALSEに評価 非ブール値を返すことができるこの関数は、PDO :: Execの影響を受けなかった場合。詳細については、 ブール値に関するセクションを参照してください。この関数の戻り値を で調べるには、===演算子を使用します。

しかし、あなたのコードがゼロと偽を区別しない:

if(!$result) 
{ 
    print_r($this->db->errorInfo()); 
    echo '<br><br>'; 
} 

あなたはおそらくこれが欲しい:あなたは声明の2倍である実行したときにゼロ行が更新の取得

if ($result===false) 
{ 
    print_r($this->db->errorInfo()); 
    echo '<br><br>'; 
} 

値が変更されない場合、MySQLは行を更新しないため、予想される動作です。

私はエラー処理について忘れて、例外をスローするようにPDOを構成することを特にお勧めします。

+0

これはすばらしいキャッチです。ありがとうございます。 –

1

PDO::queryPDO::execのみ障害が発生した場合にfalseを返します。
行を挿入せずに正常に更新を実行することは、失敗ではありません。

'00000'のSQLstateはエラーを意味しません。

+0

それは変ですが、私は00000を得て、これらの更新の実行ではfalseです。 –

関連する問題