类似的问题已经被问过很多次,但是在阅读了几乎每一个超过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注入,这是我想避免的。另外,请注意,如果我只向函数传递一个参数,脚本就会被执行(结果错误),就像查询在某个时候被截断一样...我正确地转义了每个单引号,甚至尝试使用双引号,但错误总是一样的。任何关于如何防止注射并达到结果的提示将不胜感激,因为我真的无法自己弄清楚。谢谢
2 回答

守着星空守着你
TA贡献1799条经验 获得超8个赞
在调用 中有两个参数,但 中只有一个占位符。第一个是在引号内,所以它是按字面意思处理的,而不是占位符。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
TA贡献1840条经验 获得超5个赞
占位符只能表示完整的数据文本。简单地说 - 任何你会写在引号(或数字)中的东西。所以它不应该是,而只是在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);
- 2 回答
- 0 关注
- 120 浏览
添加回答
举报
0/150
提交
取消