Запустите INSERT ON DUPLICATE KEY UPDATE, используя php и mysql - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь использовать запрос INSERT ON DUPLICATE KEY UPDATE в PHP и MySQL.

У меня есть профиль пользователя, в котором пользователь может обновить изображение в своем профиле (где оно затем сохраняется в БД). Моя проблема заключается в том, что если внутри таблицы profileImage там уже есть запись (и пользователь может быть идентифицирован с помощью studentID, то только UPDATE на изображении нужно просто изменить файл filePath (который содержит имя изображения) и не вставляйте еще одну строку в таблицу базы данных.

Однако у меня возникают проблемы с запросом, по-прежнему позволяющим пользователям загружать более 1 изображения.

php script:

$stmt = $conn->prepare ("INSERT INTO `profileImage` (`imageID`, `imagePath`, `studentID`) VALUES (NULL, ?, ?) ON DUPLICATE KEY UPDATE `imageID` = VALUES (`imageID`), `imagePath` = VALUES (`imagePath`), `studentID` = VALUES (`studentID`) ");
$stmt->bind_param("si", $fileName, $studentID); 
$stmt->execute() or die("Failed to insert image into the database");

Таблица профиля изображения в базе данных:

imageID - первичный ключ, а studentID - внешний ключ, могу ли я в любом случае установить studentID в своем выражении в качестве триггера, поэтому, если studentID уже существует в этой таблице, THEN запустите обновление, а не вставку? Table Screenshot

1 Ответ

1 голос
/ 03 апреля 2020

1)

Похоже, вам нужно убедиться, что значение столбца studentID УНИКАЛЬНО. Для этого лучше всего две вещи; установить его как уникальное и разрешить значения NULL (это может не потребоваться, но это зависит от того, как вы используете ваши данные).

Итак, из этого SO Вопроса вы можете сделать:

ALTER TABLE `profileImage` ADD UNIQUE (`studentID`)

в вашем SQL.

2a)

После того, как это будет сделано, вам нужно настроить оригинальную SQL проверку Dupe, , как это было начато в комментариях P.Salmon, вы никогда не должны необходимо установить или обновить столбец первичного ключа.

 INSERT INTO `profileImage` (`imagePath`, `studentID`) VALUES ( ?, ?) 
 ON DUPLICATE KEY UPDATE `imagePath` = VALUES (`imagePath`), `studentID` = VALUES (`studentID`)

2b)

Кроме того, вам также не нужно устанавливать столбец studentID, если он уже существует, и (предположительно) причина дублирования; итак:

 INSERT INTO `profileImage` ( `imagePath`, `studentID`) 
 VALUES ( ?, ?) ON DUPLICATE KEY UPDATE `imagePath` = VALUES (`imagePath`)
...