【问题标题】:interrupt the execution of the stored procedure (mysql) in php在php中中断存储过程(mysql)的执行
【发布时间】: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,则不写,会报错。但这不应该停止存储过程的执行,您开始运行以下命令。而这并没有发生。为什么?
  • 如果idAUTO_INCREMENT,那么SELECT ... max(id) ... 是设置新ID 的错误方式。

标签: php mysql stored-procedures insert break


【解决方案1】:

嗯,这很明显。您在name 上有一个唯一索引,因此您的查询INSERT INTO client_pages (id, name) SELECT (IFNULL(MAX(id), 0) + 1), _EventDesc FROM client_pages; 只能使用相同的_EventDesc 参数运行一次。

删除索引或更改过程的逻辑。

【讨论】:

    【解决方案2】:

    我决定了我的问题:

    INSERT IGNORE INTO client_pages (id, name) SELECT (IFNULL(MAX(id), 0) + 1), _EventDesc FROM client_pages;
    

    错误(找到名称)被忽略,过程没有中断

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 2011-07-05
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2014-04-26
      相关资源
      最近更新 更多