Bonjour,
J'utilise PHP 5.2.5
Et mysql : 5.0.45
Une classe sert à se connecter sur ma table gérant les session.
Aujourd'hui elle utilise Query et exec. Hier elle utilisait prepare et execute avec le même "résultat" l'erreurWarning: PDO::exec() [function.PDO-exec]: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. in E:\ZMWS\_web.zmwsc\sacAdos\classes\modele\modSessions.php on line 40
Voici ladite classe :
Voici la procédure stockée correspondante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 <?php /*16/01/2014 controleur dédié à la gestion des sessions*/ require_once __SAC.'/classes/utilitaires/singleton.class.php'; require_once __SAC.'/classes/modele/4D.php'; class ses extends aBsSoLitaire { private $x; private $cx; private $sth = null; private $my; private $ct; public $r=array(); protected function __construct() { parent::__construct (); $this->ct = (int) 0; $this->iniBase(); } private function iniBase(){ $this->x = laBas::donneLinstant(); $this->cx = $this->x->bx_icise(); } private function S_lasession($p){ $this->my = (string) "CALL S_lasession"; $this->my .= '('.$p->quoi.','.$this->cx->quote($p->id).','.$this->cx->quote($p->utid).','.$this->cx->quote($p->emp); $this->my .= ','.$this->cx->quote($p->data).','.$this->cx->quote($p->neo).')'; if($p->quoi == 1){//le seul select $this->sth = $this->cx->query($this->my); $this->r = $this->sth->fetchAll(PDO::FETCH_ASSOC); $this->sth->closeCursor(); $this->sth = null; return $this->r; }else{//insert ou update ou delete try{ $this->r = $this->cx->exec($this->my); }catch(PDOException $e){ echo(sql_error($e)); } return $this->r; } } //Méthodes publiques dont la première d'un singleton public static final function donneLinstant(){ $bob = parent::donneLinstance(__CLASS__); if($bob === FALSE){ throw new Exception('ERREUR : principe de départ non respecté'); }else{ return $bob; } } final public function appel($a,$r){ return $this->$a($r); } } ?>
Bien évidemment la connexion PDO utilise :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 CREATE PROCEDURE `S_lasession`( IN `p_quoi` TINYINT, IN `p_id` VARCHAR(255), IN `p_utid` MEDIUMINT(8), IN `p_emp` VARCHAR(40), IN `p_data` TEXT , IN `p_neID` VARCHAR(255)) BEGIN DECLARE v_count TINYINT DEFAULT 0; CASE p_quoi WHEN 1 THEN SELECT `s_lessessions`.`sdata` AS 'D', `s_lessessions`.`sempreinte` AS 'Semp' FROM `icise`.`s_lessessions` WHERE sid = p_id ORDER BY sstamp DESC LIMIT 0 , 1; WHEN 2 THEN DELETE FROM `icise`.`s_lessessions` WHERE `sstamp` < SUBTIME(now(),'0 0:2:0.001'); SELECT COUNT(`sid`) INTO v_count FROM `icise`.`s_lessessions` WHERE `sid`=p_id; IF (v_count > 0) THEN UPDATE `icise`.`s_lessessions` SET `sdata`=p_data,`sempreinte`=p_emp WHERE `sid`=p_id; ELSE INSERT INTO `icise`.`s_lessessions` (`sid`,`sdata`,`sempreinte`,`sutid`) VALUES(p_id,p_data,p_emp,p_utid); END IF; WHEN 3 THEN DELETE FROM `icise`.`s_lessessions` WHERE `sid`=p_id; WHEN 4 THEN DELETE FROM `icise`.`s_lessessions` WHERE (`sutid`=p_utid) OR(`sstamp` < SUBTIME(now(),'0 0:2:0.001')); WHEN 5 THEN UPDATE `icise`.`s_lessessions` SET `s_lessessions`.`sid`=p_neID; END CASE; END$$Nous nous abstiendrons de commenter l'efficacité de
Code : Sélectionner tout - Visualiser dans une fenêtre à part $this->bx[$i] = new PDO($this->dsn[$i], $this->lUt, $this->passe, array(PDO::ATTR_PERSISTENT=>true,PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>true));
Code : Sélectionner tout - Visualiser dans une fenêtre à part PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>true
Si vous pouviez aider...
Merci d'avance !
Partager