Commit 75030a1e authored by rongzhj's avatar rongzhj

fixed _buildDuplicate() method unable to handle array arguments

parent 19abf864
...@@ -112,17 +112,17 @@ class MysqliDb ...@@ -112,17 +112,17 @@ class MysqliDb
*/ */
protected $isSubQuery = false; protected $isSubQuery = false;
/** /**
* Name of the auto increment column * Name of the auto increment column
* *
*/ */
protected $lastInsertId = null; protected $_lastInsertId = null;
/** /**
* Column names for update when using onDuplicate method * Column names for update when using onDuplicate method
* *
*/ */
protected $updateColumns = null; protected $_updateColumns = null;
/** /**
* Return type: 'Array' to return results as array, 'Object' as object * Return type: 'Array' to return results as array, 'Object' as object
...@@ -247,6 +247,8 @@ class MysqliDb ...@@ -247,6 +247,8 @@ class MysqliDb
$this->returnType = 'Array'; $this->returnType = 'Array';
$this->_nestJoin = false; $this->_nestJoin = false;
$this->_tableName = ''; $this->_tableName = '';
$this->_lastInsertId = null;
$this->_updateColumns = null;
} }
/** /**
...@@ -562,17 +564,17 @@ class MysqliDb ...@@ -562,17 +564,17 @@ class MysqliDb
return $this; return $this;
} }
/** /**
* This function store update column's name and column name of the * This function store update column's name and column name of the
* autoincrement column * autoincrement column
* *
* @param Array Variable with values * @param Array Variable with values
* @param String Variable value * @param String Variable value
*/ */
public function onDuplicate($updateColumns, $lastInsertId = null) public function onDuplicate($_updateColumns, $_lastInsertId = null)
{ {
$this->lastInsertId = $lastInsertId; $this->_lastInsertId = $_lastInsertId;
$this->updateColumns = $updateColumns; $this->_updateColumns = $_updateColumns;
} }
/** /**
...@@ -804,28 +806,54 @@ class MysqliDb ...@@ -804,28 +806,54 @@ class MysqliDb
return true; return true;
} }
/** /**
* Helper function to add variables into the query statement * Helper function to add variables into the query statement
* *
* @param Array Variable with values * @param Array Variable with values
*/ */
protected function _buildDuplicate($tableData) protected function _buildDuplicate($tableData)
{ {
if (is_array($this->updateColumns) && !empty($this->updateColumns)) { if (is_array($this->_updateColumns) && !empty($this->_updateColumns)) {
$this->_query .= " on duplicate key update "; $this->_query .= " on duplicate key update ";
if ($this->lastInsertId) { if ($this->_lastInsertId) {
$this->_lastQuery .= $this->lastInsertId."=LAST_INSERT_ID(".$this->lastInsertId."),"; $this->_lastQuery .= $this->_lastInsertId."=LAST_INSERT_ID(".$this->_lastInsertId."),";
$this->lastInsertId = null; $this->_lastInsertId = null;
} }
foreach ($this->updateColumns as $value) { foreach ($this->_updateColumns as $column) {
$this->_bindParam($tableData[$value]); $this->_query .= "`" . $column . "` = ";
$this->_query .= "`" . $value . "` = ?, ";
// Simple value
if (!is_array ($tableData[$column])) {
$this->_bindParam($tableData[$column]);
$this->_query .= '?, ';
continue;
}
// Function value
$arr = $tableData[$column];
$key = key($arr);
$val = $arr[$key];
switch ($key) {
case '[I]':
$this->_query .= $column . $val . ", ";
break;
case '[F]':
$this->_query .= $val[0] . ", ";
if (!empty ($val[1]))
$this->_bindParams ($val[1]);
break;
case '[N]':
if ($val == null)
$this->_query .= "!" . $column . ", ";
else
$this->_query .= "!" . $val . ", ";
break;
default:
die ("Wrong operation");
}
} }
$this->_query = rtrim($this->_query, ', '); $this->_query = rtrim($this->_query, ', ');
$this->lastInsertId = null;
$this->updateColumns = null;
} }
} }
......
...@@ -123,6 +123,20 @@ else ...@@ -123,6 +123,20 @@ else
echo 'insert failed: ' . $db->getLastError(); echo 'insert failed: ' . $db->getLastError();
``` ```
Insert with on duplicate key update
```php
$data = Array ("login" => "admin",
"firstName" => "John",
"lastName" => 'Doe',
"createdAt" => $db->now(),
"updatedAt" => $db->now(),
);
$updateColumns = Array ("updateAt");
$lastInsertId = "id";
$db->onDuplicate($updateColumns, $lastInsertId);
$id = $db->insert ('users', $data);
```
### Replace Query ### Replace Query
<a href='https://dev.mysql.com/doc/refman/5.0/en/replace.html'>Replace()</a> method implements same API as insert(); <a href='https://dev.mysql.com/doc/refman/5.0/en/replace.html'>Replace()</a> method implements same API as insert();
......
...@@ -29,8 +29,10 @@ $tables = Array ( ...@@ -29,8 +29,10 @@ $tables = Array (
'lastName' => 'char(10)', 'lastName' => 'char(10)',
'password' => 'text not null', 'password' => 'text not null',
'createdAt' => 'datetime', 'createdAt' => 'datetime',
'updatedAt' => 'datetime',
'expires' => 'datetime', 'expires' => 'datetime',
'loginCount' => 'int(10) default 0' 'loginCount' => 'int(10) default 0',
'unique key' => 'login (login)'
), ),
'products' => Array ( 'products' => Array (
'customerId' => 'int(10) not null', 'customerId' => 'int(10) not null',
...@@ -46,6 +48,7 @@ $data = Array ( ...@@ -46,6 +48,7 @@ $data = Array (
'lastName' => 'Doe', 'lastName' => 'Doe',
'password' => $db->func('SHA1(?)',Array ("secretpassword+salt")), 'password' => $db->func('SHA1(?)',Array ("secretpassword+salt")),
'createdAt' => $db->now(), 'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'), 'expires' => $db->now('+1Y'),
'loginCount' => $db->inc() 'loginCount' => $db->inc()
), ),
...@@ -55,6 +58,7 @@ $data = Array ( ...@@ -55,6 +58,7 @@ $data = Array (
'lastName' => NULL, 'lastName' => NULL,
'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")), 'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")),
'createdAt' => $db->now(), 'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'), 'expires' => $db->now('+1Y'),
'loginCount' => $db->inc(2) 'loginCount' => $db->inc(2)
), ),
...@@ -65,6 +69,7 @@ $data = Array ( ...@@ -65,6 +69,7 @@ $data = Array (
'lastName' => 'D', 'lastName' => 'D',
'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")), 'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")),
'createdAt' => $db->now(), 'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'), 'expires' => $db->now('+1Y'),
'loginCount' => $db->inc(3) 'loginCount' => $db->inc(3)
) )
...@@ -136,6 +141,7 @@ $badUser = Array ('login' => null, ...@@ -136,6 +141,7 @@ $badUser = Array ('login' => null,
'lastName' => 'Doe', 'lastName' => 'Doe',
'password' => 'test', 'password' => 'test',
'createdAt' => $db->now(), 'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'), 'expires' => $db->now('+1Y'),
'loginCount' => $db->inc() 'loginCount' => $db->inc()
); );
...@@ -170,6 +176,23 @@ if ($db->count != 3) { ...@@ -170,6 +176,23 @@ if ($db->count != 3) {
exit; exit;
} }
// insert with on duplicate key update
$user = Array ('login' => 'user3',
'active' => true,
'customerId' => 11,
'firstName' => 'Pete',
'lastName' => 'D',
'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")),
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc(3)
);
$updateColumns = Array ("updatedAt");
$insertLastId = "id";
$db->onDuplicate($updateColumns, "id");
$db->insert("users", $user);
// order by field // order by field
$db->orderBy("login","asc", Array ("user3","user2","user1")); $db->orderBy("login","asc", Array ("user3","user2","user1"));
$login = $db->getValue ("users", "login"); $login = $db->getValue ("users", "login");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment