За последние 24 часа нас посетили 18260 программистов и 1637 роботов. Сейчас ищут 1529 программистов ...

Интересный глюк в связке Firebird 1.5 + PHP

Тема в разделе "PHP для новичков", создана пользователем chemister, 23 июл 2010.

  1. chemister

    chemister Активный пользователь

    С нами с:
    18 июл 2010
    Сообщения:
    8
    Симпатии:
    0
    Столкнулся с интересным глюком при выборке из базы Firebird 1.5 средствами PHP:

    Код (Text):
    1.  
    2. $sql = "select zn1, zn3 from znachenie where znachenie_ui = 12";
    3. $result = ibase_query($sql);
    4. while ($row = ibase_fetch_row($result)){
    5.  echo "Глюк <br>";
    6.  echo $row[0];
    7.  echo ": ";
    8.  echo rtrim(rtrim($row[1], '0'), '.');
    9.  echo "<br>\n";
    10. } // end while
    11. ibase_free_result($result); //Освобождаем память от запроса
    Так вот, если zn1 и zn3 являются типом numeric и если они целые числа, то выдаются уменьшенными в 10 раз!
    Глюк работает если таблица или выбираемое значение имеют название znachenie .

    Я в шоке!
    Если кто подскажет как обойти это странное явление, буду благодарен.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а если так:
    [sql]select `zn1`, `zn3` from `znachenie` where `znachenie_ui` = `12`[/sql]
     
  3. chemister

    chemister Активный пользователь

    С нами с:
    18 июл 2010
    Сообщения:
    8
    Симпатии:
    0
    В этом случае возникает ibase_query() [function.ibase-query]: Dynamic SQL Error SQL error code = -104. Так как не опознается таблица. Если убрать кавычки с таблицы и с переменных условия, то запрос выполняется но возвращает вместо значений полей соответственно строки zn1, zn2.

    Обнаружил, что проблема с numeric более распространена, так как она была обнаружена и в таблицах с другими названиями таблиц и переменных. Интересно, что выборка сделаная самим Firebird в командной строке дает правильные значения, а вывод этого значения через print или echo дает значения уменьшенные в 10 раз.


    P.S.: Кстати пример для функции ibase_blob_get в документации сайта php.ru нерабочий. Исправленный вариант видел на http://www.php.net/manual/en/function.i ... ob-get.php .
     
  4. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    перебирайтесь с того доисторического говна))
     
  5. chemister

    chemister Активный пользователь

    С нами с:
    18 июл 2010
    Сообщения:
    8
    Симпатии:
    0
    С конкретной версии 1.5 или с БД Firebird вообще?
     
  6. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    со старой по крайней мере))
     
  7. chemister

    chemister Активный пользователь

    С нами с:
    18 июл 2010
    Сообщения:
    8
    Симпатии:
    0
    Проверил на Firebird 2.0. Глюк тот же :(
    PHP версии 5. Дальше обновлять некуда :(

    Может это функция ibase_fetch_row глючит? Как можно посмотреть результаты запроса целиком в виде массива?
     
  8. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    chemister
    напишите свою реализацию драйвера :)

    хотя тут пхп уже невыгоден, бинарные операции в нем через адский зад работают
     
  9. chemister

    chemister Активный пользователь

    С нами с:
    18 июл 2010
    Сообщения:
    8
    Симпатии:
    0
    Решил проблему приведением типа к совместимому с типами PHP:

    Код (Text):
    1.  
    2. $sql = "select cast (zn1 as varchar(15)), cast (zn3 as varchar(15)) from znachenie where znachenie_ui = 12";
    3. $result = ibase_query($sql);
    4. while ($row = ibase_fetch_row($result)){
    5.  echo "Результат <br>";
    6.  echo $row[0];
    7.  echo ": ";
    8.  echo rtrim(rtrim($row[1], '0'), '.');
    9.  echo "<br>\n";
    10. } // end while
    11. ibase_free_result($result); //Освобождаем память от запроса