From 89a014685d02c2fed38e8171f1962a5c338899b5 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 23 Feb 2012 11:26:08 -0500 Subject: [PATCH] Fixed prepared statements in Firebird driver --- .gitignore | 4 ++- src/common/db_pdo.php | 4 +-- src/databases/firebird.php | 44 ++++++++++++++++++++++++++++--- src/databases/firebird_manip.php | 8 +++--- tests/databases/firebird.php | 39 ++++++++++++++++++++------- tests/test_dbs/FB_TEST_DB.FDB | Bin 802816 -> 802816 bytes tests/test_dbs/test_sqlite.db | Bin 4096 -> 4096 bytes 7 files changed, 79 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index d910a93..fb35caa 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ settings.json errors.txt */simpletest/* -tests/test_dbs/* \ No newline at end of file +tests/test_dbs/* +*.db +*.FDB \ No newline at end of file diff --git a/src/common/db_pdo.php b/src/common/db_pdo.php index f994c36..3417b33 100644 --- a/src/common/db_pdo.php +++ b/src/common/db_pdo.php @@ -42,7 +42,7 @@ abstract class DB_PDO extends PDO { // Prepare the sql $query = $this->prepare($sql); - if( ! is_like_array($query)) + if( ! (is_object($query) || is_resource($query))) { $this->get_last_error(); return FALSE; @@ -52,7 +52,7 @@ abstract class DB_PDO extends PDO { $this->statement =& $query; - if( ! is_like_array($data)) + if( ! (is_array($data) || is_object($data))) { trigger_error("Invalid data argument"); return FALSE; diff --git a/src/databases/firebird.php b/src/databases/firebird.php index adba703..0a46cae 100644 --- a/src/databases/firebird.php +++ b/src/databases/firebird.php @@ -118,9 +118,10 @@ class firebird extends DB_PDO { /** * Emulate PDO prepare * + * @param string $query * @return resource */ - public function prepare() + public function prepare($query) { $this->statement = ibase_prepare($this->conn, $query); return $this->statement; @@ -248,8 +249,43 @@ SQL; */ public function execute($args) { - // Is there a better way to do this? - return eval('ibase_execute('.$this->statement.','.explode(',', $args).")"); - } + //Add the prepared statement as the first parameter + array_unshift($args, $this->statement); + + // Let php do all the hard stuff in converting + // the array of arguments into a list of arguments + return call_user_func_array('ibase_execute', $args); + } + + /** + * Prepare and execute a query + * + * @param string $sql + * @param array $args + * @return resource + */ + public function prepare_execute($sql, $args) + { + $query = $this->prepare($sql); + + // Set the statement in the class variable for easy later access + $this->statement =& $query; + + return $this->execute($args); + } + + /** + * Bind a prepared query with arguments for executing + * + * @param string $sql + * @param mixed $args + * @return FALSE + */ + public function prepare_query($sql, $args) + { + // You can't bind query statements before execution with + // the firebird database + return FALSE; + } } // End of firebird.php \ No newline at end of file diff --git a/src/databases/firebird_manip.php b/src/databases/firebird_manip.php index e5a844f..5247305 100644 --- a/src/databases/firebird_manip.php +++ b/src/databases/firebird_manip.php @@ -62,7 +62,7 @@ class firebird_manip extends db_manip { $columns = array(); foreach($column_array as $n => $props) { - $str = "{$n} "; + $str = '"'.$n.'" '; $str .= (isset($props['type'])) ? "{$props['type']} " : ""; $str .= (isset($props['constraint'])) ? "{$props['constraint']} " : ""; @@ -70,9 +70,9 @@ class firebird_manip extends db_manip { } // Generate the sql for the creation of the table - $sql = "CREATE TABLE \"{$name}\" ("; - $sql .= implode(",", $columns); - $sql .= ")"; + $sql = 'CREATE TABLE "'.$name.'" ('; + $sql .= implode(',', $columns); + $sql .= ')'; return $sql; } diff --git a/tests/databases/firebird.php b/tests/databases/firebird.php index eb05935..3ba8de8 100644 --- a/tests/databases/firebird.php +++ b/tests/databases/firebird.php @@ -72,7 +72,7 @@ class FirebirdTest extends UnitTestCase { function TestCreateTable() { //Attempt to create the table - $sql = $this->db->manip->create_table('create_test', array('id' => 'SMALLINT')); + $sql = $this->db->manip->create_table('create_test', array('id' => 'SMALLINT', 'key' => 'VARCHAR(64)', 'val' => 'BLOB SUB_TYPE TEXT')); $this->db->query($sql); //This test fails for an unknown reason, when clearly the table exists @@ -87,6 +87,34 @@ class FirebirdTest extends UnitTestCase { $this->assertTrue($table_exists);*/ } + + function TestPreparedStatements() + { + $sql = <<db->prepare($sql); + $this->db->execute(array(1,"boogers", "Gross")); + + } + + function TestPrepareExecute() + { + $sql = <<db->prepare_execute($sql, array( + 2, "works", 'also?' + )); + + } + + function TestPrepareQuery() + { + $this->assertFalse($this->db->prepare_query('', array())); + } function TestDeleteTable() { @@ -103,12 +131,5 @@ class FirebirdTest extends UnitTestCase { $this->assertFalse($table_exists); } - function TestPreparedStatements() - { - $sql = 'INSERT INTO "create_test" ("id") VALUES (?),(?),(?)'; - $this->db->prepare($sql); - - $this->db->execute(array(1,2,3)); - - } + } \ No newline at end of file diff --git a/tests/test_dbs/FB_TEST_DB.FDB b/tests/test_dbs/FB_TEST_DB.FDB index bf379a66dc75a0fc4f5a29910c1e0838dcbe513f..8687efd4c3a7cc0b0b39d10b86bbff9cc668a6e2 100755 GIT binary patch delta 10101 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 Om!kh4{!R@4M*kl?|EBl= delta 3663 zcmdUyZERCj7{|}Kuf4Zy?cO&ww~GNWF6s*FUX9vVp^=xN7 z&%aN9_kYek_dH!P=}RVkVT?Lk+#Jd`uRF=x5qZ4@{f-%P_|T6C4Yp4%uftY?7jf_t zHv=Nwnpl#W@a*>rC0DEj^dY>ypN`gW@r4PWchYm9+bbW_gcdw7Ax2(x;qe2b8|(4- z#G#EZWN|bdtsF3MF;$Z?Q9$u!j}@h~G8B?yQB2jO zkVVgXY03UkjN)g#kQ|d@sU~HXrT99tH;PgiFJ_KK$$R;=fYOn@UX-#jKO-N>u_&f$ zdbw6WY0v&#l(K@MkQ|F*swU;90!mxQkw<)G-QqB}m5c;MlrJbQ* z$RX=e*=njL7O)OvB` zLHrCnwnlA2oM|$LdTmPlTpXU(rnOA;0ngiGqJTRg<^FR5f=6tJgwSIs!f{BMWB8=_uAGjS z8WFR>av*1aX4aPW_MFkfOR3e1QWH6ZxhUqAN+-&ShNO6yGdsHgXbRi;n-Nf0` zaFayzvC%Xp?UgW0cu+By2+r&pz2T@-#tly!j~zULL%64dHQp+niF*`ThEf z^NKcVe~`S7U<*JaB?5L5c*USW;}H%95GsV7-E6`Z5O)1pa6e}>3Dy&~L{=kZ;X0CF z!vxm!WVNes<}WxnE&S}}dp}qJa%8^;y@Zqx0OT(SmUy|c(0%E=vdq`I@`gsB&k~=c z{o5pri}OlHBi^iwUUlg4h^q^Ep-;(O@Z@!&2z1iAQm5#W=5trLBQy26rjcSA5UZ&Q$S#|b4wN4)?QyZLWgKiYfz3I%IY$Dup zwJu2N3G1H5)IE)QwDP62# z8dJkGriN)u4bzw|H&gnUTg_AoK@dUcz?-9@^j zsUgf~qMvy7M}!IuZUAjO3^=6eH7)9{O#gMakzA$juF#>_SL1P`EW!Wc+28H8hO?d% z3H76