Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:向StoredProcess传递参数时出现单个qoute问题_Php_Mysql_Database_Stored Procedures - Fatal编程技术网

Php MySQL:向StoredProcess传递参数时出现单个qoute问题

Php MySQL:向StoredProcess传递参数时出现单个qoute问题,php,mysql,database,stored-procedures,Php,Mysql,Database,Stored Procedures,我正在从PHP向存储过程发送一个逗号分隔的列表。存储过程如下所示: UPDATE RolesMenus SET Enabled=1 WHERE MenuID IN(prmMenusList) AND RoleID = prmRoleID; 现在的问题是,当我通过代码传递菜单列表(prmMenusList)时,它只更新列表中第一个元素的值。我认为,这是由于列表中有一些引用。查询的形式如下: UPDATE RolesMenus SET Enabled=0 WHERE MenuID IN('1,7,

我正在从PHP向存储过程发送一个逗号分隔的列表。存储过程如下所示:

UPDATE RolesMenus SET Enabled=1 WHERE MenuID IN(prmMenusList) AND RoleID = prmRoleID;
现在的问题是,当我通过代码传递菜单列表(prmMenusList)时,它只更新列表中第一个元素的值。我认为,这是由于列表中有一些引用。查询的形式如下:

UPDATE RolesMenus SET Enabled=0 WHERE MenuID IN('1,7,19,20,21,26') AND RoleID = 74;
我怎样才能避免这种情况

在这里,我添加了CodeIgniter(PHP)代码:


prmMenusList
作为整数列表而不是字符串发送:

UPDATE RolesMenus SET Enabled=0 WHERE MenuID IN(1,7,19,20,21,26) AND RoleID = 74;
如果您的存储过程只执行该更新,我认为您可以编写整个函数,如下所示:

Public function enableMenus($selectedMenus, $roleID){
                    $this->db->where_in('MenuID', $selectedMenus);
                    $this->db->where('RoleID', $roleID);
                    $result = $this->db->update('RolesMenus', array( 'Enabled' => 0 ) ); 
                    $tempResult = $result;
                    $result->next_result();
                    return $tempResult->result();
                }
据我所知,到目前为止,还没有将数组传递给存储过程的直接方法。 您可以创建另一个存储过程来解析包含ID的字符串,创建存储数组值的临时表,然后将该临时表作为参数发送到实际的存储过程。 但是,在我看来,这更令人头痛:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `YourDB`.`sp_parseIntList` $$ 
CREATE DEFINER=`hotstuff`@`%` PROCEDURE `sp_parseIntList`( 
_intlist TEXT ) 
BEGIN 

DECLARE comma INT DEFAULT 0; 
DECLARE mylist TEXT DEFAULT _intlist; 
DECLARE temp TEXT DEFAULT ''; 
DECLARE strlen int DEFAULT LENGTH(_intlist); 


CREATE TEMPORARY TABLE TempTable (num int) TYPE=INNODB; 


SET comma = LOCATE(',',mylist); 

WHILE strlen > 0 DO 
IF 
comma = 0 
THEN 
SET temp = TRIM(mylist); 
SET mylist = ''; 
SET strlen = 0; 
ELSE 
SET temp = TRIM(SUBSTRING(mylist,1,comma)); 
SET mylist = TRIM(SUBSTRING(mylist FROM comma+1)); 
SET strlen = LENGTH(mylist); 
END IF; 

IF CAST(temp as UNSIGNED) != 0 
THEN 
INSERT INTO TempTable VALUES(CAST(temp as UNSIGNED)); 
END IF; 
SET comma = LOCATE(',',mylist); 
END WHILE; 

SELECT * FROM TempTable; 

DROP TEMPORARY TABLE IF EXISTS TempTable; 



END $$ 

DELIMITER ;

我已经解决了这个问题

刚才使用的查询如下:

UPDATE RolesMenus SET Enabled=1 WHERE FIND_IN_SET(MenuID,prmMenusList) AND RoleID = prmRoleID;
或:


请发布PHP代码allow.Tudor,如何将整数列表传递到存储过程以及如何处理它们?此外,我还使用php codeTausif编辑了我的文章,这篇文章的编辑是否有助于解决您的问题?实际上,关于第一种方法,我只需传递一些参数,以及如何使用存储过程执行其余功能。其次,这不是一种推荐的方式:(
UPDATE RolesMenus SET Enabled=1 WHERE FIND_IN_SET(MenuID,prmMenusList) AND RoleID = prmRoleID;
UPDATE RolesMenus SET Enabled=1 WHERE FIND_IN_SET(MenuID,'1,2,3,4') AND RoleID = 1;