循环或查询导致内部服务器错误

时间:2014-01-16 06:11:54

标签: php loops for-loop internal-server-error

继承人的故事,

我通过gzip上传文本文件中的部件号列表,读取成功。 格式为:

  

“DATE” | “TYPE” | “ID” | “FPN” | “PN” | “IOC” | “FIELD” | “OVAL” | “NVAL”

样本值:

  

“2013-09-10 19:19:08”|“DU”|“10161000001354”|“”|“ANTX100P001B24003”|“”|“子类别1”|“金属天线”|“PCB天线”

现在的情况是,我循环每个条目以将其插入数据库,并为用户设置通知,以查看有关该特定部件号的更新,并让他们的电子邮件稍后在其他页面中进行邮寄。

循环代码在这里:

    for($x=1;$x<=count($lines)-1;$x++){

        $cur_row = trim(str_replace('"','',$lines[$x]));
        $cols = preg_split('/\|/',$cur_row);

        $query = sprintf('INSERT INTO `notification_details`(`NDATE`, `NTYP`,`NPID`,`NFPN`,`NPN`,`NIOC`, `NFILD`, `NOV`, `NNV`) VALUES(\'%s\',\'%s\',%s,\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\')',$cols[0],$cols[1],$cols[2],$cols[3],$cols[4],$cols[5],$cols[6],$cols[7],$cols[8]);
        mysql_query($query);

        $query = 'SELECT DISTINCT `id` FROM `project_details` WHERE `prod_id` = \''.$cols[2].'\';';
        $result = mysql_query($query);
        $count = mysql_num_rows($result);

        if($count>0){

            $query = 'SELECT MAX(`NID`) FROM `notification_details`';
            $result = mysql_query($query);
            $row=mysql_fetch_array($result);
            $NID = $row[0];

            $query = sprintf('INSERT INTO `read_details`(`NID`, `PID`,`ISREAD`) VALUES(%s,%s,1);',$NID,$row['id']);
            mysql_query($query);
        }
        echo $cols[2].".... Done!<br />";
        flush();ob_flush();

    }


//EMAIL LISTING BLOCK

    echo "Listing E-mails...<br />";
    $query = 'SELECT B.`proj_user`, C.`email` '
            .'FROM `read_details` A, `project_details` B, `login_details` C'
            .'WHERE A.`ISREAD` = 1 '
            .'AND A.`PID` = B.`id` AND B.`proj_user` = C.`username` '
            .'GROUP BY B.`proj_user`';
    $result = mysql_query($query);

    while($row=mysql_fetch_array($result)){
        mysql_query('INSERT INTO `email_details`(`email`,`user`) VALUES(\''.$row[1].'\',\''.$row[0].'\')');
        echo $row[1].".... Added!<br />";
    }

我做了一些运动:

  1. 产品(193行)+上面代码的完整运行=内部服务器错误+整个站点在尝试访问其他页面时变为内部服务器错误

  2. 产品(193行)+减去电子邮件块=成功

  3. 产品(18,000行)+上述代码的完整运行=内部服务器错误+每当尝试访问其他页面时,整个站点都会出现内部服务器错误。

  4. 产品(18,000行)+减少电子邮件阻止=内部服务器错误+每当尝试访问其他页面时整个站点都会出现内部服务器错误。

  5. 我不知道它是否仅仅是我或者是什么,但即使是服务器返回内部服务器错误,产品也会不断添加数据库(我查看它并尝试查询计数并递增)并停在随机点,该点可以再次访问该站点。但有时它不会这样做。

    有什么想法吗?提前谢谢。

    编辑:

      

    NID&amp; PID是BIGINT,ISREAD是BOOLEAN,其余是LONGTEXT

    在运行时,页面是/uploadpcn.php,此代码位于/do_upload_pcn.php下 因此情况是,整个过程在/uploadpcn.php上加载,当进程结束时,浏览器将转到/do_upload_pcn.php,显示所有回声或在过程中随时显示内部服务器错误。

1 个答案:

答案 0 :(得分:0)

尝试使用每条记录记录循环,您可能会知道哪条特定记录导致错误。您也可以应用一些try-catch逻辑。我认为这可能是一个解析错误。

另一件需要注意的事情是,您的第一个INSERT查询不包含字符串数据周围的single-quotes。这可能是导致错误的另一个问题。

编辑:

问题$query = sprintf('INSERT INTO中的代码中的此查询read_details ( NID , PID , ISREAD ) VALUES(%s,%s,1);',$NID,$row['id']);应该是这样的:

$query = sprintf('INSERT INTO `read_details` (`NID`, `PID`, `ISREAD`) VALUES (\'%s\', \'%s\', 1);', $NID, $row['id']);
  

我建议使用双引号来构造查询,以便您可以轻松地使用单引号作为参数。

相关问题