Задать вопрос
@dimone73

Почему более одной записи из скрипта в базу?

PHP 5.0
Пытаюсь исправить ошибку в скрипте, который отправляет (пусть и с небольшим опозданием) запись в БД Postgresql запросом "INSERT INTO events....." и далее журнал.
Почему то вместо одной записи отправляется сразу 4 записи в одну и ту же секунду о том, что 'выход по таймауту'.
Иногда почему то 3 записи.
Кусок кода
$count=$db->query("select count(id) as c from out_line_settings")->fetch(PDO::FETCH_OBJ)->c;
if($count!=0){
	$sql = "SELECT out_line_settings.id, out_line_settings.hrn, sip_conf.host, sip_conf.port, sip_conf.name,sip_conf.username FROM out_line_settings LEFT JOIN sip_conf ON sip_conf.outline_id=out_line_settings.id WHERE out_line_settings.type = 'SIP'"; // Вывод внешних линий
	$result = $db->query($sql);
	while ($arr = $result->fetch(PDO::FETCH_OBJ)) {
    	$status = 0;
    	if (exec('/usr/sbin/asterisk -rx "sip show registry" | grep "' . $arr->host . ':' . $arr->port . '" | grep "' . $arr->username . '" | grep "Registered"') != "")
        	$status = $status + 1;
    	if (exec('/usr/sbin/asterisk -rx "sip show peers" | grep "' . $arr->name . '/' . $arr->username . '"') != "")
        	$status = $status + 1;
    		$db->query("UPDATE out_line_settings SET line_status=" . $status . " WHERE id=" . $arr->id);
	}
}
$timeout=$db->query("SELECT timeout from general_config")->fetch(PDO::FETCH_OBJ)->timeout;
$timezone=$db->query("SELECT curtz from general_config")->fetch(PDO::FETCH_OBJ)->curtz;
date_default_timezone_set($timezone);


$sql="select login,id,ip from web_users where (now() - online) > interval '".($timeout*60)."' AND session_id!=''";
$res=$db->query($sql);
while($arru=$res->fetch(PDO::FETCH_OBJ)){
	$db->query("INSERT INTO events (event_date,event_time,ip_client,user_id,user_login,event_type,event_place,event_note,event_status,title) VALUES
                ('" . date("Y-m-d") . "','" . date("H:i:s") . "',''," .$arru->id . ",'" .  $arru->login . "',1,'','<tr><td>выход по таймауту</td></tr>',1,'')");
sleep(2); //вот сюда пытался добавить задержку, все равно не помогает
}

$db->query("UPDATE web_users SET online='1970-01-01 00:00:00.000000', session_id='' WHERE (now() - online) > interval '".($timeout*60)."'");

Смущает цикл while. Что в нем можно подправить?
$arru в нем три атрибута, одномерный массив.
$arru->id целое, обычно 1
$arru->login строковое, обычно логин пользователя
$arru->ip строковое, обычно пустое
В php на начальном этапе, не могу пока понять.
Пока выяснил, что переменная $count выше равна 4, но она же не должна влиять на цикл, что внизу.
  • Вопрос задан
  • 101 просмотр
Подписаться 1 Простой 4 комментария
Решения вопроса 1
@dimone73 Автор вопроса
Выяснилось, что это глюк базы, несмотря на уникальное поле - что не делал, все равно по 2-3-4 записи. Версия 9.1, поэтому многого недоступно из нового. Сделал сортировку и удаление в базе повторяющихся записей через DELETE USING.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы