Цикл или запрос, вызывающий внутреннюю ошибку сервера

Вот история,

Я загружаю список номеров деталей в текстовый файл через gzip, чтение прошло успешно. Формат:

"ДАТА"|"ТИП"|"ID"|"FPN"|"PN"|"IOC"|"ПОЛЕ"|"ОВАЛ"|"NVAL"

Образец значения:

"2013-09-10 19:19:08"|"DU"|"10161000001354"|""|"ANTX100P001B24003"|""|"Подкатегория 1"|"Металлическая антенна"|"Антенна на печатной плате"

Теперь сценарий таков: я зацикливаюсь на каждой записи, чтобы вставить ее в базу данных и настроить уведомления для пользователей, чтобы они видели обновление об этом определенном номере детали и получали свою электронную почту для проведения рассылки позже на другой странице.

код цикла здесь:

    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 строк) + меньше блока электронной почты = внутренняя ошибка сервера + весь сайт становится под внутренней ошибкой сервера при попытке доступа к другой странице.

Я не знаю, только ли это у меня или что, но даже сервер возвращает внутреннюю ошибку сервера, продукты продолжают добавляться в базу данных (я смотрю на нее и пытаюсь запросить счетчик, и он увеличивается) и останавливается в случайной точке, с этого момента сайт снова становится доступным. Но иногда этого не происходит.

Любые идеи? Заранее спасибо.

РЕДАКТИРОВАТЬ :

NID и PID — БОЛЬШИЕ, ISREAD — BOOLEAN, остальные — ДЛИННЫЙ ТЕКСТ.

Кроме того, во время работы страница /uploadpcn.php, этот код находится в /do_upload_pcn.php, поэтому сценарий таков, что весь процесс загружается, пока находится на /uploadpcn.php, и когда процесс завершится, браузер перейдет к / do_upload_pcn.php показывает все эхо ИЛИ показывает внутренние ошибки сервера в любое время в процессе.


person Roi    schedule 16.01.2014    source источник
comment
Найдите журналы ошибок Apache.   -  person Waqar Alamgir    schedule 16.01.2014


Ответы (1)


Попробуйте зарегистрировать цикл с каждой записью, и вы можете узнать, какая конкретная запись вызывает ошибку. Вы также можете применить некоторую try-catch логику. Я предполагаю, что это может быть ошибка синтаксического анализа.

Еще одна вещь, на которую следует обратить внимание, это то, что ваш первый запрос INSERT не содержит single-quotes вокруг строковых данных. Это может быть еще одна проблема, приводящая к ошибке.

Редактировать:

Этот запрос в коде вопроса $query = sprintf('INSERT INTOread_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']);

Я бы предложил использовать двойные кавычки для построения запросов, чтобы вы могли легко использовать одинарные кавычки для параметров.

person Vivek Jain    schedule 16.01.2014
comment
Спасибо за быстрый ответ, добрый человек! что касается кавычек, он получил цитату \'%s\' ‹-- \' для цитаты - person Roi; 16.01.2014
comment
Ах это! Я забыл добавить, NID и NPID - БОЛЬШИЕ, остальные - ДЛИННЫЙ ТЕКСТ :) - person Roi; 16.01.2014