[Mysli PHP在查询中使用SQL变量时准备的语句

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

我想将我的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的方法。如何正确执行此操作?

javascript php mysqli prepared-statement
1个回答
2
投票

看起来image_uploads.OWNER是数据库中SQL表中的一列。如果是这样,那么您可以保留它的第一个版本。您无需对其进行参数化。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.