曾多次问过类似的问题,但是在阅读了几乎所有这些问题超过5个小时后,我仍未找到适合我问题的合适答案。
不是不是经验丰富的php / mysql开发人员,但是我已经通过使用mysqli_stmt_bind_param()函数来管理类似的情况。
这里是查询:
$query = 'SELECT Recipes.* , Categories.* FROM `Recipes` JOIN `Categories` ON JSON_EXTRACT(Recipes.category, \'$.category\') = \'Category ?\' WHERE Categories.category = ?';
我使用此php代码:
if ($stmt = mysqli_prepare($dbManager->getDBInstance(), $query)){
mysqli_stmt_bind_param($stmt,"ii", $id, $id);
}
因为我在客户端上有一个模型,例如:
{
"category" : "...",
"recipes" : [{...},{...}]
}
错误是:致命错误:未捕获的mysqli_sql_exception:在准备好的语句中没有为参数提供数据
我已经使用更多参数进行了类似的查询,没有任何错误:但是,这是我第一次使用mysql的JSON_EXTRACT函数。
我相信错误是由$引起的。无法正确转义。要替换的参数引用相同的变量$ id,它是一个整数,在第一种情况(“类别1”)中用作字符串插值,并在WHERE子句后用作数字。
考虑到,通过不使用mysqli_stmt_bind_param,对phpmyadmin的相同查询将返回我想要的内容,但是这将使我的代码进入mysql注入,这是我想要避免的。
[另外,请注意,如果我仅将一个参数传递给函数,则脚本将被执行(结果错误),就像查询在某个时刻被截断...我正确地转义了每个单引号,甚至尝试使用双引号引号,但错误始终相同。我们将非常感谢您提供有关如何防止注射并获得结果的任何提示,因为我真的无法自行解决。谢谢
mysqli_stmt_bind_param()
的调用中有两个参数,但是$query
中只有一个占位符。第一个?
用引号引起来,因此按原义对待,而不是占位符。
您可以使用CONCAT()
将字符串文字与占位符连接起来,因此将其更改为:
$query = '
SELECT Recipes.* , Categories.*
FROM `Recipes`
JOIN `Categories` ON JSON_EXTRACT(Recipes.category, \'$.category\') = CONCAT(\'Category \', ?)
WHERE Categories.category = ?';