我在免费托管服务上使用PHP将行插入MySQL表中,但一次只能添加10,000行,而不是我的代码所需的完整~17,000行。这很奇怪,因为在填充MySQL表的同一个foreach循环中,还会填充JSON文件,并且JSON文件具有~17,000个值,而MySQL表只停留在10,000。
我担心的是因为我的免费托管解决方案,该表最多只能有10,000行,但事实并非如此。如果我运行PHP代码两次,我会得到一个包含20,000行的表,所以这似乎是一个问题,因为我一次只能设置10,000行。
为什么会这样?我检查了第10,000个值,并且没有任何奇怪的内容应该终止连接或违反字符限制。它也不应该达到我所知道的任何大小限制,因为我可以让表达到20,000行,但只有两组10,000。
无论如何,我很困惑,但也许你可以提供帮助。这是我的PHP代码的相关部分:
foreach ( $cc as $c ) {
$y++;
if($y < $count)
{
fputs($jsonfile2,"{".'"name"'.": ".'"'.$c.'"'.",".'"updatetimetotalminutes"'.": ".'"'.$updatetimetotalminutes.'"'.",".'"updatetime"'.": ".'"'.$updatetime.'"'.",".'"updatetimetotal"'.": ".'"'.$updatetimetotal.'"'.",".'"updateordernumber"'.": ".'"'.$y.'"'.",".'"numberofnations"'.": ".'"'.$numnations.'"'.",".'"founderlessstatus"'.": ".'"'.$founderlessstatus.'"'.",".'"delegatevotes"'.": ".'"'.$delegatevotes.'"'."},");
mysqli_query($con,"INSERT INTO `regions`(`Update Order Number`, `Name`, `Nations`, `Targetable?`, `Time to Update`, `Seconds into the Update`, `Minutes into the Update`, `Delegate Votes`) VALUES ('$y', '$c', '$numnations', '$founderlessstatus', '$updatetime', '$updatetimetotal', '$updatetimetotalminutes', '$delegatevotes')");
}
else
{
fputs($jsonfile2,"{".'"name"'.": ".'"'.$c.'"'.",".'"updatetimetotalminutes"'.": ".'"'.$updatetimetotalminutes.'"'.",".'"updatetime"'.": ".'"'.$updatetime.'"'.",".'"updatetimetotal"'.": ".'"'.$updatetimetotal.'"'.",".'"updateordernumber"'.": ".'"'.$y.'"'.",".'"numberofnations"'.": ".'"'.$numnations.'"'.",".'"founderlessstatus"'.": ".'"'.$founderlessstatus.'"'.",".'"delegatevotes"'.": ".'"'.$delegatevotes.'"'."}"."]");
mysqli_query($con,"INSERT INTO `regions`(`Update Order Number`, `Name`, `Nations`, `Targetable?`, `Time to Update`, `Seconds into the Update`, `Minutes into the Update`, `Delegate Votes`) VALUES ('$y', '$c', '$numnations', '$founderlessstatus', '$updatetime', '$updatetimetotal', '$updatetimetotalminutes', '$delegatevotes')");
}
}
$ con是mysqli_connect()值。
对此有任何帮助将不胜感激。我会提供任何其他信息,如果它可以帮助诊断问题,但由于我的托管解决方案,我对某些设置的访问可能会受到限制。
谢谢!
答案 0 :(得分:1)
max_updates
资源限制计算每个&#34; statement&#34;。
由于您超出max_updates
设置,请尝试将插入连接到单个查询(INSERT语句)。以下是插入多行的插入内容MySQL docs的示例:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
在单个语句中插入多行的另一个好处是效率更高。
您唯一的限制是max_allowed_packet
的大小。
答案 1 :(得分:1)
如果您达到max_updates
限制,则可以在给定次数更新后刷新连接,例如:
$row = $con->query("SHOW VARIABLES LIKE 'max_updates'")->fetch_assoc();
$max_updates = $row === FALSE ? 10000 : $row['Value'];
$current_update = 0;
foreach($cc as $c ) {
if (++$current_update >= $max_updates) {
$conn->close();
$conn->real_connect();// Reopen connection here, you'll need your details
$current_update = 1;
}
// ...
}
答案 2 :(得分:0)
你确定吗?当你这样做时,你的数据库不是唯一可能的问题(但可能仍然是一个)。您的PHP配置还有更多功能,例如示例它也不应该达到我所知道的任何大小限制,因为我可以让表达到20,000行,但只有两组10,000。
max_execution_time
。当您没有显示或记录PHP的错误消息时,您几乎可以解决失败的原因。
所以有一些建议:
在开发过程中始终启用错误报告
不仅要依赖PHP的错误消息,还要关注扩展和驱动程序,以及如何处理错误。(例如mysqli_error()
)< / p>
如果可以,请使用正确的调试器(例如PHPDBG)
托管不应该基于魔法,而应该基于科学! 因此,请正确告知自己您的主机可以做什么,不能做什么。如果它不符合您的需要,请切换。
您的网络服务器错误日志(以及您的案例中的数据库日志)是您在开发时最好的朋友