我一直被这个难住了,在任何地方都找不到工作示例或教程。给定以下存储过程: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个。这将如何解析?
- 1 回答
- 0 关注
- 106 浏览
添加回答
举报
0/150
提交
取消