У меня возникают некоторые проблемы с запросом ниже. Я хочу, чтобы он запускал запрос UPDATE, если theres уже является строкой для пользователя в базе данных. Я ожидаю, что он будет вставлять строку со значениями или обновлять строку со значениями, как это говорит в запросе.
Я получаю следующую ошибку:
синтаксическая ошибка или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'SET balance = '40', xplevel = '36 'WHERE username =' nibblenews 'AND server =' Factions '' в строке 1 '
- Не удается подключиться к MySQL на Mac - отсутствует файл mysql.sock
- Как я могу правильно использовать объект PDO для параметризованного запроса SELECT
- store_result () и get_result () в mysql возвращает false
- Выберите строки MYSQL, но введите строки и столбцы в строки
- Резервное копирование и восстановление базы данных MySQL в PHP
- Вычисление ранга в PHP / MySQL
$stmt = $db->prepare('INSERT INTO stats (balance, xplevel, username, server) VALUES (:balance, :xp, :username, :server) ON DUPLICATE KEY UPDATE stats SET balance=:balance2, xplevel=:xp2 WHERE username=:username2 AND server=:server2'); $stmt->bindParam(':balance', $balance, PDO::PARAM_STR); $stmt->bindParam(':balance2', $balance, PDO::PARAM_STR); $stmt->bindParam(':xp', $xp, PDO::PARAM_STR); $stmt->bindParam(':xp2', $xp, PDO::PARAM_STR); $stmt->bindParam(':username', $username, PDO::PARAM_STR); $stmt->bindParam(':username2', $username, PDO::PARAM_STR); $stmt->bindParam(':server', $server, PDO::PARAM_STR); $stmt->bindParam(':server2', $server, PDO::PARAM_STR); $stmt->execute();
Вы не можете использовать явный WHERE
в INSERT ... ON DUPLICATE KEY UPDATE
. Как говорится в документах MySQL :
Если вы укажете
ON DUPLICATE KEY UPDATE
, и будет вставлена строка, которая приведет к дублированию значения в индексеUNIQUE
илиPRIMARY KEY
, MySQL будет выполнять UPDATE старой строки.
Другими словами: столбцы, которые вы указали как UNIQUE
или PRIMARY KEY
, используются для проверки того, существует ли строка уже. Если это так, эта строка обновляется.
Кроме того, stats SET
в вашем запросе (после ON DUPLICATE KEY UPDATE
) недействительна. Вы должны изменить свой запрос на что-то вроде этого:
INSERT INTO stats (balance, xplevel, username, server) VALUES (:balance, :xp, :username, :server) ON DUPLICATE KEY UPDATE balance=:balance2, xplevel=:xp2;