ID: 39858 Comment by: timo at hhesse dot de Reported By: develar at gmail dot com Status: Assigned Bug Type: PDO related Operating System: Windows XP SP2 PHP Version: 5.2.0 Assigned To: wez New Comment:
Hi mike, thanks for the fixed php_pdo_mysql.dll! I tested it right now and it works perfectly! It took me quite the whole day finding out that it was a php bug what made my stored procedures producing those exceptions (on Windows IIS). But now I'm asking myself if your fix will find its way into the next PHP release so that I can be sure my code will work at my customers Windows servers too or if I should use some script language that supports stored procedures as they are meant... A reliable answer in this issue would be great! ;-) Previous Comments: ------------------------------------------------------------------------ [2007-03-09 13:24:09] mike at we11er dot co dot uk Hi everyone. We have a fixed php_pdo_mysql.dll in our svn repos - but the guy that compiled it all hasn't got the source together because it involved a massive overhaul of the php and extension code to support the latest mysql libs. I know your first thoughts will be "There's no way I'm going to use a .dll from a *hackthissite*!", that's fine... but the guy that compiled it can be trusted, and I've been using it on my windows machine for a week or two now. http://source.hackthissite.org/wsvn/HTSv4/trunk/PDO/php_pdo_mysql.dll I'll see if we can get some sort of source code version together. Until then, use this at your own risk. ------------------------------------------------------------------------ [2007-02-27 16:29:58] james dot cordon at btinternet dot com What I have stated previously works, but only with the PHP vers. of libmysql.dll {error lost connection} mysql vers. {error unbuffered queries} just keeps making new connections until it is maxed out, have found no solution to this. I am using the very latest vers of everything. ------------------------------------------------------------------------ [2007-02-23 12:09:20] james dot cordon at btinternet dot com previous doesn't address stored procedure prob (from what i've read this is a win prob only). my revised approach: Essentialy after you use a stored procedure call, burn another query to force an exception. ### private $connect_a=array(); private $connected=0; public function __construct($dsn=NULL, $user=NULL, $pass=NULL){ if(is_array($dsn)){ $this->connect_a['DSN']=$dsn[0]; $this->connect_a['U']=$dsn[1]; $this->connect_a['P']=$dsn[2]; } else { $this->connect_a['DSN']=$dsn; $this->connect_a['U']=$user; $this->connect_a['P']=$pass; } }// public function query($q){ if($this->connected==0){ $this->connect(); } return parent::query($q); }// public function dropConnection($stmt){ $stmt->closeCursor(); $this->connected=0; }## public function callStoredProcedure($stmt){ $resultset; try{ #multi array while ($row= $stmt->fetch()) { $resultset[]=$row; echo '<br />'; var_dump($row); echo '<br />'; } #burn if(stripos($_SERVER['SERVER_SOFTWARE'], 'win') ){ $stmt=$this->query("select 1+1"); } }catch(PDOException $e){ if($e->getCode()=='HY000' AND strpos ($e->getMessage(), 'Lost connection' )){ print "<-!!!- Error!: Caught 'Lost connection error, dropConnection() -!!!-><br />"; $this->dropConnection($stmt); } else { throw $e; } } return $resultset; }// public function connect(){ #if($this->connected==1) return true; try{ parent::__construct($this->connect_a['DSN'], $this->connect_a['U'], $this->connect_a['P']); } catch (Exception $e) { throw($e); } $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->connected=1; }// #EXAMPLE #just to prove obj is same one $pdodl_1->temp_id='AAAAAA'; $i=100; do{ echo 'LOOP NUM:'.$i.'<br />'; echo '<br />PDODL OBJ: '; var_dump($pdodl_1); echo '<br /><br />'; $stmt=$pdodl_1->query("call testMany()"); $stmt->setFetchMode(PDO::FETCH_ASSOC); $rset=$pdodl_1->callStoredProcedure($stmt); $i--; } while($i>0); This is all from another project, so may need some tinkering. ------------------------------------------------------------------------ [2007-02-23 11:29:16] martin dot schmitz at uni-bielefeld dot de I've got a dirty solution for your problem (works under linux, not tested on windows) if i do: $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->setAttribute( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $datasets = $dbh->query( 'SELECT * FROM table_name_1 WHERE id=5); $datasets->execute(); $result_1 = $datasets->fetch( PDO::FETCH_ASSOC); $datasets = $dbh->query( 'SELECT * FROM table_name_2 WHERE id=7); $datasets->execute(); $address = $datasets->fetch( PDO::FETCH_ASSOC); it gets the same unbuffered error. But if I do a fetch twice on the first result and store it to a dummy array, the second query works: $datasets = $dbh->query( 'SELECT * FROM table_name_1 WHERE id=5); $datasets->execute(); $result_1 = $datasets->fetch( PDO::FETCH_ASSOC); // test, remove if bug is fixed $dummy = $datasets->fetch( PDO::FETCH_ASSOC); $datasets = $dbh->query( 'SELECT * FROM table_name_2 WHERE id=7); $datasets->execute(); $address = $datasets->fetch( PDO::FETCH_ASSOC); I think the cursor-pointer does not work correctly?? You can also do a fetchAll(), but then your result looks like: array[0] => ( array=>([prename] => 'Martin' [name] => 'Schmitz')) instead of array=>([prename] => 'Martin' [name] => 'Schmitz') Hope it works for you ------------------------------------------------------------------------ [2007-02-22 12:39:23] james dot cordon at btinternet dot com AHHHHHH!!!! My bodge-it above doesn't work correctly, it just opens but doesn't close many connections. This does work (tried several times on 200 consec' queries) added closeCursor(). $i=100; while($i>0){ echo 'LOOP NUM:'.$i.'<br />'; try{ $stmt=$pdodl_1->query("call testMany()"); $stmt->setFetchMode(PDO::FETCH_ASSOC); echo '<br />PDODL OBJ: '; var_dump($pdodl_1); echo '<br />PDO::STATEMENT OBJ: <br />'; var_dump($stmt); echo '<br /><br />'; while ($row= $stmt->fetch()) { echo '<br />'; var_dump($row); echo '<br />'; } $i--; }catch(PDOException $e){ if($e->getCode()=='HY000'){ $stmt->closeCursor(); $pdodl_1->connect(); $i--; } else { throw $e; } } } ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/39858 -- Edit this bug report at http://bugs.php.net/?id=39858&edit=1