ON DUPLICATE KEY UPDATE — когда if if true — обновлять столбец, иначе вызвать ошибку 1062 для обнаружения дублирования

Я новичок в этом сайте, и это мой первый пост.

У меня MySQL PDO подготовил запрос:

try {
$sql = "INSERT INTO `site_users_wishlist` (`user_id`, `uin`, `active`)
VALUES (?, ?, 'Y')";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($userId,$uin));
}
catch (PDOException $e) {
if ($e->errorInfo[1] == 1062) {
echo "__item_exists_in_wishlist__";
exit;
}
else {
echo "Error adding item to wishlist!<br/>".$e;
exit;
}
}
echo "__item_added_to_wishlist__";
exit;

активныйстолбец имеет значения Y / N / В (Yэс, Nо, Вдолжен).

Когда пользователь добавляет элемент в свой список пожеланий, он вставляет в базу данных с помощью ‘активныйзнак равноY»,
и когда пользователь удаляет элемент из списка желаний, он становится ‘активныйзнак равноN».

На данный момент проблема продолжается:

  • Если пользователь пытается добавить элемент более одного раза, я ловлю 1062 ошибка дубликата записи и показывает сообщение пользователю.

  • Если пользователь ранее удалил элемент и хочет повторно добавить его в свой список желаний, я хочу показать сообщение, что он успешно добавлен в список желаний, а не уже существует в базе данных.

Мне нужен чистый код, что-то вроде

$sql = "INSERT INTO `site_users_wishlist` (`user_id`, `uin`, `active`)
VALUES (?, ?, 'Y')
ON DUPLICATE KEY UPDATE IF(`active`<>'Y', `active`='Y', TRIGGER DUPLICATE ERROR 1062";

заранее спасибо

EDIT1:

Таблица создания кода:

CREATE TABLE `site_users_wishlist` (
`user_id` int(11) NOT NULL COMMENT 'user id',
`uin` int(5) NOT NULL COMMENT 'item id',
`date_added` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'date of addition by user',
`added_price` int(10) DEFAULT NULL COMMENT 'price when added',
`updated_price` int(10) DEFAULT NULL COMMENT 'current price',
`active` tinytext NOT NULL COMMENT 'N - not, Y - yes, B - bought by user',
PRIMARY KEY (`user_id`,`uin`),
KEY `user_id` (`user_id`),
CONSTRAINT `userId` FOREIGN KEY (`user_id`) REFERENCES `site_users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1

Решение

Итак, я не нашел элегантный один запрос Решение этой проблемы, но вот решение с 3 запроса, так как в моих конкретных потребностях нет проблем в установлении соединения 3 раза.

try {
$sql = "SELECT * FROM `site_users_wishlist` WHERE `user_id` = ? AND `uin` = ? AND `active` <> 'Y'";
$stmt = $pdo->prepare($sql);
$stmt->execute(array($userId, $uin));
$exists = $stmt->rowCount();

if ($exists == 1) {
try {
$sql2 = "UPDATE `site_users_wishlist` SET `active` = 'Y' WHERE `user_id` = ? AND `uin` = ?";
$stmt2 = $pdo->prepare($sql2);
$stmt2->execute(array($userId, $uin));
}
catch (PDOException $e) {
echo "Error adding item to wishlist!<br/>".$e;
exit;
}
}
else {
try {
$sql2 = "INSERT INTO `site_users_wishlist` (`user_id`, `uin`, `uinsql`, `added_price`, `last_updated_price`, `active`) VALUES (?, ?, ?, ?, ?, 'Y')";
$stmt2 = $pdo->prepare($sql2);
$stmt2->execute(array($userId, $uin, $uinsql, $price, $price));
}
catch (PDOException $e) {
if ($e->errorInfo[1] == 1062) { // 1062 error code for duplicate entry
echo "__item_exists_in_wishlist__";
exit;
}
else {
echo "Error adding item to wishlist!<br/>".$e;
exit;
}
}
}
}
catch (PDOException $e) {
echo "Error adding item to wishlist!<br/>".$e;
exit;
}

echo "__item_added_to_wishlist__";
exit;

Может быть, это будет когда-нибудь полезно для кого-то другого;)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]