Mysqli PHP prepared statement when query uses SQL variable
Mysqli PHP prepared statement when the query uses SQL variable
我想将我的 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
。我该如何正确执行此操作?
看起来 image_uploads.OWNER
是您数据库中 SQL table 中的一个列。如果是这样,那么您可以将其保留在您的第一个版本中。您不需要对其进行参数化。
只有来自数据库引擎外部的数据值(例如用户输入或文件中的数据)需要参数化,因为该数据可能是未知的并且可能包含需要清理的恶意值/注入攻击.引用另一个 table 的列名不会造成这样的威胁 - 您没有将未知字符串值放入查询语法中。
N.B。事实上 none 您的原始查询依赖于外部输入或未知变量 - 所有数据都被硬编码到查询文本中。因此,您实际上根本不需要在此特定查询中对任何内容进行参数化。一切都是预先设置好的,所以没有意外/未知文本成为 execu 的一部分的威胁table SQL.
我想将我的 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
。我该如何正确执行此操作?
看起来 image_uploads.OWNER
是您数据库中 SQL table 中的一个列。如果是这样,那么您可以将其保留在您的第一个版本中。您不需要对其进行参数化。
只有来自数据库引擎外部的数据值(例如用户输入或文件中的数据)需要参数化,因为该数据可能是未知的并且可能包含需要清理的恶意值/注入攻击.引用另一个 table 的列名不会造成这样的威胁 - 您没有将未知字符串值放入查询语法中。
N.B。事实上 none 您的原始查询依赖于外部输入或未知变量 - 所有数据都被硬编码到查询文本中。因此,您实际上根本不需要在此特定查询中对任何内容进行参数化。一切都是预先设置好的,所以没有意外/未知文本成为 execu 的一部分的威胁table SQL.