0

これには2つ目の目が必要だと思います。私の人生では、SQL INSERT クエリが反復ごとに 2 回実行される理由を理解できません。

if (($handle = fopen($spreadsheet_url, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    if ($current_row == 1 || $current_row == 2) {
        $num = count($data);
        //echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            //echo $data[$c] . "<br />\n";
            try {
                set_time_limit(0);
                $stmt = $db_temp_kalio->prepare('INSERT INTO invupdate (sku,prod) VALUES(:sku, :prod)');
                $stmt->execute(array(':sku'=> $data[0], ':prod'=> $data[1])); }
            catch(PDOException $e) {
                echo 'ERROR: ' . $e->getMessage();
                exit; }
            }
        }
    $current_row++;
    }
fclose($handle);
}
4

2 に答える 2

0

いくつかのコードを使用して列を反復処理しているように見えますが、実際には、sku と prod ($data[0] と $data[1]) を含む 2 つしかありません。内部に for ループが必要です。(ところで、クエリがその中にあったため、クエリが2回実行されたのはそのループでした。)また、行(current_rowとrow)に2つのカウンターがあるように見えるので、それらを組み合わせることができます。if ($currentRow == 1... ステートメントを使用して行 0 のヘッダーを無視し、2 行のみを処理する場合は、実行の準備ができたら if ($currentRow > 0) に切り替えます。スプレッドシート全体. exit の代わりに catch 句で break を使用すると、コードが while ループから脱落し、fclose ステートメントにヒットします。

if (($handle = fopen($spreadsheet_url, "r")) !== FALSE) {
$currentRow = 0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    if ($currentRow == 1 || $currentRow == 2) {
        $num = count($data);
        //echo "<p> $num fields in line $currentRow: <br /></p>\n";
        //echo "<p> The data for this row is: " . $data[0]  . " " . $data[1] . "\n";
        try {
            set_time_limit(0);
            $stmt = $db_temp_kalio->prepare('INSERT INTO invupdate (sku,prod) VALUES(:sku, :prod)');
            $stmt->execute(array(':sku'=> $data[0], ':prod'=> $data[1]));
        }
        catch(PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
            break;
        }
    }
    $currentRow++;
}
fclose($handle);
}
于 2013-05-08T12:23:36.880 に答える
0

まあ、助けを求める前にもう少し努力すべきだったのかもしれません。ループに行リセットカウンターを追加することで、これを修正できました。

if (($handle = fopen($spreadsheet_url, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    if ($current_row == 1 || $current_row == 2) {
        $row_reset = 0;
        $num = count($data);
        //echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            //echo $data[$c] . "<br />\n";
            if ($row_reset == 0) {
                try {
                    set_time_limit(0);
                    $stmt = $db_temp_kalio->prepare('INSERT INTO invupdate (sku,prod) VALUES(:sku, :prod)');
                    $stmt->execute(array(':sku'=> $data[0], ':prod'=> $data[1])); }
                catch(PDOException $e) {
                    echo 'ERROR: ' . $e->getMessage();
                    exit; }
                }
            $row_reset++;
            }
        }
    $current_row++;
    }
fclose($handle);
}

もっと良い方法があるかどうか、私はまだ興味があります。

于 2013-05-08T12:06:26.593 に答える