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 22/01/2010 08:55:52

stomerfull
Membre

probleme requete php/postgresql utilisant pdo

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

Hors ligne

#2 22/01/2010 09:37:59

gleu
Administrateur

Re : probleme requete php/postgresql utilisant pdo

Il y a plus de chances que le problème soit dû à un <br> juste après la date et heure. D'après le log, il reçoit 2010-01-02T00:00:02.000<br> pour un champ timestamp ce qui ne peut pas fonctionner. Déjà j'ai quelques doutes sur le format de la date, mais alors le <br>, c'est clair, ça pose problème.


Guillaume.

Hors ligne

#3 25/01/2010 08:37:56

stomerfull
Membre

Re : probleme requete php/postgresql utilisant pdo

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

Dernière modification par stomerfull (25/01/2010 09:03:18)

Hors ligne

#4 25/01/2010 11:57:15

gleu
Administrateur

Re : probleme requete php/postgresql utilisant pdo

Il est obligatoire préciser le nom de la séquence. Tout est indiqué dans la documentation de PHP sur lastInsertId : http://php.net/manual/fr/pdo.lastinsertid.php


Guillaume.

Hors ligne

#5 25/01/2010 14:24:27

stomerfull
Membre

Re : probleme requete php/postgresql utilisant pdo

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

Hors ligne

Pied de page des forums