为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕慕森 2021-10-15 10:31:40
我一直被这个难住了,在任何地方都找不到工作示例或教程。给定以下存储过程:SQLdelimiter $$CREATE PROCECURE sp1(IN 'myoffset' INT, IN 'myrows' INT)beginselect * from t1limit '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)'附近使用的正确语法”任何帮助将非常感激!
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

什么在$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个。这将如何解析?


查看完整回答
反对 回复 2021-10-15
  • 1 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信