使用 PHP 使用 LIMIT 调用参数化 MariaDB SP 时出现问题

我一直被这个难住了,在任何地方都找不到工作示例或教程。


给定以下存储过程:


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)'附近使用的正确语法”


任何帮助将非常感激!


慕慕森
浏览 107回答 1
1回答

慕容森

什么在$tmp1?如果它是一个数字,那么第一个应该可以工作,但第二个没有意义,因为它变成了SET @p0 = `1234`;我假设没有名为1234? 请记住,反引号用于列、表和数据库名称。如果 $tmp 是 string "a string",那么你得到SET @p0 = a string;  -- strings need to be quoted here或者SET @p0 = `a string`;  -- again that is treated as a column (etc) name.之后,您还有另一个问题:不要将多个语句组合在一起(以 分隔;);分别运行它们。最后,不需要@p0等:$sql = "CALL `sp1`('$tmp1', '$tmp2')";足够了。嗯,不完全是。如果 $tmps 的值来自外部世界,请参阅可怕的“SQL 注入”问题。哦,如果$tmp1 = "Don't do this";然后你得到$sql = "CALL `sp1`('Don't do this', '$tmp2')";看单引号。其中有3个。这将如何解析?
打开App,查看更多内容
随时随地看视频慕课网APP