За последние 24 часа нас посетили 20273 программиста и 1556 роботов. Сейчас ищет 1991 программист ...

Как распарсить ответ при INSERT в PostgreSQL

Тема в разделе "PHP и базы данных", создана пользователем sir Genry, 24 сен 2010.

  1. sir Genry

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

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    В PostgreSQL есть инструкция RETURNING возвращающая, например, значение счетчика после выполнения INSERT.
    Вот пример кода:
    Код (Text):
    1.  
    2.     $result = pg_query("INSERT INTO \"Table1\" (\"Field1\",\"Field2\") VALUES ('val1','val2') RETURNING \"RecID\"");
    3.     if (!$result) exit;
    Сущетвует ли возможность получения RecID из $result?
    Сейчас делаю так:
    Код (Text):
    1.  
    2.     $res = pg_query("SELECT last_value FROM \"Table1_RecID_seq\"");
    3.     $row = pg_fetch_row($res);
    4.     $ReсID = $row[0];
    Но хотелось бы сделать красвее )

    P.S. Поиском пользовался если что
     
  2. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Имена таблиц и полей в pgsql не должно обрамлять кавычками
     
  3. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    http://php.net/manual/en/function.pg-last-oid.html
    похоже, тебе нужно это. в mysql есть mysql_insert_id - которая возвращает последний вставленный ид. Такая же должна быть и в pg
     
  4. sir Genry

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

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    чтобы кавычки не использовать нужно писать все в нижнем регистре. А мне такая нотация не нравится...

    А по теме?
     
  5. sir Genry

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

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Я в мануал по OID не заходил, т.к. OID это немножко другое. Сейчас зашел и нашел там примеры, касающиеся этой темы. Вовбщем вывод неутешительный: аналога mysql_insert_id в постргресном API нет :(

    Всем спасибо. Вопрос отпал
     
  6. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Заходите...

    А, если не секрет, почему нужно пг?
    Я интересуюсь, потому что мне симпатизирует эта бд :):)
     
  7. sir Genry

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

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    есть такая дурцкая отмазка у программеров "так исторически сложилось". ))) Просто лет э-э-э... 12 назад у MySQL не было интегрити (про сейчас не интересовался, не знаю). А у постгреса была. Это было основным преимуществом. Ну и еще я привык всякие хранимые процедуры использовать, логику по максимуму в БД тащить. В постгресе все это как-то было более развито. Уже тогда в пг можно было написать SELECT ... FROM SELECT. А в современном пг всякие навороченные запросы появились. Например, очень пригодился WITH RECURSIVE для деревьев. Ну и многое другое что облегчает жизнь.
    Но я одного не понимаю: почему постгресе нет аналога ораклевых джобов? Это грустно. А в мускуле есть! Вот за это ему большой плюс. И не надо меня посылать на крон ) Я и так там )))
     
  8. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Ты знаешь, я люблю пг за процедуры и за охерительнейшие возможности при работе с full-text-search.
    Про нагрузку и удобство работы я молчу, ибо это давний холивар...

    А количество типов данных и возможность создания своих... Это просто конфетка.
    Например, у пг есть типы "mac" и "ip".
    Это кошерно :)
     
  9. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Не могу пройти стороной холивар, хочу сказать только одно...

    В большинстве случаев (я имею в виду простой типичный web) всякие "процедуры/итд" нафик не нужны, все забывают принцип KISS, между тем для 99% ТИПОВЫХ задач всё делается просто и без всяких "ораклевых джобов"

    Вы все забываете одно, PG и MySQL были сделаны не только для web, по этому если вы используете РНР для WEB и выбираете СУБД то забейте на всё и используйте то что вам удобно (и по быстродействию устраивает) минимально необходимый набор для 99% web-задач есть практически во всех СУБД на сегодняшний день.
     
  10. sir Genry

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

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Вобщем я в банде постгресников )
     
  11. sir Genry

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

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Vladson
    Увы, мне простых задач не попадается. Сижу щас пишу очередную систему учета. Пытаюсь в эксплорере сэмулировать понятные 1с-ному пользователю окошки. Так что постгрес меня здорово выручает - логику в него тащу. Еще бы джобов мне.... Ну вот надо!
     
  12. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    А может ты просто решаешь простые задачи сложными путями ?
     
  13. sir Genry

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

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Vladson
    1с - как бы простой путь? Вливаться в армию 1с-ников мне просто противно. Опять же так "исторически сложилось". Я своим студентам на примере 1с показывал как делать НЕ надо. Нормализацией в 1с первых версий вообще не пахло.
    А если говорить про MySQL как о простом пути, по сравнению с PostgerSQL, то это уже вопрос религии )

    За сим от дискуссии отключаюсь. Ибо работа )
     
  14. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    В PG есть много вкусностей именно для WEB приложений. Ясно, что написать можно на всем, включая файлы, но приятнее использовать удобные продукты. Попробуйте хотя-бы банальные массивы... пустчок, а сколько костылей экономит. Ну о полнотектовом поиске можно и не вспоминать.
    По теме - а в чем проблема то? Имхо, должно придти как результат банального селекта - так же данные и дергайте из ресурса.
     
  15. sir Genry

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

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Я на это надеялся и есессно прежеде чем тут написать попытался, но факир был пьян и фокус не удался.
     
  16. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    sir Genry
    PHP:
    1.  
    2. <?php
    3.  
    4. function get_array_from_pg($query){
    5.   // кусок кода, который из результата запроса в постгрес формирует ассоциативный массив.
    6.   $result = array();
    7.   $rows = pg_num_rows($query);
    8.   for ($i=0; $i<$rows; $i++){
    9.     $row = pg_fetch_array($query, $i, PGSQL_ASSOC);
    10.     foreach($row as $key=>$value) {
    11.       if(!is_numeric($key)) { $result[$i][$key] = $value; }
    12.       if($key == 'enabled') { $result[$i][$key] = ($value == 't') ? TRUE : FALSE; }
    13.     }
    14.   }
    15.   return $result;
    16. }
    17.  
    18.   $request = "INSERT INTO tablica (column_1, column_2) VALUES ('value_1', 'value_2') RETURNING value_id";
    19.   $query = pg_query($db, $request) or die("Cannot execute request to the database");
    20.   $result = get_array_from_pg($query);
    21.  
    22.   // Затем просто распечатай данный массив:
    23.   echo '<pre>';
    24.   print_r($result);
    25.   echo '</pre>';
    26.  
    27. ?>
    28.  

    данный массив будет содержать айдишники, вставленные в SERIAL-поле value_id. Вот, вроде так

    Оффтоп: булевы значения возвращаются как буквы t/f, которые вручную должны быть преобразованы в true/false
     
  17. sir Genry

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

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Прошу прощения у сообщества.
    Я проверил код, предоставленный Gromo, а также протестировал тоже самое с функцией pg_num_rows. Работает. Но я клянусь, что я проверял парсинг функцией pg_num_rows. Может быть в тот момент комп сглючил. Глюкота и мистика...

    Итого использую код типа:
    Код (Text):
    1.  
    2.     $result = pg_query("INSERT INTO table1 (field1, field2) VALUES ('val1', 'val2') RETURNING rec_id;");
    3.     if (!$result) exit;
    4.     $row = pg_fetch_row($result);
    5.     $RecID = $row[0];