PHP脚本只插入5000行到phpMyAdmin数据库

时间:2014-08-28 03:55:29

标签: 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_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条记录插入到数据库中。这里发生了什么?

3 个答案:

答案 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)

我正在使用免费的网络托管服务商,因此根据一些谷歌搜索,我们确定它可能是速率限制问题,可以通过在迭代中运行程序来一次插入一段记录来解决。