Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
PHP-MySQLi-Database-Class
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kulya
PHP-MySQLi-Database-Class
Commits
20db85d5
Commit
20db85d5
authored
Aug 04, 2015
by
Alexander Butenko
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #281 from rongzhj1990/master
Add insert on duplicate update method
parents
f8d5b31e
d61612df
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
117 additions
and
1 deletion
+117
-1
MysqliDb.php
MysqliDb.php
+79
-0
readme.md
readme.md
+14
-0
mysqliDbTests.php
tests/mysqliDbTests.php
+24
-1
No files found.
MysqliDb.php
View file @
20db85d5
...
...
@@ -112,6 +112,18 @@ class MysqliDb
*/
protected
$isSubQuery
=
false
;
/**
* Name of the auto increment column
*
*/
protected
$_lastInsertId
=
null
;
/**
* Column names for update when using onDuplicate method
*
*/
protected
$_updateColumns
=
null
;
/**
* Return type: 'Array' to return results as array, 'Object' as object
* 'Json' as json string
...
...
@@ -235,6 +247,8 @@ class MysqliDb
$this
->
returnType
=
'Array'
;
$this
->
_nestJoin
=
false
;
$this
->
_tableName
=
''
;
$this
->
_lastInsertId
=
null
;
$this
->
_updateColumns
=
null
;
}
/**
...
...
@@ -549,6 +563,19 @@ 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
)
{
$this
->
_lastInsertId
=
$_lastInsertId
;
$this
->
_updateColumns
=
$_updateColumns
;
}
/**
* This method allows you to specify multiple (method chaining optional) OR WHERE statements for SQL queries.
*
...
...
@@ -778,6 +805,57 @@ 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
))
{
$this
->
_query
.=
" on duplicate key update "
;
if
(
$this
->
_lastInsertId
)
{
$this
->
_lastQuery
.=
$this
->
_lastInsertId
.
"=LAST_INSERT_ID("
.
$this
->
_lastInsertId
.
"),"
;
$this
->
_lastInsertId
=
null
;
}
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
,
', '
);
}
}
/**
* Abstraction method that will compile the WHERE statement,
* any passed update data, and the desired rows.
...
...
@@ -797,6 +875,7 @@ class MysqliDb
$this
->
_buildGroupBy
();
$this
->
_buildOrderBy
();
$this
->
_buildLimit
(
$numRows
);
$this
->
_buildDuplicate
(
$tableData
);
$this
->
_lastQuery
=
$this
->
replacePlaceHolders
(
$this
->
_query
,
$this
->
_bindParams
);
...
...
readme.md
View file @
20db85d5
...
...
@@ -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();
...
...
tests/mysqliDbTests.php
View file @
20db85d5
...
...
@@ -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"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment