如何在 PDO 中使用 ON DUPLICATE KEY UPDATE 和 mysql?
详情
我正在为新的或更新的许可证到期做一次插入.有效期为自插入之日起 2 年.如果检测到重复,则将更新条目,使到期时间等于剩余到期时间加上 2 年.
I am doing a single insert for the expiry of a new or renewed licence. The time period for the expiry is 2 years from the insertion date. If a duplicate is detected, the entry will be updated such that the expiry equals the remaining expiry plus 2 years.
关于重复,在下面的示例中,应该只有一行包含 user_id =55 和 licence=commercial.
Regarding duplicates, in the example below there should only be one row containing user_id =55 and licence=commercial.
表格: licence_expiry
TABLE: licence_expiry
--------------------------------------------------------
| user_id | licence | expiry |
--------------------------------------------------------
| 55 | commercial | 2013-07-04 05:13:48 |
---------------------------------------------------------
user_id (int11), license (varchan50), expiry (DATETIME)
user_id (int11), licence (varchan50), expiry (DATETIME)
我认为在mysql中你会这样写(请注意,我没有检查代码是否在mysql中工作.)
I think in mysql you would write it something like this (Please note that I haven't checked whether the code works in mysql. )
INSERT INTO `licence_expiry`
(`user_id`, `licence`, `expiry`)
VALUES
(55, commercial, NOW()+ INTERVAL 2 YEAR)
ON DUPLICATE KEY UPDATE
`expiry` = `expiry` + INTERVAL 2 YEAR
问题:如何使用 PDO 做到这一点?我已经写了我认为我将使用的粗略大纲,但我不确定要为 ON DUPLICATE KEY UPDATE 的到期值写什么.
QUESTION: How can I do this with PDO? I've written a rough outline of what I think I will use, but I'm not sure what to write for the expiry value for the ON DUPLICATE KEY UPDATE.
$sql = "INSERT INTO $table (user_id, licence, expiry)
VALUES (
:user_id,
:licence,
:expiry)
ON DUPLICATE KEY UPDATE expiry = Something";
try {
$dbh = new PDO('login info here');
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':user_id', $userID, PDO::PARAM_INT);
$stmt->bindParam(':licence',$licence, PDO::PARAM_STR);
$stmt->bindParam(':expiry',$expiry, PDO::PARAM_STR);
$stmt->execute();
//$stmt->closeCursor(); //use this instead of $dbh = null if you will continue with another DB function
$dbh = null;
}
catch(PDOException $e)
{
$error=$e->getMessage();
}
非常感谢任何帮助.
推荐答案
可以使用MySQL的<代码>VALUES()函数:
You can use MySQL's VALUES()
function:
在 INSERT ... ON DUPLICATE KEY UPDATE
中a> 语句,可以使用 VALUES(col_name) 函数/doc/en/update.html">UPDATE
子句引用 INSERT
部分的语句.换句话说,VALUES(col_name)update.html">UPDATE
子句指的是要插入的 col_name
的值,没有发生重复键冲突.
In an
INSERT ... ON DUPLICATE KEY UPDATE
statement, you can use theVALUES(col_name)
function in theUPDATE
clause to refer to column values from theINSERT
portion of the statement. In other words,VALUES(col_name)
in theUPDATE
clause refers to the value ofcol_name
that would be inserted, had no duplicate-key conflict occurred.
因此,在你的情况下:
ON DUPLICATE KEY UPDATE expiry = VALUES(expiry)
或者,您可以创建第四个参数,再次绑定 $expiry
:
Alternatively, you can create a fourth parameter to which you bind $expiry
again:
$sql = "INSERT INTO $table (user_id, licence, expiry)
VALUES (
:user_id,
:licence,
:expiry)
ON DUPLICATE KEY UPDATE expiry = :another";
try {
$dbh = new PDO('login info here');
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':user_id', $userID , PDO::PARAM_INT);
$stmt->bindParam(':licence', $licence, PDO::PARAM_STR);
$stmt->bindParam(':expiry' , $expiry , PDO::PARAM_STR);
$stmt->bindParam(':another', $expiry , PDO::PARAM_STR);
$stmt->execute();
// etc.
相关文章