【发布时间】:2017-01-29 11:36:55
【问题描述】:
我写了一个存储过程(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列上是否设置了 UNIQUE 属性?如果是这样,当您在工作台中创建它时,您将无法从 PHP 再次创建它。删除您使用工作台添加的行,使用工作台并再次尝试 PHP 代码 -
我的存储过程的逻辑可以正常工作。当我在 MySQL Workbench 中调用存储过程时,不会发生错误。基本逻辑是: 1.我正在尝试用新的ID 2.a)写_EventDesc client_pages表存在,则不会添加 3. client_pages 的进一步表获取 ID _EventDesc 记录 4. 记下 ID 表 login_history
-
如你所见——一切正常自然,如果client_pages中已经有_EventDesc,则不写,会报错。但这不应该停止存储过程的执行,您开始运行以下命令。而这并没有发生。为什么?
-
如果
id是AUTO_INCREMENT,那么SELECT ... max(id) ...是设置新ID 的错误方式。
标签: php mysql stored-procedures insert break