详情
我正在为新的或续订的许可证到期进行一次插入。到期时间为自插入日期起2年。 如果检测到重复,则会更新该条目,使到期时间等于剩余的到期时间加上2年。
关于重复项,在下面的示例中,应该只有一行包含user_id = 55和license = commercial。
表: licence_expiry
--------------------------------------------------------
| user_id | licence | expiry |
--------------------------------------------------------
| 55 | commercial | 2013-07-04 05:13:48 |
---------------------------------------------------------
user_id(int11),license(varchan50),expiry(DATETIME)
我认为在mysql中你会写这样的东西(请注意我没有检查代码是否在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的到期值写什么。
$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();
}
非常感谢任何帮助。
答案 0 :(得分:9)
您可以使用MySQL的VALUES()
功能:
在
INSERT ... ON DUPLICATE KEY UPDATE
语句中,您可以使用UPDATE
子句中的VALUES(col_name)
函数来引用语句的INSERT
部分中的列值。换句话说,UPDATE
子句中的VALUES(col_name)
指的是将插入的col_name
的值,没有重复 - 发生了重大冲突。
因此,在您的情况下:
ON DUPLICATE KEY UPDATE expiry = VALUES(expiry)
或者,您可以创建再次绑定$expiry
的第四个参数:
$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.
答案 1 :(得分:-1)
我知道你有下面的答案,但我有同样的问题,我的解决方案看起来很不一样但它适用于我所以如果你想使用不同的声明在mysql中使用插入显式绑定值到列你可以尝试这个代码
$sql = "
INSERT INTO
$table
SET
user_id = :user_id,
licence = :licence,
expiry = :expiry
ON DUPLICATE KEY UPDATE
expiry = :expiry
";
$dbh = new PDO('login info here');
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $dbh->prepare($sql);
$stmt->bindValue('user_id', $userID , PDO::PARAM_INT);
$stmt->bindValue('licence', $licence, PDO::PARAM_STR);
$stmt->bindValue('expiry' , $expiry , PDO::PARAM_STR);