Я написал хранимую процедуру (mysql)
CREATE PROCEDURE `set_SiteAttendance`(IN _UserName VARCHAR(20) CHARSET utf8, IN _EventDesc VARCHAR(250) CHARSET utf8, IN _EventTime BIGINT(20))
BEGIN
DECLARE _EventID INT;
DECLARE cursorGetID CURSOR FOR
SELECT id
FROM client_pages
WHERE name = _EventDesc
LIMIT 0, 1;
-- try to add a new record to the database
INSERT INTO client_pages (id, name) SELECT (IFNULL(MAX(id), 0) + 1), _EventDesc FROM client_pages;
-- get id from the database records
OPEN cursorGetID;
FETCH cursorGetID INTO _EventID;
-- set the data on the visit of the page in the database
INSERT INTO login_history VALUES (NULL, _UserName, _EventID, _EventTime);
END
Когда я вызываю его с помощью MySQL Workbench, он работает правильно.
CALL set_SiteAttendance('MyName', 'page#1', 100);
Когда я называю это с помощью php, то хранимая процедура прерывается в операторе INSERT:
$query = "CALL set_SiteAttendance('$user_name', '$user_page', $user_ticks)";
mysql_query($query);
mysql_error () вызывает проблемы
Дублирующая запись «страница № 1» для ключа «имя»
почему это происходит и как исправить?
Ну, это довольно очевидно. У вас есть уникальный индекс на name
так что ваш запрос INSERT INTO client_pages (id, name) SELECT (IFNULL(MAX(id), 0) + 1), _EventDesc FROM client_pages;
может быть запущен только один раз с тем же _EventDesc
параметр.
Удалите индекс или измените логику вашей процедуры.
Я решил свою проблему:
INSERT IGNORE INTO client_pages (id, name) SELECT (IFNULL(MAX(id), 0) + 1), _EventDesc FROM client_pages;
Ошибка (имя найдено) была проигнорирована и процедура не прерывается