C PostgreSQL не работа, но надо пару задач сделать. Подскажите, нужно безусловное приводение типов к int / decimal. Что бы не валилась ошибка, а то валится в FATAL, ибо обработчик такой:
Пробовал собственно так:
Валится с ошибкой , в случае плохого INT'а:
На PHP приводить к unsigned int не вариант (поскольку максимального значения для PHP-шного INT меньше чем bigint PostreSQL)
PHP:
<?php
/**
* Класс для работы с базой данных PostgreSQL
*/
class app_db_pgsql
{
/**
* Аттрибут объекта содержит текущую ссылку на соединение с СУБД (connection id)
* @var resource|null
*/
private static $connection_id;
/**
* Аттрибут содержит ресурс выполненный функцией pg_execute
* @var resource
*/
private $_last_pg_query_resource;
/**
* Метод выполняет соединение с postgresql или если соединение установлено возвращает текущий линк
* @return resource
*/
private function connection_id()
{
if (!isset(self::$connection_id))
{
if (! (self::$connection_id = pg_connect("host=localhost dbname=db user=use password=pass")) )
{
trigger_error("Ошибка соединения с базой данных PostgreSQL: ".pg_last_error(), E_USER_ERROR);
}
pg_set_client_encoding(self::$connection_id, "koi8-r"); // устанавлиаем кодировку клиента в соотвествии с кодировкой сайта
}
return self::$connection_id;
}
/**
* Метод подготовки SQL запроса
* @param unknown $query
* @return boolean
*/
public function prepare($query)
{
if (! pg_prepare($this->connection_id(), "", $query) )
{
trigger_error("Подготовка SQL запроса {$query} завершилось неудачно: ".pg_last_error($this->connection_id()), E_USER_ERROR);
}
return $this;
}
/**
* Выполняем подготовленный SQL запрос
* @param array $params
* @return app_db_pgsql
*/
public function execute(array $params = array())
{
if (! ($this->_last_pg_query_resource = pg_execute($this->connection_id(), "", $params)) )
{
trigger_error("Выполнение ранее подгтовленного запроса произошло с ошибкой: ".pg_last_error($this->connection_id()), E_USER_ERROR);
}
return $this;
}
/**
* Получаем строку
* @return array
*/
public function fetch_row()
{
return pg_fetch_row($this->_last_pg_query_resource);
}
/**
* Получаем строку (ассоциативный массив)
* @return array
*/
public function fetch_assoc()
{
return pg_fetch_assoc($this->_last_pg_query_resource);
}
/**
* Выполняет SQL без предподготовки, но с параметрами
* @param string $query
* @param array $params
* @return app_db_pgsql
*/
public function query_params($query, array $params = array())
{
if (! ($this->_last_pg_query_resource = pg_query_params($this->connection_id(), $query, $params)) )
{
trigger_error("Выполнение запроса c параметрами произошло с ошибкой: ".pg_last_error($this->connection_id()), E_USER_ERROR);
}
return $this;
}
/**
* Возвращает количество затронутых строк
* @return number
*/
public function num_rows()
{
return pg_num_rows($this->_last_pg_query_resource);
}
}
PHP:
public function getTwByCode($tw_code)
{
$pg = new app_db_pgsql();
$pg->query_params("select * from type_of_work where tw_code = cast($1 as int8)", array($tw_code));
if ($pg->num_rows() === 1)
{
return $pg->fetch_assoc();
}
return false;
}
Код:
Warning: pg_query_params() [function.pg-query-params]: Query failed: ОШИБКА: неверное значение для целого числа: "a" in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 95
Fatal error: Выполнение запроса c параметрами произошло с ошибкой: ОШИБКА: неверное значение для целого числа: "a" in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 97
Последнее редактирование: