Имя: Пароль:
IT
Веб-мастеринг
Странное поведение переменной в php.
0 megabax
 
01.08.15
11:11
Добрый день. Запускаю вот такой скрипт (фрагмент кода):
        //SQL - запрос для поиска устаревших записей
        $query="select MIN(actdate) as mindate from _eprog_tariffs";

        //выполним запрос
        $rows_selection=mysql_query($query);
        
        if(!$rows_selection)
        {
            echo "<h1><font color=red>Error query ".$query."</h1>";
        }
        
        $count=mysql_num_rows($rows_selection);
        
        if($count!=0)
        {
        
            $mindate=false;
            
            //выведем результат запроса
            for($i=0; $i<=$count; $i++) {
                $arr=mysql_fetch_array($rows_selection);
                $mindate=$arr["mindate"];
                break;
            }        
база пуста, но запрос возвращает одну строку, где $mindate получается пустое значение. При любой попытке обращения к $mindate, например такому:
if(!empty($mindate))

вылазит ошибка 500.
Скрпиты запускается из 1С 8.2.
Подскажите пожалуйста, как лечить.
1 Zhuravlik
 
01.08.15
12:20
(0) Вообще-то обычный запрос отрабатывает точно также. И по-моему логично: функция должна вызывать значение. В данном случае MIN по пустой таблице возвращает NULL, что вполне соответствует (моим) представлениям о прекрасном. И 1С-ным тоже. Прогоните такой код:

    тз = Новый ТаблицаЗначений;
    тз.Колонки.Добавить("Тест", Новый ОписаниеТипов("Число"));
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    тз.Тест
        |ПОМЕСТИТЬ ВТ_Данные
        |ИЗ
        |    &тз КАК тз
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    МИНИМУМ(ВТ_Данные.Тест) КАК Тест
        |ИЗ
        |    ВТ_Данные КАК ВТ_Данные";
        
    Запрос.УстановитьПараметр("тз", тз);        
        
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    ВыборкаДетальныеЗаписи.Следующий();
    Переменная_NULL = ВыборкаДетальныеЗаписи.Тест; // посмотреть в отладчике
2 Zhuravlik
 
01.08.15
12:21
(1) "функция должна вызывать значение" -> "функция должна ВОЗВРАЩАТЬ значение"
3 Asmody
 
01.08.15
15:10
(0) "MIN() returns NULL if there were no matching rows."

http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_min
4 Asmody
 
01.08.15
15:17
вот так строчку перепиши:

$mindate=$arr["mindate"] ? $arr["mindate"] : false;