猿问

mysqli_stmt_bind_param() 当问号是查询的一部分时未提供

类似的问题已经被问过很多次,但是在阅读了几乎每一个超过5个小时的问题之后,我还没有找到适合我的问题的答案。


我不是一个有经验的php / mysql开发人员,但我使用mysqli_stmt_bind_param()func管理了类似的情况。


下面是查询:


$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注入,这是我想避免的。


另外,请注意,如果我只向函数传递一个参数,脚本就会被执行(结果错误),就像查询在某个时候被截断一样...我正确地转义了每个单引号,甚至尝试使用双引号,但错误总是一样的。

任何关于如何防止注射并达到结果的提示将不胜感激,因为我真的无法自己弄清楚。

谢谢


德玛西亚99
浏览 121回答 2
2回答

守着星空守着你

在调用 中有两个参数,但 中只有一个占位符。第一个是在引号内,所以它是按字面意思处理的,而不是占位符。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 = ?';

慕斯709654

占位符只能表示完整的数据文本。简单地说 - 任何你会写在引号(或数字)中的东西。所以它不应该是,而只是在PHP中可以连接类别的地方。'Category ?'?$query = 'SELECT * FROM `Recipes` JOIN `Categories` ON           JSON_EXTRACT(Recipes.category, \'$.category\') = ?          WHERE Categories.category = ?';$stmt = mysqli_prepare($dbManager->getDBInstance(), $query);$category = "Category $id";mysqli_stmt_bind_param($stmt,"si", $category, $id);
随时随地看视频慕课网APP
我要回答