2017-06-12 11 views
1

CSVファイルから行をフェッチしていますが、挿入中に一部のレコードがスキップされました。その解決策は何ですか?phpとpdo挿入するレコードをスキップします

while(($line = fgetcsv($file, 10000, ",")) !== FALSE){ 

      $total_data++; 
      $sql="SELECT id FROM customers WHERE id ='".$line[0]."'"; 
      $db->query( $sql); 

      $check = $db->resultset(); 
      $num = $db->rowCount(); 

      if($num > 0){ 
       $update_data++; 
       //$db->query("UPDATE customers SET name = :name, phone=:phone where id=:id"); 
       $db->bind(':name', $line[1]); 
       $db->bind(':phone', $line[2]); 
       $db->bind(':id', $line[0]); 
       $db->execute(); 

      }else{ 
        $insert_data++; 
       $db->query("INSERT INTO customers(id,name,phone) VALUES (:id,:name,:phone)"); 
        $db->bind(':id',$line[0]); 
        $db->bind(':name', $line[1]); 
        $db->bind(':phone', $line[2]); 
        $db->execute(); 
      } 
     } 

答えて

0

通常PDOとあなたがなど、query()への呼び出しの結果を格納する必要があると返されたプリペアドステートメントのメソッドを呼び出す...

query()は、変数にその保存してPDOStatementオブジェクトを返します。例えば$statement、その後はその変数にrowCount()のようなメソッドを呼び出します。

while(($line = fgetcsv($file, 10000, ",")) !== FALSE){ 
    $total_data++; 
    $sql="SELECT id FROM customers WHERE id ='".$line[0]."'"; 
    $statement = db->query( $sql); 

    $check = $statement->resultset(); 
    $num = $statement->rowCount(); 

    if($num > 0){ 
     $update_data++; 
     $updateStatement = $db->query("UPDATE customers SET name = :name, phone=:phone where id=:id"); 
     $updateStatement->bind(':name', $line[1]); 
     $updateStatement->bind(':phone', $line[2]); 
     $updateStatement->bind(':id', $line[0]); 
     $updateStatement->execute(); 

    }else{ 
     $insert_data++; 
     $insertStatement = db->query("INSERT INTO customers(id,name,phone) VALUES (:id,:name,:phone)"); 
     $insertStatement->bind(':id',$line[0]); 
     $insertStatement->bind(':name', $line[1]); 
     $insertStatement->bind(':phone', $line[2]); 
     $insertStatement->execute(); 
    } 
} 
+0

が使用記録をチェックする条件挿入されているかどうかはい、次に何かの方法することができます。 – yogendra

+0

はい[行数()](http://php.net/manual/en/pdostatement.rowcount.php)を使用する - 説明と例を読んでください。その例はDELETEクエリの場合がありますが、INSERTに適用されますクエリも同様です。 –

+0

@yogendra per [rowCount()](http://php.net/manual/en/pdostatement.rowcount.php): "_ ** PDOStatement :: rowCount()**は影響を受ける行の数を返します対応するPDOStatementオブジェクトによって実行された最後のDELETE、INSERT、またはUPDATEステートメントによって実行されます。 "したがって、もしあなたが' $ insertStatement-> execute();を実行した後、私の答えの中のコードを見れば '$ insertStatement-> rowCount(); 'は、_INSERT_クエリの影響を受ける行の数を返す必要があります –

関連する問題