1

我正在编写一个 PHP 脚本来从网络上抓取数据。最终结果,我希望将所有抓取的数据很好地保存在 mysql 数据库中并格式化。

但是由于在 PHP 脚本中有多个循环和数组要遍历,我的直觉是,为了速度和效率,最好不要保持循环访问 mysql 数据库(在每次复飞时插入数据)循环) - 相反,将数据存储在 PHP 中的临时数组中,然后仅在脚本结束时,一次将数组转储到 mysql 中。

你说什么?

4

3 回答 3

5

您可以使用 Insert into values("1","2","3"),("3","5,"5")

在 foreach 中,您可以创建一个值数组,并且在 forloop 之外,您可以内爆并插入到 mysql 中。

可以说,

$values = array();
foreach($yourData as $eachData){

// prepare your values here.
$values[] = "('1','2',3')";

}


// out of forloop,
$values = implode(",",$values); 

$query = " insert into `tablename` (field1,field2,field2) values {$values} " ;

干杯

于 2012-05-12T03:24:47.403 回答
2

是的,当涉及到查询数量时,通常是最小的是高性能的。但是,您的脚本受限于网络 io(下载速度),而不是数据库。在操作系统下载数据时,您的脚本大部分时间都处于休眠状态。因此,您发出的任何查询都相对不常见。

我的建议是让它工作。

于 2012-05-12T03:42:30.980 回答
0

如前所述,您可以使用一个查询插入多行,这比对每一行使用单独的查询优化得多。您可以使用循环向查询字符串添加更多行,但最重要的是,请记住转义数据!

<?php    
$rows = array();
$sql = '
    INSERT INTO `table` (`key`, `data`)
    VALUES ';

$data = array(
    array(
        'key' => 'key1',
        'value' => 'some value'
    ),
    array(
        'key' => 'key2',
        'value' => 'some value 2'
    ),
    array(
        'key' => 'key3',
        'value' => 'some value 3'
    ),
);

for ($i = 0; $i < count($data); ++$i)
{
    // Do me a favor and look up PDO.
    $key = mysql_escape_string($data[$i]['key']);
    $row = mysql_escape_string($data[$i]['value']);

    if ($i === 0)
        $sql .= ' (\'' . $key . '\', \'' . $row . '\')';
    else
        $sql .= ', (\'' . $key . '\', \'' . $row . '\')';
}
于 2012-05-12T03:50:04.037 回答