2011-08-23 148 views
1
$j = new DB(); 
$j->SetSqlCommnd("DELETE FROM cpd_colaborator_access 
      WHERE col_cod = ".$_POST["colaborator"].""); 
$j->Exec(); 



for($i = 0; $i < count($_POST["page"]); $i++) 
{   
    $j = new DB(); 
    $j->SetSqlCommnd("INSERT INTO cpd_colaborator_access (access_id,col_cod) 
       VALUES (".$_POST["page"][$i].",".$_POST["colaborator"].")"); 
    $j->Exec(); 
} 

我試圖代表這個php代碼,在下面的這個程序中,傳遞一個數組作爲參數「p_pages」和一個id「p_colaborator」;程序mysql不能正常工作

CREATE DEFINER=`root`@`localhost` PROCEDURE `delegar_paginas`(
IN p_colaborator INT, 
IN p_pages INT 
) 
BEGIN 
DECLARE A INT(200); 
DECLARE I INT(0); 
IF (p_colaborator <> '') THEN 
    DELETE FROM cpd_colaborator_access 
    WHERE col_cod = p_colaborator; 
    WHILE (I<@A) DO 
    IF(p_pages(0,I) <> '')THEN 
     INSERT INTO cpd_colaborator_acess (acess_id,col_cod) 
     VALUES (p_pages(0,I),p_colaborator); 
    ELSE 
     SET I = A; 
    END IF; 
    END WHILE; 
END IF; 
END; 

我是初學者到存儲過程,有人知道這裏可能是錯誤的嗎?

+0

爲什麼你認爲這是錯的?我們需要猜測你得到的是什麼**執行錯誤? – zerkms

回答

0

我對p_colaborator和p_pages應該是什麼樣的數據類型有點困惑 - 你在參數行中聲明它們都是INT,但是你把p_colaborator當作字符串,p_pages當作數組(字符串? ),但它被插入到ID字段中。

MySQL不支持程序中的數組,但有很多解決方法(http://stackoverflow.com/questions/595371/pass-array-into-a-stored-procedure)。

因此,該程序做了一些假設:

  • p_colaborator是一個字符串(VARCHAR(255))。
  • p_pages是逗號分隔的數字列表(如'1,2,3,4')。

有了這些假設,這個過程應該做的伎倆:

DROP PROCEDURE delegar_paginas; 

DELIMITER // 

CREATE PROCEDURE delegar_paginas(IN p_colaborator VARCHAR(255), IN p_pages VARCHAR(255)) 
BEGIN 
IF (p_colaborator <> '') THEN 
    DELETE FROM cpd_colaborator_access WHERE col_cod = p_colaborator; 
    SET @ins = CONCAT('(', REPLACE(p_pages, ',', CONCAT(', "', p_colaborator, '"), (')), ', ', p_colaborator, ')'); 
    SET @SQL = CONCAT('INSERT INTO cpd_colaborator_acess (acess_id,col_cod) VALUES ', @ins); 
    SELECT @SQL; 
    PREPARE stmt FROM @SQL; 
    EXECUTE stmt; 
END IF; 
END; 
// 

DELIMITER ;