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));