On Mon, 2012-07-09 at 16:49 +0400, Alexey Zakhlestin wrote: > On 09.07.2012, at 14:17, Johannes Schlüter wrote: > > > an example like this: > > > > $pdo = new PDO("mysql:..."); > > $select = $pdo->prepare("SELECT * FROM t WHERE id = ?"); > > /* do something ... connection break in between */ > > $delete = $pdo->prepare("DELETE FROM t WHERE id = ?"); > > $select->execute([1]); > > > > This will in fact do a DELETE, not a SELECT as the statement handle > > effectively is nothing but a per-connection counted unsigned long. > > Well, this sounds like a bug > > Prepared statements should become invalid once connection is lost and > further attempts to execute them should lead to exception
Nothing PHP can do about.*) The reconnect, if requested, happens silently. I've attached a simple test program (warning: not a good example for libmysql usage, missing some error handling, leaking everything etc.) demonstrating this behavior. Compile it using something like gcc `mysql_config --cflags --libs` mysql_reconnect_ps.c after editing username and password for your setup. If you comment out the mysql_kill() call the first statement will be executed, if you leave it as is the second will be executed. johannes *) Well there's one thing PHP could do - check the thread-id for every operation, if it changed there was a reconnect -- but better not use silent reconnects at all ...
#include <unistd.h> #include <mysql.h> #include <stdio.h> void main() { MYSQL_STMT *stmt1, *stmt2; my_bool my_true = 1; MYSQL *mysql = mysql_init(NULL); mysql_options(mysql, MYSQL_OPT_RECONNECT, &my_true); if (!mysql_real_connect(mysql, "localhost", "USER", "PASS", "test", 0, NULL, 0 )) { fprintf(stderr, "mysql_real_connect() failed: %s", mysql_error(mysql)); return; } stmt1 = mysql_stmt_init(mysql); mysql_stmt_prepare(stmt1, "SELECT 1", sizeof("SELECT 1")-1); mysql_kill(mysql, mysql_thread_id(mysql)); stmt2 = mysql_stmt_init(mysql); mysql_stmt_prepare(stmt2, "SELECT 2 UNION SELECT 3", sizeof("SELECT 2 UNION SELECT 3")-1); if (mysql_stmt_execute(stmt1)) { fprintf(stderr, "Error: %s\n", mysql_stmt_error(stmt1)); return; } mysql_stmt_store_result(stmt1); printf("got %i rows\n", mysql_stmt_num_rows(stmt1)); }
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php