为了账号安全,请及时绑定邮箱和手机立即绑定

查询使用SQL变量时的Mysqli PHP准备语句

查询使用SQL变量时的Mysqli PHP准备语句

PHP
潇湘沐 2022-07-22 16:53:01
我想将我的 SQL 查询变成一个准备好的语句,但我意识到这并不像我最初想象的那么容易。这是当前形式的查询,因此不是准备好的语句。$mysqli = new mysqli(...);$result = mysqli_query( $mysqli,"SELECT count(*) as total from test_users, image_uploads     WHERE test_users.APPROVAL = 'granted'    AND test_users.NAME = image_uploads.OWNER    AND (test_users.IMGAUTO = 'enabled' OR image_uploads.IAPPROVAL = 'granted')");$data = mysqli_fetch_assoc( $result );$row_cnt = $data['total'];$totalPages = ceil(($row_cnt / $cardmax));所以我现在的问题是这个。当我制作准备好的语句时,我将无法再访问image_uploads.OWNER,因为我目前在查询中使用它。$grant = 'granted';$owner = ""; //<<--- how to get image_uploads.OWNER$enabl = 'enabled';$sql = "SELECT COUNT(*) FROM test_users, image_uploads    WHERE test_users.APPROVAL=?    AND test_users.NAME=?    AND (test_users.IMGAUTO=? OR image_uploads.IAPPROVAL=?)";$stmt = $mysqli->prepare($sql);$stmt->bind_param('ssss', $grant, $owner, $enabl, $grant);$stmt->execute();$row = $stmt->get_result()->fetch_row();$row_cnt = $row[0];$totalPages = ceil(($row_cnt / $cardmax));有没有办法image_uploads.OWNER在我准备好的陈述中得到这个。我该如何正确地做到这一点?
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

它看起来像是image_uploads.OWNER数据库中 SQL 表中的一列。如果是这样,那么您可以将其保留在您的第一个版本中。你不需要参数化它。

只有来自数据库引擎外部的数据值(例如用户输入或来自文件的数据)需要参数化,因为该数据可能是未知的,并且可能包含需要清理的恶意值/注入攻击。引用另一个表中的列名不会造成这样的威胁——您没有将未知的字符串值放入查询语法中。

注意实际上,您的原始查询都不依赖于外部输入或未知变量 - 所有数据都被硬编码到查询文本中。因此,您实际上不需要在此特定查询中对任何内容进行参数化。一切都是预先设置好的,因此不会有意外/未知文本成为可执行 SQL 的一部分的威胁。


查看完整回答
反对 回复 2022-07-22
  • 1 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信