В PostgreSQL есть инструкция RETURNING возвращающая, например, значение счетчика после выполнения INSERT. Вот пример кода: Код (Text): $result = pg_query("INSERT INTO \"Table1\" (\"Field1\",\"Field2\") VALUES ('val1','val2') RETURNING \"RecID\""); if (!$result) exit; Сущетвует ли возможность получения RecID из $result? Сейчас делаю так: Код (Text): $res = pg_query("SELECT last_value FROM \"Table1_RecID_seq\""); $row = pg_fetch_row($res); $ReсID = $row[0]; Но хотелось бы сделать красвее ) P.S. Поиском пользовался если что
http://php.net/manual/en/function.pg-last-oid.html похоже, тебе нужно это. в mysql есть mysql_insert_id - которая возвращает последний вставленный ид. Такая же должна быть и в pg
чтобы кавычки не использовать нужно писать все в нижнем регистре. А мне такая нотация не нравится... А по теме?
Я в мануал по OID не заходил, т.к. OID это немножко другое. Сейчас зашел и нашел там примеры, касающиеся этой темы. Вовбщем вывод неутешительный: аналога mysql_insert_id в постргресном API нет Всем спасибо. Вопрос отпал
есть такая дурцкая отмазка у программеров "так исторически сложилось". ))) Просто лет э-э-э... 12 назад у MySQL не было интегрити (про сейчас не интересовался, не знаю). А у постгреса была. Это было основным преимуществом. Ну и еще я привык всякие хранимые процедуры использовать, логику по максимуму в БД тащить. В постгресе все это как-то было более развито. Уже тогда в пг можно было написать SELECT ... FROM SELECT. А в современном пг всякие навороченные запросы появились. Например, очень пригодился WITH RECURSIVE для деревьев. Ну и многое другое что облегчает жизнь. Но я одного не понимаю: почему постгресе нет аналога ораклевых джобов? Это грустно. А в мускуле есть! Вот за это ему большой плюс. И не надо меня посылать на крон ) Я и так там )))
Ты знаешь, я люблю пг за процедуры и за охерительнейшие возможности при работе с full-text-search. Про нагрузку и удобство работы я молчу, ибо это давний холивар... А количество типов данных и возможность создания своих... Это просто конфетка. Например, у пг есть типы "mac" и "ip". Это кошерно
Не могу пройти стороной холивар, хочу сказать только одно... В большинстве случаев (я имею в виду простой типичный web) всякие "процедуры/итд" нафик не нужны, все забывают принцип KISS, между тем для 99% ТИПОВЫХ задач всё делается просто и без всяких "ораклевых джобов" Вы все забываете одно, PG и MySQL были сделаны не только для web, по этому если вы используете РНР для WEB и выбираете СУБД то забейте на всё и используйте то что вам удобно (и по быстродействию устраивает) минимально необходимый набор для 99% web-задач есть практически во всех СУБД на сегодняшний день.
Vladson Увы, мне простых задач не попадается. Сижу щас пишу очередную систему учета. Пытаюсь в эксплорере сэмулировать понятные 1с-ному пользователю окошки. Так что постгрес меня здорово выручает - логику в него тащу. Еще бы джобов мне.... Ну вот надо!
Vladson 1с - как бы простой путь? Вливаться в армию 1с-ников мне просто противно. Опять же так "исторически сложилось". Я своим студентам на примере 1с показывал как делать НЕ надо. Нормализацией в 1с первых версий вообще не пахло. А если говорить про MySQL как о простом пути, по сравнению с PostgerSQL, то это уже вопрос религии ) За сим от дискуссии отключаюсь. Ибо работа )
В PG есть много вкусностей именно для WEB приложений. Ясно, что написать можно на всем, включая файлы, но приятнее использовать удобные продукты. Попробуйте хотя-бы банальные массивы... пустчок, а сколько костылей экономит. Ну о полнотектовом поиске можно и не вспоминать. По теме - а в чем проблема то? Имхо, должно придти как результат банального селекта - так же данные и дергайте из ресурса.
sir Genry PHP: <?php function get_array_from_pg($query){ // кусок кода, который из результата запроса в постгрес формирует ассоциативный массив. $result = array(); $rows = pg_num_rows($query); for ($i=0; $i<$rows; $i++){ $row = pg_fetch_array($query, $i, PGSQL_ASSOC); foreach($row as $key=>$value) { if(!is_numeric($key)) { $result[$i][$key] = $value; } if($key == 'enabled') { $result[$i][$key] = ($value == 't') ? TRUE : FALSE; } } } return $result; } $request = "INSERT INTO tablica (column_1, column_2) VALUES ('value_1', 'value_2') RETURNING value_id"; $query = pg_query($db, $request) or die("Cannot execute request to the database"); $result = get_array_from_pg($query); // Затем просто распечатай данный массив: echo '<pre>'; print_r($result); echo '</pre>'; ?> данный массив будет содержать айдишники, вставленные в SERIAL-поле value_id. Вот, вроде так Оффтоп: булевы значения возвращаются как буквы t/f, которые вручную должны быть преобразованы в true/false
Прошу прощения у сообщества. Я проверил код, предоставленный Gromo, а также протестировал тоже самое с функцией pg_num_rows. Работает. Но я клянусь, что я проверял парсинг функцией pg_num_rows. Может быть в тот момент комп сглючил. Глюкота и мистика... Итого использую код типа: Код (Text): $result = pg_query("INSERT INTO table1 (field1, field2) VALUES ('val1', 'val2') RETURNING rec_id;"); if (!$result) exit; $row = pg_fetch_row($result); $RecID = $row[0];