Vous n'êtes pas identifié(e).
Pages : 1
Oui je sais que currval est utilisé pour retourner le last insert id mais que
dans currval il y a comme paramètre currval('languages_id_seq'); et cette paramètre languages_id_seq est obtenu à partir de la procédure stockée get_sequence qui est une function si j'ai bien compris les documentations qui doit être défini et écrit
CREATE OR REPLACE FUNCTION get_sequence(...)
RETURNS ...
.....
LANGUAGE ’pgsql’ ;
et c'est la que je bloque
Oui bien sur c'est la documentation qu'on ma fournie mais pas le code
et c'est pour ça que j'ai besoin de l'aide ici pour m'aider à ecrire le code de la procédure qui retourne l'id de la séquence
si vous avez une piste ou url je suis preneur
merci
bonjour
je voudrais mettre en place une procédure stockée dans la base de donnée avec postgres, en tant que débutant j'ai besoin de votre conseil pour avancer
voici la méthode à modifier pour prendre en compte la procédure stockée :
/**
* Method for returning the last insert id
*
*/
public function getLastInsertedId($sqlQuery, $pdoObject) {
// Checks if query is an insert and gets table name
if( preg_match("/^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)/is", $sqlQuery, $tablename) ) {
// Gets this table's last sequence value
$query = "SELECT currval('" . $tablename[1] . "_id_seq') AS last_value";
$temp_q_id = $this->prepared($query);
$temp_q_id->execute();
if($temp_q_id) {
$temp_result = $temp_q_id->fetch(PDO::FETCH_ASSOC);
return ( $temp_result ) ? $temp_result['last_value'] : false;
}
}
return false;
}
voici l'instruction qu'on ma donné c'est à dire que la personne a déjà mis en place la procédure stockée dans la serveur en ligne mais moi je voudrais le mettre en place de mon coté en local pour pouvoir faire un test avec la mis en ligne
I added a stored procedure to the db
you can invoke it like this
select get_sequence('public', 'languages', 'id');
and it will return
evostream_logs=> select get_sequence('public', 'languages', 'id');
get_sequence
------------------
languages_id_seq
(1 row)
this is the way of getting the sequence_id
the regexp method ain't going to fly!
moreover, to get the last insert id you can do:
select currval('languages_id_seq');
ceci est exemple de procédure stockée dans une table language avec les champs id et name pour retourner le last insert id
le but est de ne pas utiliser le regex dans la méthode
merci pour votre aide
j'ai trouver cet fonction dans le document officiel et que j'ai utilisé et qui m'a bien retourné le lastinsertid
public function pgsqlLastInsertId($sqlQuery, $pdoObject)
{
// Checks if query is an insert and gets table name
if( preg_match("/^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)/is", $sqlQuery, $tablename) )
{
// Gets this table's last sequence value
$query = "SELECT currval('" . $tablename[1] . "_id_seq') AS last_value";
$temp_q_id = $this->prepared($query);
$temp_q_id->execute();
if($temp_q_id)
{
$temp_result = $temp_q_id->fetch(PDO::FETCH_ASSOC);
return ( $temp_result ) ? $temp_result['last_value'] : false;
}
}
return false;
}
merci :-)
Bonjour à tous
Oui le probleme est vraiment lié au <br> dans la chaine car il faut que j'ai transformé en string la valeur utilisé pour pouvour l'utiliser , la valeur retourné était encore un objet simpleXml
j'ai utilisé la fonction strval de php comme ça
//print_r($tab);
foreach($tab as $cle=>$valeur)
{
$tabVal[$cle] = array('type_id'=>$cle,'import_time'=>strval($valeur));
}
Etant débutant en developpement avec postgresql dans cet même script, je suis face à un nouveau probleme : j'arrive pas à retourner le lastinsert id quand je fait un insert
je vous poste ici les code
la classe principale
<?php
class BaseDBAccess
{
var $sDriver='';
var $sHost='';
var $sDatabase='';
var $sUser='';
var $sPassword='';
private static $oDatabase;
var $oPdo=null;
var $sQuery='';
var $oPDOStatement=null;
/**
* Constructor for database connection
* @param string $sDriver
* @param string $sHost
* @param string $sDatabase
* @param string $sUser
* @param string $sPassword
*/
private function __construct($sDriver='',$sHost='',$sDatabase='',$sUser='',$sPassword='')
{
try{
$this->setDriver($sDriver);
$this->setHost($sHost);
$this->setDatabase($sDatabase);
$this->setUser($sUser);
$this->setPassword($sPassword);
$sDrive = $this->sDriver.':dbname='.$this->sDatabase.";host=".$this->sHost;
$this->oPdo=new PDO($sDrive, $this->sUser, $this->sPassword);
$this->oPdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo 'Erreur : '.$e->getMessage().'<br />';
echo 'N° : '.$e->getCode();
}
return $this->oPdo;
}
/**
* Method for setting all variables
* @return unknown_type
*/
public function setDriver($sDriver){
$this->sDriver=$sDriver;
}
public function setHost($sHost){
$this->sHost=$sHost;
}
public function setDatabase($sDatabase){
$this->sDatabase=$sDatabase;
}
public function setUser($sUser){
$this->sUser=$sUser;
}
public function setPassword($sPassword){
$this->sPassword=$sPassword;
}
public function setQuery($sQuery){
$this->sQuery=$sQuery;
}
protected function setPdo($oPdo){
$this->oPdo=$oPdo;
}
/**
* To get instance of Database
*
* @param string $sDriver
* @param string $sHost
* @param string $sDatabase
* @param string $sUser
* @param string $sPassword
* @return Database object
*/
public static function getInstance($sDriver='',$sHost='',$sDatabase='',$sUser='',$sPassword=''){
if(is_null(self::$oDatabase)){
self::$oDatabase = new BaseDBAccess($sDriver,$sHost,$sDatabase,$sUser,$sPassword);
}
return self::$oDatabase;
}
/**
* Initiates a transaction
* @return <bool> */
public function beginTransaction()
{
return $this->oPdo->beginTransaction();
}
/* Commits a transaction
@return <bool> */
public function commit()
{
return $this->oPdo->commit();
}
/* Commits a transaction
@return <bool> */
public function prepared($oPDOStatement)
{
$this->oPDOStatement =$oPDOStatement;
return $this->oPdo->prepare($oPDOStatement);
}
/* Fetch the SQLSTATE associated with the
last operation on the database handle
* @return <string> */
public function errorCode()
{
return $this->oPdo->errorCode();
}
/* Fetch extended error information associated with
the last operation on the database handle
@return <array> */
public function erroInfo()
{
return $this->oPdo->errorInfo();
}
/* Executes an SQL statement, return the number of affected row
@param <String> $statement
@return <int> */
public function exec($statement)
{
return $this->oPdo->exec($statement);
}
/* Rolls back a transaction
@return <bool> */
public function rollBack()
{
return $this->oPdo->rollBack();
}
public function lastInsertId()
{
return $this->oPdo->lastInsertId();
}
} /*** end of class ***/
?>
et la classe pour postgres
<?php
require_once ("BaseDBAccess.php");
class PostgresqlDBAccess extends BaseDBAccess
{
var $PgsqlConnection = '';
var $seq;
public function __construct()
{
// $this->PgsqlConnectDb();
}
public function PgsqlConnectDb()
{
$this->PgsqlConnection = $PgsqlConnection;
$this->PgsqlConnection = BaseDBAccess::getInstance('pgsql','localhost','mabase','postgres','admin');
return $this->PgsqlConnection;
}
/**
* @Insert a value into a table
* @acces public
* @param string $table
* @param array $values
* @return int The last Insert Id on success or throw PDOexeption on failure
*/
public function insert($table,$value)
{
$this->PgsqlConnectDb();
/*** snarg the field names from the first array member ***/
$fieldnames = array_keys($value[0]);
/*** now build the query ***/
$size = sizeof($fieldnames);
$i = 1;
$sql = "INSERT INTO $table";
/*** set the field names ***/
$fields = '( ' . implode(' ,', $fieldnames) . ' )';
/*** set the placeholders ***/
$bound = '(:' . implode(', :', $fieldnames) . ' )';
/*** put the query together ***/
$sql .= $fields.' VALUES '.$bound;
/*** prepare and execute ***/
$stmt = $this->PgsqlConnection->prepared($sql);
try
{
foreach($value as $vals)
{
$this->PgsqlConnection->beginTransaction();
$stmt->execute($vals);
$this->PgsqlConnection->commit();
$lastid = $this->PgsqlConnection->lastInsertId();
var_dump($lastid);
}
}catch(PDOException $e){
$this->PgsqlConnection->rollback();
echo 'Erreur : '.$e->getMessage().'<br />';
echo 'N° : '.$e->getCode();
}
}
}
/*** end of class ***/
?>
lors de l'appel de la méthode insert
le var_dump($lastid) me retourne du boolean bool(false) alors que ça doit être l'id du dernier enregistrement fait
si vous aver une idée
merci d'avance
Bonjour,
j'ai deux fonction comme ci dessous qui pemet de sauver dans une base postgres des données via un tableau en utilisant pdo (php dataobjet)
public function CreateEvent($table,$value)
{
$this->OpenPgsqlConnect();
/*** snarg the field names from the first array member ***/
$fieldnames = array_keys($value[0]);
print $fiednames."<br>";
/*** now build the query ***/
$size = sizeof($fieldnames);
$i = 1;
$sql = "INSERT INTO $table";
/*** set the field names ***/
$fields = '( ' . implode(' ,', $fieldnames) . ' )';
/*** set the placeholders ***/
$bound = '(:' . implode(', :', $fieldnames) . ' )';
/*** put the query together ***/
$sql .= $fields.' VALUES '.$bound;
// print $sql."<br>";
/*** prepare and execute ***/
$stmt = $this->Pgsqlconnet->prepared($sql);
//var_dump($stmt)."<br>";
foreach($value as $vals)
{
//echo $vals;
$stmt->execute($vals);
}
}
public function SaveXml()
{
$this->OpenPgsqlConnect();
$xmlParsed = $this->LoadXml("medialist.xml");
$tab =array();
$tabVal = array();
foreach($xmlParsed as $item)
{
$temp = $item['name'];
$tab[]= $item->TIMESTAMP."<br>";
}
//print_r($tab);
foreach($tab as $cle=>$valeur)
{
$tabVal[$cle] = array('type_id'=>$cle,'import_time'=>$valeur);
}
print "<pre>";
print_r($tabVal);
print "</pre>";
$this->CreateEvent('events',$tabVal);
}
la structure du tableau $tabVal
Array
(
[0] => Array
(
[type_id] => 0
[import_time] => 2010-01-02T00:00:02.000
)
[1] => Array
(
[type_id] => 1
[import_time] => 2010-01-01T00:00:01.000
)
[2] => Array
(
[type_id] => 2
[import_time] => 2010-01-02T00:00:02.000
)
[3] => Array
(
[type_id] => 3
[import_time] => 2010-01-03T00:00:03.000
)
[4] => Array
(
[type_id] => 4
[import_time] => 2010-01-04T00:00:04.000
)
[5] => Array
(
[type_id] => 5
[import_time] => 2010-01-05T00:00:05.000
)
[6] => Array
(
[type_id] => 6
[import_time] => 2010-01-06T00:00:06.000
)
[7] => Array
(
[type_id] => 7
[import_time] => 2010-01-07T00:00:07.000
)
[8] => Array
(
[type_id] => 8
[import_time] => 2010-01-08T00:00:08.000
)
[9] => Array
(
[type_id] => 9
[import_time] => 2010-01-09T00:00:09.000
)
)
et la tables events :
create table events
(
id bigserial not null primary key,
type_id integer not null references event_types(id),
import_time timestamp without time zone not null
);
tous les codes marches bien sauf j'obtient cet erreur que j'arrive pas jusque là à corriger
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[22007]: Invalid datetime format: 7 ERREUR: syntaxe en entrée invalide pour le type timestamp : « 2010-01-02T00:00:02.000<br> » LINE 1: ... INTO events( type_id ,import_time ) VALUES ('0', '2010-01-0... ^' i
à mon avis le probleme se trouve au niveau du type de import_time , celle ci est interprété en string alors que ça doit être un timestamp
merci pour votre aide
merci beaucoup pour votre réponse
j'ai du modifier comme ça le code car il ne trouve pas les paramètres dans la méthode ou constructeur serialier
class Serializer
{
// Variable for XML object
var $urlXML;
var $host;
var $username;
var $password;
var $port;
var $dbname;
var $error = null;
var $dbconnect;
var $query;
var $result;
var $persistent;
//Constructor
public function __construct()
{
$this->Connect();
}
//method for connecting into the database
public function Connect ($Db="evostream_logs",$Host="127.0.0.1",$PgPort=5432,$User="postgres",$pass="admin",$persist=0)
{
// Passed the variable to objet
$this->dbname=$Db;
$this->host=$Host;
$this->port=$PgPort;
$this->username=$User;
$this->password=$pass;
$this->persistent=$persist;
$connect="host='".$this->host."' port='".$this->port."' dbname='".$this->dbname."' user='".$this->username."'";
// if password is not empty
if (!empty($this->password))
{
$connect.=" password=".$this->password;
}
//Connection persistent
if ($this->persistent)
{
$this->dbconnect=pg_pconnect($connect);
}else{
$this->dbconnect=pg_connect($connect);
}
//if not connected
if (!$this->dbconnect)
{
$this->error="cannot connect to database ".$this->dbname;
}
}
bonjour,
j'obtient cet erreur quand j'essaie de se connecter à une base postgres
Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: FATAL: aucun nom d'utilisateur PostgreSQL n'a été spécifié dans le paquet de démarrage in C:\wamp\www\evostreamclass\serializer.php on line 46
Warning: pg_query(): supplied argument is not a valid PostgreSQL link resource in C:\wamp\www\evostreamclass\serializer.php on line 129
Warning: pg_last_error(): supplied argument is not a valid PostgreSQL link resource in C:\wamp\www\evostreamclass\serializer.php on line 77
<?php
/*
* Class for parsing XML file
* Version 18-01-2010
*/
class Serializer
{
// Variable for XML object
var $urlXML;
var $host;
var $username;
var $password;
var $port;
var $dbname;
var $error = null;
var $dbconnect;
var $query;
var $result;
var $persistent;
//Constructor
public function Serializer($Db="mabase",$Host="127.0.0.1",$PgPort=5432,$User="postgres",$pass="admin",$persist=0)
{
$this->dbname=$Db;
$this->host=$Host;
$this->port=$PgPort;
$this->username=$User;
$this->password=$pass;
$this->persistent=$persist;
$this->Connect();
}
//method for connecting into the database
public function Connect ()
{
$connect="host='".$this->host."' port='".$this->port."' dbname='".$this->dbname."' user='".$this->username."'";
if (!empty($this->password))
$connect.=" password=".$this->password;
if ($this->persistent)
$this->dbconnect=pg_pconnect($connect);
else
$this->dbconnect=pg_connect($connect);
if (!$this->dbconnect)
$this->error="cannot connect to database ".$this->dbname;
}
public function ExecuteQuery($sql)
{
$this->query = new Query($sql,$this->dbconnect);
$this->result = $this->query->Execute();
$this->error = $this->query->Error();
return $this->result;
}
public function FetchResult (&$row, $assoc=PGSQL_BOTH)
{
if (!$this->error)
{
@$arr=pg_fetch_array ($this->result, $row, $assoc);
return $arr;
}
else
{
echo "An error occured, $this->error";
return null;
}
}
public function Error ()
{
if (version_compare(phpversion(), "4.2.0", "ge")>0)
$this->error=pg_last_error ($this->dbconnect);
return $this->error;
}
//Methode for parsin the element
public function parser($urlXMLtoparse)
{
//Passed the urlXML to the object
$this->urlXML = $urlXMLtoparse;
//Charging data of the XML
$xml = simplexml_load_file($this->urlXML);
// if xml charger
if($xml)
{
// for debugging
/*echo "<table border='1'>";
foreach($xml as $valeur)
{
echo "<tr>";
foreach($valeur as $cle=>$val)
{
echo "<td>".$val."</td>";
}
echo "</tr>";
}
echo "</table>";*/
return $xml;
}
}
}
class Query
{
var $_sql;
var $_result;
var $_field;
var $_dbconnection;
var $_error;
public function Query($sql,$dbconnection)
{
$this->_sql = $sql;
$this->_dbconnection = $dbconnection;
}
public function Execute()
{
$this->_result = pg_query($this->_dbconnection,$this->_sql);
$this->_error = pg_result_error($this->_result);
return $this->_result;
}
public function Error()
{
return $this->_error;
}
}
?>
require_once("serializer.php");
$parseur = new Serializer($dbname,$host,$port,$username,$password,$persistent);
$retourParser = $parseur->parser("monfichier.xml");
//la requete sql
$sql = "select * from clients";
if(!$parseur->ExecuteQuery($sql))
{
die ($parseur->Error());
}
for ($row=0; $result=$parseur->FetchResult($row, PGSQL_BOTH); $row++)
{
echo $result['firstname'];
}
PS :
j'ai installé en local postgresql 8.4
j'ai mis en place aussi phpgadmin pour une interface convivial comme phpmyadmin
merci d'avance
Pages : 1