怎样行使mysqli插入此查询?…
INSERT INTO table (field1,field2,field3) VALUES ('value','value','value'),('value','value');
凡是在mysql中这个查询是直接的,而且会插入3行,如安在mysqli中执行此操纵而不行使预筹备语句可能也许行使预筹备语句但不会太伟大?我只是想知道是否有步伐执行这样的查询而不消在PHP中做特另外时髦的对象.
本质上,我有一些提取的数据,每个插入约莫有10行(除了有多行之外还必要多个插入),这就是我必要的.我只但愿用查询来执行此操纵,由于我凡是行使mysql完成它,而不是每行添加多个插入.
最佳谜底
mysqli类提供了很多差异的要领来完成插入,每个要领都有本身的甜头.虽然,个中一个应该切合您的需求.
以下示例假设您未指定的“提取数据”存储在数组数组中:$bigArray [0 … datasetsize] [0 … 2].
mysqli数据库假定为$db.
要领1 – 旧学校
您可以像早年一样直接举办操纵,只需构建查询字符串并行使它查询数据库即可.如您所指定,插入一次绑缚10个.下面的代码表现了一个这样的bundle,而且可以简朴地扩展到整个数据集(bigArray).应该行使mysqli :: escape_string对数据举办转义(此??处未完成).
在全部示例中,假设要插入的数据是整数.
$sql = "INSERT INTO testTable (fieldA,fieldB,fieldC) VALUES ";
for ($i = 0; $i < 10; ++$i)
{
if ($i > 0) $sql .= ",";
$sql .= "({$bigArray[$i][0]}),({$bigArray[$i][1]}),({$bigArray[$i][2]})";
}
$db->query($sql);
要领2 – 尽也许简朴
假如要行使预筹备语句和参数绑定,则第一项事变也许如下所示.固然不是最佳,但声明只筹备一次.可是,每个插入的变量都是绑定的,这很挥霍(但很简朴).因为插入没有绑缚,因此示例轮回高出10.
$statement = $db->prepare("INSERT INTO testTable (fieldA,fieldC) VALUES (?,?,?)");
for ($i = 0; $i < 10; ++$i)
{
$statement->bind_param("iii",$bigArray[$i][0],$bigArray[$i][1],$bigArray[$i][2]);
$statement->execute();
}
要领3 – 优化
筹备好的语句和多个插入组合使得机能险些与要领1的原始插入查询沟通.现实功效将按照您的配置而有所差异,可是对我的体系举办快速测试,同时行使当地和长途数据库表现机能有几个百分比行使优化要领更快所在,假如必要转义要领1中的数据,则增进几点.
以下行使call_user_func_array,但假如您知道每次要绑缚几多插入并直接构建挪用bind_param,则可以停止这种环境.这将进一步进步机能.
为清晰起见,这个例子包罗外环并假定要插入总共10k行(即bigArray [0..9999] [0..2]).
$sql = "INSERT INTO testTable (fieldA,?)".str_repeat(",(?,?)",9);
$statement = $db->prepare($sql);
// This is the type string used by statement::bind_param.
// Example assumes all INTs.
$types = (array)str_repeat("i",30);
$values = array_fill(0,30,0); // A bit of unneeded variable init.
// * See notes following code snippet on why the intermediate array is used.
$intermediate = array();
for ($n = 0; $n < 30; ++$n)
{
$intermediate[$n] = &$values[$n];
}
call_user_func_array(array(&$statement,"bind_param"),array_merge($types,$f));
for ($j = 0; $j < 1000; ++$j)
{
for ($i = 0; $i < 10; ++$i)
{
$values[$i*3] = $bigArray[$i][0];
$values[$i*3+1] = $bigArray[$i][1];
$values[$i*3+2] = $bigArray[$i][2];
}
$statement->execute();
}
// call_user_func_array with bind_param requires the values be
// passed by reference which is evaluated only on the initial
// call. Using $values[...] = &$bigArray[...] below won't work
// and an intermediate array referencing $values is used. This
// bit of "extra funky stuff" can be avoided at a very slight
// performance penalty by setting $values[...] = $bigArray[...]
// AND EVALUATING EACH TIME (move call_user_func_array
// inside the outer loop,i.e. right above $statement->execute()).
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|