|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2004-05-03 22:41 UTC] csaba at alum dot mit dot edu
Description:
------------
The sqlite_query page in a prominent box declares that SQLite will execute multiple queries separated by semicolons, but this seems not to be the case according to the test below. While I posted a workaround for this, it is not very efficient because you have to send each query separately.
I have tested the command line version of SQLite (2.8.13) and it does accept multiple queries separated by semicolons.
Also, if dealing with this problem, I'd like to suggest that if the final query is a SELECT or other statement which produces some result normally destined for the user, that it be returned to the caller that way. The documentation makes it seems like maybe it will and maybe it won't, saying it's undefined. In particular, it would be helpful if SELECT and PRAGMA returned their results. If you indulge me on that, please extend the functionality to sqlite_array_query.
Thanks,
Csaba Gabor
Reproduce code:
---------------
$db = sqlite_open(':memory:', 0666, $sqliteerror);
$tbl = "delme";
$multiQuery = "CREATE TABLE $tbl (foo INTEGER PRIMARY KEY, bar TEXT);" .
"INSERT INTO $tbl VALUES (null, 'Hi Mom');";
$dbRes = sqlite_query ($db, $multiQuery);
$creationTest = "PRAGMA table_info('$tbl');";
$insertTest = "SELECT * FROM $tbl;";
$acT = sqlite_array_query ($db, $creationTest, SQLITE_ASSOC);
var_dump ($acT);
print "<br><br>Table was created,<br>";
$aiT = sqlite_array_query ($db, $insertTest, SQLITE_ASSOC);
var_dump ($aiT);
print "<br>but nothing was inserted";
Expected result:
----------------
I expect to that the SQL INSERT statement was carried out
Actual result:
--------------
However, SQL statements after the first ';' seem to be ignored. Thus, the second var_dump only gets an empty array.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 17:00:01 2025 UTC |
This is still behaving in the same way as originally described (just tested on PHP 5.0.4-dev 11-Mar-2005). Here is slightly nicer code to show the problem: <?php $db = sqlite_open(':memory:', 0666, $sqliteerror); $tbl = "delme"; $multiQuery = "CREATE TABLE $tbl " . "(foo INTEGER PRIMARY KEY, bar TEXT);" . "INSERT INTO $tbl VALUES (null, 'Hi Mom');"; $dbRes = sqlite_query ($db, $multiQuery); $creationTest = "PRAGMA table_info('$tbl');"; $insertTest = "SELECT * FROM $tbl;"; $acT = sqlite_array_query ($db, $creationTest, SQLITE_ASSOC); print "<br><br>Table was created:<br>"; var_dump ($acT); $aiT = sqlite_array_query ($db, $insertTest, SQLITE_ASSOC); print "<br><br>"; if ($aiT) {print "with rows:<br>"; var_dump ($aiT); } else print "but nothing was inserted"; ?> CsabaThat same comment goes on to say: When executing multiple queries, the return value of this function will be FALSE if there was an error, but undefined otherwise (it might be TRUE for success or it might return a result handle). Is this supposed to be like a Heisenberg uncertainty principle? - The very action of testing for sqlite_query's return value causes the multiple queries not to be executed. Specifically, assigning the return value to a variable (but otherwise not using it) or even an if (sqlite_query(...)); will cause the multiple queries not to be executed. I have simplified my example to show this. If you have already said earlier that the return value may not be used upon pain of first SQL statement only being executed, I don't think it makes sense to talk about the return value being FALSE or otherwise in a multiple execution context. <?php $db = sqlite_open(':memory:', 0666, $sqliteerror); $tbl = "delme"; $multiSQL = "CREATE TABLE $tbl (foo INTEGER PRIMARY KEY, bar TEXT);" . "INSERT INTO $tbl VALUES (null, 'Hi Mom');" . "INSERT INTO $tbl VALUES (null, 'Hi Dad');"; //$dbRes = sqlite_query ($db, $multiSQL); // only creates table if (sqlite_query ($db, $multiSQL)); // only creates table //sqlite_query ($db, $multiSQL); // inserts both rows $insertTest = "SELECT * FROM $tbl;"; $aIT = sqlite_array_query ($db, $insertTest, SQLITE_ASSOC); print "Number of rows now in table: " . sizeof($aIT); ?> Csaba PS. This really is incongruous. How many other PHP functions are there where the act of assigning the function's return value causes a difference in how the function has behaved?