Commit 75030a1e authored by rongzhj's avatar rongzhj

fixed _buildDuplicate() method unable to handle array arguments

parent 19abf864
......@@ -112,17 +112,17 @@ class MysqliDb
*/
protected $isSubQuery = false;
/**
* Name of the auto increment column
*
*/
protected $lastInsertId = null;
/**
* Name of the auto increment column
*
*/
protected $_lastInsertId = null;
/**
* Column names for update when using onDuplicate method
*
*/
protected $updateColumns = null;
/**
* Column names for update when using onDuplicate method
*
*/
protected $_updateColumns = null;
/**
* Return type: 'Array' to return results as array, 'Object' as object
......@@ -247,6 +247,8 @@ class MysqliDb
$this->returnType = 'Array';
$this->_nestJoin = false;
$this->_tableName = '';
$this->_lastInsertId = null;
$this->_updateColumns = null;
}
/**
......@@ -562,17 +564,17 @@ class MysqliDb
return $this;
}
/**
/**
* This function store update column's name and column name of the
* autoincrement column
*
* @param Array Variable with values
* @param String Variable value
*/
public function onDuplicate($updateColumns, $lastInsertId = null)
public function onDuplicate($_updateColumns, $_lastInsertId = null)
{
$this->lastInsertId = $lastInsertId;
$this->updateColumns = $updateColumns;
$this->_lastInsertId = $_lastInsertId;
$this->_updateColumns = $_updateColumns;
}
/**
......@@ -804,28 +806,54 @@ class MysqliDb
return true;
}
/**
/**
* Helper function to add variables into the query statement
*
* @param Array Variable with values
*/
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 ";
if ($this->lastInsertId) {
$this->_lastQuery .= $this->lastInsertId."=LAST_INSERT_ID(".$this->lastInsertId."),";
$this->lastInsertId = null;
if ($this->_lastInsertId) {
$this->_lastQuery .= $this->_lastInsertId."=LAST_INSERT_ID(".$this->_lastInsertId."),";
$this->_lastInsertId = null;
}
foreach ($this->updateColumns as $value) {
$this->_bindParam($tableData[$value]);
$this->_query .= "`" . $value . "` = ?, ";
foreach ($this->_updateColumns as $column) {
$this->_query .= "`" . $column . "` = ";
// 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->lastInsertId = null;
$this->updateColumns = null;
}
}
......
......@@ -123,6 +123,20 @@ else
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
<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 (
'lastName' => 'char(10)',
'password' => 'text not null',
'createdAt' => 'datetime',
'updatedAt' => 'datetime',
'expires' => 'datetime',
'loginCount' => 'int(10) default 0'
'loginCount' => 'int(10) default 0',
'unique key' => 'login (login)'
),
'products' => Array (
'customerId' => 'int(10) not null',
......@@ -46,6 +48,7 @@ $data = Array (
'lastName' => 'Doe',
'password' => $db->func('SHA1(?)',Array ("secretpassword+salt")),
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc()
),
......@@ -55,6 +58,7 @@ $data = Array (
'lastName' => NULL,
'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")),
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc(2)
),
......@@ -65,6 +69,7 @@ $data = Array (
'lastName' => 'D',
'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")),
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc(3)
)
......@@ -136,6 +141,7 @@ $badUser = Array ('login' => null,
'lastName' => 'Doe',
'password' => 'test',
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc()
);
......@@ -170,6 +176,23 @@ if ($db->count != 3) {
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
$db->orderBy("login","asc", Array ("user3","user2","user1"));
$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