Php脚本仅在phpMyAdmin数据库中插入5000行
我写了以下脚本:Php脚本仅在phpMyAdmin数据库中插入5000行,php,mysql,sql,Php,Mysql,Sql,我写了以下脚本: <?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_exe
<?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;
}
?>
但是,当我转到数据库本身的表时,我发现只有插入数据库的前5000条记录。这里发生了什么?使用:
$message = mysqli_real_escape_string($con, substr($line, 18));
以确保消息可以正确地替换到查询中。否则,如果$message包含引号字符,则当它被替换到查询中时,将得到无效的SQL语法
最好使用mysqli_prepare和mysqli_stmt_bind_param重新编码。它们是否可能在密钥上重复,因此不会插入或正在更新以前的值。
如果需要的时间太长,可能就是超时了。然而,PHPMyAdmin有一个功能,如果即将达到超时,它将停止执行,这也意味着它将允许您从正确的位置恢复。在讨论中与Barmar合作,我们最终修改了以下代码行:
$message = mysqli_real_escape_string($con,substr($line, 18));
这实际上是处理奇怪的文本行,这些文本行中包含诸如“的字符,这将破坏SQL INSERT语句的语法
mysqli_query($con,"INSERT INTO Conversation (Month, Day, Year, Time, Message)
VALUES ('$month', '$day', '$year', '$timestamp', '$message')") or die(mysqli_error($con));
在这段代码中,我们添加了or diemysqli_错误$con
这会告诉程序停止执行并输出一个关于原因的错误。这为我提供了以下错误:
用户“my_sa”已超过“max_updates”资源当前值:5000
我使用的是免费的web主机,因此根据一些google搜索,我们确定这可能是一个速率限制问题,可以通过迭代运行程序一次插入一段记录来解决。phpMyAdmin对一次显示的行数有限制。你确定你遇到的不是这个吗?从对话中选择COUNT*显示了什么?从对话>返回>COUNT*5000中选择COUNT*-因此,我手动插入了一条记录,从我的主表视图中可以看到5001条记录。添加错误检查。您还可以在每次插入后调用mysqli_impacted_rows$con,以了解它是否添加了任何内容。由于您没有使用mysqli_bind_param,您需要在消息上调用mysqli_real_escape_string,以防它包含产生无效语法的引号。这正是我的答案所解决的问题。如果超时,它将如何打印所有插入的记录N行?他已经在评论中说没有重复的数据。他没有使用PHPMyAdmin来做插入,他使用的是PHP脚本。
mysqli_query($con,"INSERT INTO Conversation (Month, Day, Year, Time, Message)
VALUES ('$month', '$day', '$year', '$timestamp', '$message')") or die(mysqli_error($con));