Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
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