我一直被這個難住了,在任何地方都找不到工作示例或教程。給定以下存儲過程:SQLdelimiter $$CREATE PROCECURE sp1(IN 'myoffset' INT, IN 'myrows' INT)beginselect * from t1limit 'myoffset', 'myrows'END$$delimiter我正在嘗試從 PHP 調(diào)用它,如下所示:... 建立 $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 服務(wù)器版本相對應(yīng)的手冊,以獲取在第 2 行的'SET @p1 = 25; CALL sp1(@p0, @p1)'附近使用的正確語法”任何幫助將非常感激!
1 回答

慕容森
TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個贊
什么在$tmp1
?
如果它是一個數(shù)字,那么第一個應(yīng)該可以工作,但第二個沒有意義,因?yàn)樗兂闪?/p>
SET @p0 = `1234`;
我假設(shè)沒有名為1234
? 請記住,反引號用于列、表和數(shù)據(jù)庫名稱。
如果 $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.
之后,您還有另一個問題:不要將多個語句組合在一起(以 分隔;
);分別運(yùn)行它們。
最后,不需要@p0
等:
$sql = "CALL `sp1`('$tmp1', '$tmp2')";
足夠了。
嗯,不完全是。如果 $tmps 的值來自外部世界,請參閱可怕的“SQL 注入”問題。
哦,如果
$tmp1 = "Don't do this";
然后你得到
$sql = "CALL `sp1`('Don't do this', '$tmp2')";
看單引號。其中有3個。這將如何解析?
- 1 回答
- 0 關(guān)注
- 118 瀏覽
添加回答
舉報
0/150
提交
取消