2016-09-21 45 views
0

執行我寫了一個存儲過程(MySQL的)中斷存儲過程(MySQL的)的在PHP

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工作臺,它工作正常。

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 'for key'name'

爲什麼會發生,以及如何解決?

+0

是否'name'列具有獨特的屬性設置就可以了?如果是這樣,那麼當您在工作臺中創建它時,則無法再從PHP中創建它。刪除使用工作臺添加的行,使用工作臺並再次嘗試PHP代碼 – RiggsFolly

+0

[如何從PHP代碼中調用MySQL存儲過程?](http://stackoverflow.com/questions/3966747/how-to -call-a-mysql-stored-procedure-from-within-php-code) – e4c5

+0

我的存儲過程正常工作的邏輯。當我在MySQL Workbench中調用存儲過程時,不會發生錯誤。 基本邏輯是: 1.我試圖寫_EventDesc client_pages表的新ID爲 2.a)如果表client_pages這樣的記錄不是,它會被加上 2.b)如果表client_pages這樣的記錄已經存在,那麼它將不會被添加 3. client_pages的更多表獲取ID _EventDesc記錄 4.記下ID表login_history – Zhihar

回答

0

好吧,這很明顯。您在name上有唯一索引,因此您的查詢INSERT INTO client_pages (id, name) SELECT (IFNULL(MAX(id), 0) + 1), _EventDesc FROM client_pages;只能使用相同的_EventDesc參數運行一次。

刪除索引或更改程序的邏輯。

0

,我決定我的問題:

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

錯誤(名字被發現),被忽略和程序不被中斷