PDO在准备好的语句中使用引号来调用mysql过程



我必须以以下格式运行以下MYSQL过程调用

CALL inTable(table_name,'<csv of columns>','csv of values');

在php中使用prepared语句运行的示例

CALL inTable(users,'name,email',' ? , ? ');

该过程准备了一个mysql查询,用于验证第三个参数中的逗号分隔值集是否存在于第二个参数中相应的逗号分隔列名中。

如果我使用单引号,那么PDO准备的语句会离开?占位符,但对我来说使用单引号很重要,因为如果没有单引号,过程的参数号就会不正确。

这就是我的程序准备的是什么?占位符;

SELECT COUNT(*) AS take FROM `users` WHERE (`username`,`email') IN (('?','?'));

使用以下php代码

$s = self::$handle->prepare("CALL inTable('users','phone,email',' ?,? );");
$s->bindParam(1,$phone, PDO::PARAM_STR);
$s->bindParam(2,$email, PDO::PARAM_STR);
$s->execute();
$s->fetchAll();

我应该发布我正在使用的mysql过程的代码吗?

tableExists验证数据库中是否存在表名isCommand通过regexp检查参数中是否存在修改命令以上两个都将"r"作为OUT参数。

DELIMITER $$
DROP PROCEDURE IF EXISTS inTable $$
CREATE PROCEDURE inTable(t VARCHAR(64),col VARCHAR(1024), val VARCHAR(1024))
BEGIN
DECLARE r INT DEFAULT NULL;
DECLARE c VARCHAR(256) DEFAULT NULL;
DECLARE v VARCHAR(256) DEFAULT NULL;
DECLARE cl VARCHAR(1024) DEFAULT '';
DECLARE vl VARCHAR(1024) DEFAULT '';
DECLARE s TEXT DEFAULT 'SELECT COUNT(*) AS take FROM ';
CALL tableExists(t,r);
SET col = TRIM(col);
SET val = TRIM(val);
IF r = 1 THEN
SET r = 0;
colmn: LOOP
IF LENGTH(col) = 0 OR col IS NULL OR LENGTH(val) = 0 OR val IS NULL THEN
LEAVE colmn;
END IF;
SET c = SUBSTRING_INDEX(col,',',1);
SET v = SUBSTRING_INDEX(val,',',1);
CALL isCommand(c,r);
IF r = 1 THEN
LEAVE colmn;
END IF;
CALL isCommand(v,r);
IF r = 1 THEN
LEAVE colmn;
END IF;
IF r = 0 THEN
SET cl = CONCAT(cl,'`',REPLACE(c,' ',''),'`,');
SET vl = CONCAT(vl,''',TRIM(v),'',');
SET col = INSERT(col,1,LENGTH(c) + 1,'');
SET val = INSERT(val,1,LENGTH(v) + 1,'');               
END IF;
END LOOP;
END IF;
IF r = 0 THEN
SET cl = CONCAT('(',INSERT(cl,LENGTH(cl),1,''),')');
SET vl = CONCAT('((',INSERT(vl,LENGTH(vl),1,''),'))');
SET @s = CONCAT(s,'`',t,'` WHERE ',cl,' IN ',vl,';');
SELECT @s;
PREPARE s FROM @s;
EXECUTE s;
DEALLOCATE PREPARE s;
END IF;
END $$
DELIMITER ; 

不能将多个参数绑定到一个参数。这将破坏参数绑定提供的保护级别。因此,您的过程中只有一个参数可用,但您告诉您的prepare语句使用?, ?再接受两个参数。

绑定不应该需要单独的变量。只需在PHP中将它们放在一起作为逗号分隔的值:

$binding = "$phone,$email";
$s = self::$handle->prepare("CALL inTable('users','phone,email', ?);");
$s->bindParam(1, $binding, PDO::PARAM_STR);

最新更新