在程序中,我得到一个包含arr
1000 个值的数组,我想使用 PDO 写入数据库
输出:Warning: Error while sending QUERY packet. PID=8448
foreach ($arr as $v => $k){
$sql = "INSERT INTO table (value, key) VALUES (:value, :key);
$data = [
":value" => $v;
":key" => $k
];
$db->query($sql,$data);
};
我还尝试拆分 25 和 50 个请求:
$sql = "";
$i = 0;
foreach ($arr as $k => $v) {
$i++;
if ($i % 50 == 0){
$db->query($sql);
sleep(5);
$sql = "";
}
$sql .= "INSERT INTO table(link,price) VALUES ('" . $k . "','" . $v . "'); ";
}
$db->query($sql);
输出:
Warning: PDOStatement::execute(): MySQL server has gone away in ....\Connection.php on line 53
连接类:
....
public function query(string $sql, array $data = [])
{
51 set_time_limit(0);
52 $sth = $this->link->prepare($sql);
53 $sth->execute($data);
54 $result = $sth->fetchAll();
55 if (false === $result) {
return [];
}
return $result;
}
结果,没有任何内容写入数据库。尝试使用较小的值(~70-80)一切正常,帮助解决问题。Openserver MySQL 5.5 PHP7
更新:错误已MySQL server has gone away in ...
通过对连接类进行少量添加来解决:
$this->link = new \PDO($dns, $config['***'], $config['***']);
$this->link->query("SET wait_timeout=9999;");
query("SET wait_timeout=9999;");
为了提高性能,您可以使用具有多个 VALUES 的单个 INSERT:
这就是您如何形成与数组中的元素一样多的请求。
INSERT和VALUES也必须分块!并且您不应向一个 INSERT 添加超过 1024 条记录
通过@HerbertBalagtas
在 VALUE 的查询中,将问号替换为“?”。
之后将$arrValues代入execute($arrValues)