Reputation: 136
When executing a multi-command script (for instance, a few CREATE TABLE
commands and perhaps a few INSERT
commands), particularly with the MySQL PDO driver for PHP, the return is always 0 (without any error info) even if the script contains errors - syntax or logic.
This prevents you from running a long build script and then checking to see if the script was executed successfully or not. If an error occurs, the process terminates at the point where the script fails, but still exists with 0 and no error information.
I have searched this site and the net for an answer to this question, and it seems that the general response is "there's nothing you can do about it". My current solution is to run a "verify build" query that checks for some data and assesses the response to that - this seems terribly inefficient.
Has anyone come across this problem? If so, how have you ensured the build script was executed successfully?
Upvotes: 2
Views: 193
Reputation: 136
Thanks for everyone's answers - I did not find a solution to this, instead ended up using Doctrine, which tied in nicely with database migration.
Upvotes: 1
Reputation: 41837
You can get the info for each separate command using a construct like:
do
{
// do something with your current rowset
}
while($pdo->nextRowSet());
Upvotes: 0
Reputation: 76583
Just create a stored function which will run your script, your function should return a value in case of a success and use a selection instead of execute. This way you'll know whether your script was successful. You can delete your installation function if the command terminated with success.
Upvotes: 0
Reputation: 627
As a workaround, could you split the string that contains the script by ; and execute each statement individually?
You can then isolate any issues down to a particular statement.
At php.net, PDO::exec doesn't mention returning false on failure, but PDO::query does.
Upvotes: 0