0

メモリを節約するためにループの外側にクエリを挿入するためにこれを持っています

$z = "";
foreach($link as $i)
{
//some stuff
$z .= "('" . $s . "', '" . $data . "', '" . $data2    ."'), ";

}

$z = substr($z, 0, strlen($z) - 2);
mysql_query("INSERT INTO table VALUES ".$z."");

ループが1つだけループした後、mysqlエラーが発生した場合、どちらが正常に機能しますか?何か問題がありますか?

4

2 に答える 2

1

以下のフォーマットを使用してください

$inserts = array();  foreach ($link as $i)
$inserts[] = "('','$s','$data')";
$query = "INSERT INTO table VALUES ". implode(", ", $inserts);
mysql_query($query) or die(mysql_error());
于 2013-05-07T07:30:07.987 に答える
0

これを行う 1 つの方法は、オブジェクトを使用して挿入を行うことです。これにより、数量が大きくなりすぎた場合に挿入をバッチ処理でき、最終的な挿入は destruct メソッドで実行できます。

このようなもの:-

<?php

$InsertClassExample = new InsertClassDemo($db);

foreach($link as $i)
{
    //some stuff
    $InsertClassExample->InsertItem($s, $data, $data2);
}

unset($InsertClassExample);

class InsertClassDemo
{
    var $db = '';
    var $InsertArray = array();

    function __CONSTRUCT($db)
    {
        $this->db = $db;
    }

    function __DESTRUCT()
    {
        if (count($this->InsertArray) > 0)
        {
            $this->PerformInsert();
        }
    }

    public function InsertItem($s, $data, $data2)
    {
        $this->InsertArray[] = "('" . $s . "', '" . $data . "', '" . $data2    ."'), ";
        if (count($this->InsertArray) > 250)
        {
            $this->PerformInsert();
        }
    }

    private function PerformInsert()
    {
        $query = "INSERT INTO table VALUES ".implode(",", $this->InsertArray);
        if($this->db->query($query) === false)
        {
            die("Insert Into table Failed - ".$this->db->error());
        }
        $this->InsertArray = array();
    }
}

?>
于 2013-05-07T08:14:59.203 に答える