使用PHP调用带限制的参数化MariaDB SP时出现问题

使用PHP调用带限制的参数化MariaDB SP时出现问题,php,stored-procedures,mariadb,Php,Stored Procedures,Mariadb,我一直被这个问题难住了,在任何地方都找不到一个有效的例子或教程 给定以下存储过程: SQL delimiter $$ CREATE PROCECURE sp1(IN 'myoffset' INT, IN 'myrows' INT) begin select * from t1 limit 'myoffset', 'myrows' END$$ delimiter 我尝试从PHP调用它,如下所示: 。。。那么,建立$conn PHP // ver1: $sql = ( "SET @p0 = $t

我一直被这个问题难住了,在任何地方都找不到一个有效的例子或教程

给定以下存储过程:

SQL

delimiter $$
CREATE PROCECURE sp1(IN 'myoffset' INT, IN 'myrows' 
INT)
begin
select * from t1
limit 'myoffset', 'myrows'
END$$
delimiter
我尝试从PHP调用它,如下所示:

。。。那么,建立$conn

PHP

// ver1:
$sql = ( "SET @p0 = $tmp1;" . " SET @p1 = $tmp2;" . " 
CALL `sp1`(@p0, @p1);" );

//OR    

//ver2
$sql = "SET @p0 = `$tmp1`; SET @p1 = `$tmp2`; CALL 
`sp1`(@p0, @p1);";

$result = mysqli_query($conn, $sql);
两者都不起作用。MariaDB抱怨说

“错误描述:您的SQL语法有错误;请检查与您的MariaDB服务器版本相对应的手册,以了解在第2行的”SET@p1=
25
;CALL
sp1
(@p0,@p1)”附近使用的正确语法。”


任何帮助都将不胜感激

$tmp1
中有什么

如果它是一个数字,那么第一个应该起作用,但是第二个没有意义,因为它变成了一个数字

SET @p0 = `1234`;
我假设没有名为
1234
的列或表?请记住,backtic用于列、表和数据库名称

如果$tmp是字符串
“字符串”
,则

SET @p0 = a string;  -- strings need to be quoted here
$sql = "CALL `sp1`('Don't do this', '$tmp2')";

之后,您会遇到另一个问题:不要将多个语句固定在一起(用
)分隔);分别运行它们

最后,不需要
@p0
等:

$sql = "CALL `sp1`('$tmp1', '$tmp2')";
这就足够了

嗯,不完全是。如果$tmps的值来自外部世界,请参阅可怕的“SQL注入”问题

哦,如果

$tmp1 = "Don't do this";
然后你得到

SET @p0 = a string;  -- strings need to be quoted here
$sql = "CALL `sp1`('Don't do this', '$tmp2')";
看看单引号。有三个。这将如何解析