2011-08-23 151 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 ;