我经常在PHP中使用大型数组或大量动态数据来运行MySQL查询来处理。
是否有更好的方法可以运行INSERT或UPDATE等许多进程,而无需循环使用INSERT-ed或UPDATE-ed信息?
示例(为了简洁起见,我没有使用准备好的声明):
$myArray = array('apple','orange','grape'); foreach($myArray as $arrayFruit) { $query = "INSERT INTO `Fruits` (`FruitName`) VALUES ('" . $arrayFruit . "')"; mysql_query($query, $connection); }
答案 0 :(得分:20)
选项1 您实际上可以一次运行多个查询。
$queries = '';
foreach(){
$queries .= "INSERT....;"; //notice the semi colon
}
mysql_query($queries, $connection);
这样可以节省您的处理费用。
选项2
如果您的插入对于同一个表来说很简单,您可以在一个查询中执行多个插入
$fruits = "('".implode("'), ('", $fruitsArray)."')";
mysql_query("INSERT INTO Fruits (Fruit) VALUES $fruits", $connection);
查询最终看起来像这样:
$query = "INSERT INTO Fruits (Fruit)
VALUES
('Apple'),
('Pear'),
('Banana')";
这可能是您想要的方式。
答案 1 :(得分:5)
如果你有mysqli类,你可以使用预准备语句迭代值以插入。
$sth = $dbh->prepare("INSERT INTO Fruits (Fruit) VALUES (?)");
foreach($fruits as $fruit)
{
$sth->reset(); // make sure we are fresh from the previous iteration
$sth->bind_param('s', $fruit); // bind one or more variables to the query
$sth->execute(); // execute the query
}
答案 2 :(得分:3)
答案 3 :(得分:2)
关于jerebear在一个INSERT中使用多个VALUE块的答案有一点需要注意:
对于大量数据而言可能相当危险,因为大多数DBMS对其可以处理的命令的大小有上限。如果超过VALUE块太多,则插入失败。例如,在MySQL上,限制通常是1MB AFAIK。
因此,您应该弄清楚最大大小是什么(理想情况是在运行时,可以从数据库元数据中获得),并确保通过将值列表分散到多个INSERT来确保不超过它。
答案 4 :(得分:0)
我的灵感来自于jerebear的回答,为我当前的一个项目建立了类似他的第二个选项。由于记录的剪切量,我无法保存并立即执行所有数据。所以我构建this来进行导入。您添加数据,然后在每个记录完成时调用方法。在一定的,可配置的记录数量之后,内存中的数据将使用像jerebear的第二个选项一样的大量插入来保存。
// CREATE TABLE example ( Id INT, Field1 INT, Field2 INT, Field3 INT);
$import=new DataImport($dbh, 'example', 'Id, Field1, Field2, Field3');
foreach ($whatever as $row) {
// add data in the order of your column definition
$import->addValue($Id);
$import->addValue($Field1);
$import->addValue($Field2);
$import->addValue($Field3);
$import->nextRow();
}
$import->lastRow();
答案 5 :(得分:0)
foreach ($userList as $user) {
$query = 'INSERT INTO users (first_name,last_name) VALUES("'.$user['first_name'].'", "' . $user['last_name'] . '")';
mysql_query($query);
}
Insted使用以上内容尝试以下操作。您可以将数据合并到一个数据库查询中,而不是使用循环。
$userData = array();
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);
Produces:
INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...