Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1