PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : PHP » procédure stockée avec postgres » 09/02/2010 10:06:00

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

#2 Re : PHP » procédure stockée avec postgres » 09/02/2010 09:27:50

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

#3 PHP » procédure stockée avec postgres » 09/02/2010 08:14:35

stomerfull
Réponses : 6

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

#4 Re : PHP » probleme requete php/postgresql utilisant pdo » 25/01/2010 14:24:27

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 :-)

#5 Re : PHP » probleme requete php/postgresql utilisant pdo » 25/01/2010 08:37:56

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

#6 PHP » probleme requete php/postgresql utilisant pdo » 22/01/2010 08:55:52

stomerfull
Réponses : 4

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

#7 Re : PHP » probleme d'accès à postgres » 19/01/2010 09:42:59

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;
        }        
    }

#8 PHP » probleme d'accès à postgres » 19/01/2010 09:05:17

stomerfull
Réponses : 4

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

Pied de page des forums

Propulsé par FluxBB