ID: 41579
User updated by: vtsupermok at gmail dot com
Reported By: vtsupermok at gmail dot com
-Status: Feedback
+Status: Open
Bug Type: PDO related
Operating System: Window
PHP Version: 5.2.3
New Comment:
my php version is 5.1.2
and mysql client api version version is 4.1.7
Previous Comments:
------------------------------------------------------------------------
[2007-06-05 08:02:27] [EMAIL PROTECTED]
Please reduce the script to 20 lines max.
------------------------------------------------------------------------
[2007-06-05 07:52:25] vtsupermok at gmail dot com
you have kill my previous post???thank you so much~
I have try mysql version
5.0.27
5.0.18
4.1.12a
but all have the same result
you can re-established a connection automatically without any errors
after you kill the connection? let me post my code again.
<?
function dbConnect($db){
try{
$database="mysql:host={$db['host']};port={$db['port']};dbname={$db['name']}";
$pdo = new PDO($database, $db['userID'], $db['userPwd'],
array(PDO::ATTR_PERSISTENT => true));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_TIMEOUT,5);
return $pdo;
} catch (PDOException $e) {
throw $e;
}
}
function dbException($e,$db){
echo "<p>";
echo "Message : " . $e->getMessage() . "<br/>";
echo "File : " . $e->getFile() . "<br/>";
echo "Line : " . $e->getLine() . "<br/>";
echo "</p>";
die();
}
function dbQuery($pdo,$sql,$db){
try{
return $pdo->query($sql);
} catch (PDOException $e) {
throw $e;
}
}
function dbRecord($result,$db){
$resultSet=$result->fetchAll(PDO::FETCH_ASSOC);
$counter=count($resultSet);
if ($counter>0){
echo "<table border=1>";
for ($i=0;$i<$counter;$i++){
echo "<tr>";
foreach ($resultSet[$i] as $key => $value){
echo "<td>"."$value"."</td>";
}
echo "</tr>";
}
echo "</table>";
}
}
function dbGetThreadID($result,$db){
$id=0;
$resultSet=$result->fetchAll(PDO::FETCH_ASSOC);
$counter=count($resultSet);
if ($counter>0){
for ($i=0;$i<$counter;$i++){
if ($resultSet[$i]['Id']>$id){
$id=$resultSet[$i]['Id'];
}
}
}
return $id;
}
try {
$db=array(
'name'=>'abc',
'host'=>127.0.0.1',
'port'=>'3306',
'userID'=>'abc',
'userPwd'=>'123',
'charset'=>'latin1',
'encoding'=>'big-5'
);
echo '1. Start <Br />';
echo '2. Connect to DB by a PERSISTENT connection<Br />';
$pdo=dbConnect($db);
echo '3. query "select \'a\',\'b\',\'c\'"<Br />';
$sql="select 'a','b','c'";
$result=dbQuery($pdo,$sql,$db);
echo '4. list all of the result<Br />';
dbRecord($result,$db);
echo '5. query "show processlist"<br>';
$sql="show processlist";
$result=dbQuery($pdo,$sql,$db);
$threadId=dbGetThreadID($result,$db);
echo "7. suppose the thread id of this connection is {$threadId}.
(Are there any ways to get the thread id? I use a very stupid way to
GUESS the thread id)<Br />";
echo "8. kill this connection query 'kill $threadId'<Br />";
$sql="kill $threadId";
$result=dbQuery($pdo,$sql,$db);
echo "9. the PERSISTENT connection was kill.<Br />";
echo "10. Now, when you refresh your page, I SUPPOSE there are 2
result may happened.<br />";
echo "Case 1, since the connection was kill so it will create a new
connection automatically without throw any error. <br />";
echo "Case 2, it will throw a exception in function dbConnect()
since the connection was lost when it call create PDO object<Br>";
echo "but sadly the real case is, there are no exception was throw
until you make another query.<Br>";
echo "So the problem is there are no ways check the PERSISTENT
connection is still alive or not in case the connection was killed or
timeout<br>";
echo "by the way one more question, are there any function to get
the thread id?<br>";
} catch (PDOException $e) {
dbException($e,$db);
}
?>
------------------------------------------------------------------------
[2007-06-05 07:34:29] [EMAIL PROTECTED]
What MySQL version are you using?
------------------------------------------------------------------------
[2007-06-05 07:33:42] [EMAIL PROTECTED]
I'm still unable to replicate it.
mysql_ping() always fails, so the connection is actually re-established
on each request.
------------------------------------------------------------------------
[2007-06-05 06:43:00] vtsupermok at gmail dot com
here are my actual result
---------------------------------------------------------------
1. Start
2. Connect to DB by a PERSISTENT connection
3. query "select 'a','b','c'"
4. list all of the result
a b c
5. query "show processlist"
7. suppose the thread id of this connection is 2654. (Are there any
ways to get the thread id? I use a very stupid way to GUESS the thread
id)
8. kill this connection query 'kill 2654'
9. the PERSISTENT connection was kill.
10. Now, when you refresh your page, I SUPPOSE there are 2 result may
happened.
Case 1, since the connection was kill so it will create a new
connection automatically without throw any error.
Case 2, it will throw a exception in function dbConnect() since the
connection was lost when it call create PDO object
but sadly the real case is, there are no exception was throw until you
make another query.
So the problem is there are no ways check the PERSISTENT connection is
still alive or not in case the connection was killed or timeout
by the way one more question, are there any function to get the thread
id?
after refresh
-------------------------------------------------------------
1. Start
2. Connect to DB by a PERSISTENT connection
3. query "select 'a','b','c'"
Message : SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL
server during query
File : D:\AppServ\www\report\92\testing.php
Line : 25
------------------------------------------------------------------------
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/41579
--
Edit this bug report at http://bugs.php.net/?id=41579&edit=1