0

最近、CSV を MySQL データベースに挿入する方法を尋ねました。LOAD DATA LOCAL INFILE を使用するように提案されましたが、私のホストではこれが無効になっていることが判明したため、もはやオプションではありません。PHPループに戻る..

挿入時に値を配列にマッピングしているため、一時アップロードの結果をループする際に問題が発生しています。したがって、複数の行では、配列の値が明示的に定義されているため、同じエントリが 2 回入力されます (最初の行の値)。

1、2、3、4 を挿入してから 1、2、3、4 を挿入しています。配列の 1、2、3、4、5、6、7、8 を挿入したいと思います。

解決策は何ですか (ハッキーな for と row++ を除く)?

前もって感謝します。

$handle = fopen($_FILES['csv']['tmp_name'], "r");
$sql = "INSERT INTO tbl (col1, col2, col3, col4) VALUES (?, ?, ?, ?)";

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$query = $db->prepare($sql);
if ($query->execute(array($data[0],$data[1],$data[2],$data[3]))) return true;
   else return false;
}
4

3 に答える 3

1

私が考えることができる唯一のことは、ループが 1 回しか実行されていないということですが、ループを 2 回実行しています。(ループに「return」ステートメントがあります。)

以下が機能するはずです。

function loadCsv($db, $filename){

    $fp = fopen($filename, 'rb');
    $sql = 'INSERT INTO tbl (col1, col2, col3, col4) VALUES (?,?,?,?)';
    $pstmt = $db->prepare($sql);

    while (FALSE !== ($data = fgetcsv($fp, 1000))) {
        $cols = array_slice($data, 0, 4);
        $query->execute($cols);
    }

    $pstmt->closeCursor();
    fclose($fp);
}

最大限の互換性とパフォーマンスを得るために、このconnect_PDO関数のような関数で PDO に接続することをお勧めします。

于 2012-08-14T16:41:36.837 に答える
0

まず、クエリを 1 回準備するだけで済みます (これは、プリペアド ステートメントを使用する 2 つの主な利点の 1 つであり、インジェクションの防止がもう 1 つの利点ですprepare()) while

それ以外では、データが CSV ファイルに複製されていない限り、投稿したコードが主張どおりに動作する理由がわかりません。

于 2012-08-14T15:03:22.310 に答える
0

問題は return ステートメントにありました。返品を削除すると、すぐに問題が修正されました。

残念ながら、この回答を投稿したユーザーはそれを削除しました。

あなたの提案とこれを手伝ってくれてありがとう!

于 2012-08-14T20:07:27.207 に答える