我写了以下脚本:
<?php
$filename = "readingDataFromThis.LOG";
$filterarray= array("stuff to remove from the file", "and more stuff");
if (file_exists($filename) && is_readable ($filename)) {
ini_set('memory_limit','16M');
ini_set('max_execution_time', 600);
$con=mysqli_connect("server","username","password","database_name");
$count = 0;
$fh = fopen($filename, "r");
if ($fh) {
while (($line = fgets($fh)) != false) {
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
if (strpos_arr($line, $filterarray) == false) {
$month = substr($line, 3,5);
$day = substr($line, 0,2);
$year = substr($line, 6,8);
$timestamp = substr($line, 9, 17);
$message = substr($line, 18);
mysqli_query($con,"INSERT INTO Conversation (Month, Day, Year, Time, Message)
VALUES ('$month', '$day', '$year', '$timestamp', '$message')");
echo "Inserted record " . $count++ . "<br>";
}
}
}
fclose($fh);
mysqli_close($con);
echo "Complete.";
}
function strpos_arr($haystack, $needle) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $what) {
if(($pos = strpos($haystack, $what))!==false) return $pos;
}
return false;
}
?>
当我运行它时,我没有任何问题,我在屏幕上收到的输出基本上是这样的:
Inserted record 0
Inserted record 1
...
Inserted record 14000+
Complete.
但是,当我转到数据库本身的表中时,我发现只有完整的前5000条记录插入到数据库中。这里发生了什么?
答案 0 :(得分:0)
使用:
$message = mysqli_real_escape_string($con, substr($line, 18));
确保消息可以正确替换为查询。否则,如果$message
包含引号字符,则在将其提交到查询中时会得到无效的SQL语法。
最好使用mysqli_prepare()
和mysqli_stmt_bind_param()
进行重新编码。
答案 1 :(得分:0)
它们是否可能在您的密钥上重复,因此,未插入或正在更新以前的值。 如果花费太长时间,它可能只是超时。然而,PHPMyAdmin有一个功能,如果即将达到超时,它将停止执行 - 这也意味着它将允许您从正确的位置恢复。
答案 2 :(得分:0)
在讨论中与Barmar合作,我们最终修改了以下代码行:
$message = mysqli_real_escape_string($con,substr($line, 18));
这基本上处理了具有诸如&#39;之类字符的奇怪文本行。在它们中将破坏SQL INSERT语句的语法。
mysqli_query($con,"INSERT INTO Conversation (Month, Day, Year, Time, Message)
VALUES ('$month', '$day', '$year', '$timestamp', '$message')") or die(mysqli_error($con));
在这段代码中,我们添加了或die(mysqli_error($ con));
这告诉程序暂停执行并输出错误原因。这给我提供了以下错误:
用户&#39; my_sa&#39;已经超过了'max_updates&#39;资源(当前值:5000)
我正在使用免费的网络托管服务商,因此根据一些谷歌搜索,我们确定它可能是速率限制问题,可以通过在迭代中运行程序来一次插入一段记录来解决。