More problems with DBD::mysql (and resolution?)

More problems with DBD::mysql (and resolution?)

am 14.02.2006 12:02:40 von Martin.Evans

Hi again,

I am still struggling to make DBD::mysql work with my application. The
problem I posted feb 10 in this list - "Strange
selectall_hashref/fetchall_hashref problem with DBD::mysql" got no responses so
far and I'm still stumped as to why it does not work (I've had to junk
DBD::mysql for that task at the moment and replace it with DBD::ODBC and myodbc)

However, I have a new issue (and possible resolution):

$dbh->{RaiseError} = 1;
my $sth = $dbh->prepare('fred bloggs');

obviously invalid SQL but when I run this against DBD::mysql 3.0002_4:

o I get undef back but RaiseError not called
o "DBD::mysql::db prepare warning: at x.pl line nnn."
o the trace shows:

-> prepare for DBD::mysql::db (DBI::db=HASH(0x8320cbc)~0x8322e70 'fred blogg
s')
New DBI::st (for DBD::mysql::st, parent=DBI::db=HASH(0x8322e70), id=)
dbih_setup_handle(DBI::st=HASH(0x8323014)=>DBI::st=HASH(0x85 06858), DBD::mys
ql::st, 8323020, Null!)
dbih_make_com(DBI::db=HASH(0x8322e70), 8527880, DBD::mysql::st, 248, 0) thr#
0
> dbd_st_prepare MYSSQL_VERSION_ID 50015
error 0 recorded:

It would appear the code around line 2313 of dbdimp.c:

if (mysql_stmt_prepare(imp_sth->stmt, statement, strlen(statement)))
{

mysql_stmt_close(imp_sth->stmt);
imp_sth->stmt= NULL;
do_error(sth, mysql_errno(&imp_dbh->mysql), mysql_error(&imp_dbh->mysql));

/* For commands that are not supported by server side prepared statement
mechanism lets try to pass them through regular API */
if (mysql_errno(&imp_dbh->mysql) == ER_UNSUPPORTED_PS)
imp_sth->use_server_side_prepare= 0;
else
return FALSE;
}

attempts to use mysql_error AFTER closing the mysql statement and the
closing of the statement clears mysql_error on a connection handle
(I'm not too sure why as the docs say "A rule of thumb is that all
functions that have to ask the server for information reset
mysql_error() if they succeed."). If you move the call to do_error
(above) up to be the first thing in the block when mysql_stmt_prepare
fails the correct things seems to happen:

DBD::mysql::db prepare failed: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the
right syntax to use near 'fred bloggs' at line 1 at
x.pl line n.

I am not that familiar with MySQL's client library but it does appear
to have a mysql_stmt_error(stmt) function which the examples on the
MySQL web site use. Whether this should be used in preference to
mysql_error in this case I do not know.

If anyone has any ideas on my previous posting about a problems with DBD::mysql
and selectall_hashref I'd love to hear from you.

I am now running with at least 3 patches to DBD::mysql 3.0002_4 which I've
posted here. Patrick Galbraith posted inviting discussion 31-Jan.
Would you like me to roll all the patches in to one? Could you publish
a list of the bugs you've been mailed about so we can avoid spending time
tracking the same issues down.

Martin
--
Martin J. Evans
Easysoft Ltd, UK
http://www.easysoft.com