未提供mysqli_stmt_bind_param()数据

问题描述 投票:0回答:1

曾多次问过类似的问题,但是在阅读了几乎所有这些问题超过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注入,这是我想要避免的。

[另外,请注意,如果我仅将一个参数传递给函数,则脚本将被执行(结果错误),就像查询在某个时刻被截断...我正确地转义了每个单引号,甚至尝试使用双引号引号,但错误始终相同。我们将非常感谢您提供有关如何防止注射并获得结果的任何提示,因为我真的无法自行解决。谢谢

php mysql mysqli prepared-statement
1个回答
3
投票

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 = ?';
© www.soinside.com 2019 - 2024. All rights reserved.