From 89017d4e6ca05b9ad7a6c3c31e859a11e26ef0a4 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 12 Aug 2017 13:54:29 +0000 Subject: [PATCH] DBA: The condition can now be a complex string --- include/dba.php | 76 +++++++++++++++++++++++++++++---------------- include/items.php | 8 +---- include/uimport.php | 4 +-- mod/item.php | 7 +---- 4 files changed, 53 insertions(+), 42 deletions(-) diff --git a/include/dba.php b/include/dba.php index 7926fa10d8..36b37498a7 100644 --- a/include/dba.php +++ b/include/dba.php @@ -412,21 +412,6 @@ class dba { return $connected; } - function insert_id() { - switch ($this->driver) { - case 'pdo': - $id = $this->db->lastInsertId(); - break; - case 'mysqli': - $id = $this->db->insert_id; - break; - case 'mysql': - $id = mysql_insert_id($this->db); - break; - } - return $id; - } - function __destruct() { if ($this->db) { switch ($this->driver) { @@ -777,9 +762,15 @@ class dba { return false; } - $fields = array_keys($condition); + $fields = array(); + + $array_element = each($condition); + $array_key = $array_element['key']; + if (!is_int($array_key)) { + $fields = array($array_key); + } - $stmt = self::select($table, array($fields[0]), $condition, array('limit' => 1, 'only_query' => true)); + $stmt = self::select($table, $fields, $condition, array('limit' => 1, 'only_query' => true)); if (is_bool($stmt)) { $retval = $stmt; @@ -914,6 +905,26 @@ class dba { return self::e($sql, $param); } + /** + * @brief Fetch the id of the last insert command + * + * @return integer Last inserted id + */ + function lastInsertId() { + switch (self::$dbo->driver) { + case 'pdo': + $id = self::$dbo->db->lastInsertId(); + break; + case 'mysqli': + $id = self::$dbo->db->insert_id; + break; + case 'mysql': + $id = mysql_insert_id(self::$dbo); + break; + } + return $id; + } + /** * @brief Locks a table for exclusive write access * @@ -1181,15 +1192,23 @@ class dba { $table = self::$dbo->escape($table); - if (is_bool($old_fields)) { - $sql = "SELECT * FROM `".$table."` WHERE `". - implode("` = ? AND `", array_keys($condition))."` = ? LIMIT 1"; - - $params = array_values($condition); + if (count($condition) > 0) { + $array_element = each($condition); + $array_key = $array_element['key']; + if (is_int($array_key)) { + $condition_string = " WHERE ".array_shift($condition); + } else { + $condition_string = " WHERE `".implode("` = ? AND `", array_keys($condition))."` = ?"; + } + } else { + $condition_string = ""; + } + if (is_bool($old_fields)) { $do_insert = $old_fields; - $old_fields = self::fetch_first($sql, $params); + $old_fields = self::select($table, array(), $condition, array('limit' => 1)); + if (is_bool($old_fields)) { if ($do_insert) { $values = array_merge($condition, $fields); @@ -1216,8 +1235,7 @@ class dba { } $sql = "UPDATE `".$table."` SET `". - implode("` = ?, `", array_keys($fields))."` = ? WHERE `". - implode("` = ? AND `", array_keys($condition))."` = ?"; + implode("` = ?, `", array_keys($fields))."` = ?".$condition_string; $params1 = array_values($fields); $params2 = array_values($condition); @@ -1256,7 +1274,13 @@ class dba { } if (count($condition) > 0) { - $condition_string = " WHERE `".implode("` = ? AND `", array_keys($condition))."` = ?"; + $array_element = each($condition); + $array_key = $array_element['key']; + if (is_int($array_key)) { + $condition_string = " WHERE ".array_shift($condition); + } else { + $condition_string = " WHERE `".implode("` = ? AND `", array_keys($condition))."` = ?"; + } } else { $condition_string = ""; } diff --git a/include/items.php b/include/items.php index e253f8de66..8ba41e9e24 100644 --- a/include/items.php +++ b/include/items.php @@ -963,13 +963,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f // When the item was successfully stored we fetch the ID of the item. if (dbm::is_result($r)) { - $r = q("SELECT LAST_INSERT_ID() AS `item-id`"); - if (dbm::is_result($r)) { - $current_post = $r[0]['item-id']; - } else { - // This shouldn't happen - $current_post = 0; - } + $current_post = dba::lastInsertId(); } else { // This can happen - for example - if there are locking timeouts. dba::rollback(); diff --git a/include/uimport.php b/include/uimport.php index b27f9dc126..3bdde22351 100644 --- a/include/uimport.php +++ b/include/uimport.php @@ -6,13 +6,11 @@ require_once("include/Photo.php"); define("IMPORT_DEBUG", False); function last_insert_id() { - global $db; - if (IMPORT_DEBUG) { return 1; } - return $db->insert_id(); + return dba::lastInsertId(); } function last_error() { diff --git a/mod/item.php b/mod/item.php index 7e6d092711..cbe338c4f8 100644 --- a/mod/item.php +++ b/mod/item.php @@ -887,12 +887,7 @@ function item_post(App $a) { ); if (dbm::is_result($r)) { - $r = q("SELECT LAST_INSERT_ID() AS `item-id`"); - if (dbm::is_result($r)) { - $post_id = $r[0]['item-id']; - } else { - $post_id = 0; - } + $post_id = dba::lastInsertId(); } else { logger('mod_item: unable to create post.'); $post_id = 0; -- 2.39.5