在搜索表单查询中使用 PDO 准备语句 - PHP
Using A PDO Prepared Statement On A Search Form Query - PHP
我有一些图像从 MySQL 数据库输出到带有 PHP 的页面上。输出它们的 while
循环包含一个连接,因为它从两个数据库 table 获取数据(一个 imageposts
table 和一个 users
table ).
当前输出的查询是 运行,但由于没有用户输入,它使用以下代码:
<?php
// IMAGE GRID JOIN
$stmt = $connection->query("SELECT imgp.*, u.id, u.firstname, u.lastname
FROM imageposts AS imgp
INNER JOIN users AS u ON imgp.user_id = u.id");
while ($row = $stmt->fetch()) {
// from imageposts table
$db_image_id = htmlspecialchars($row['image_id']);
$db_image_title = htmlspecialchars($row['image_title']);
$db_image_filename = htmlspecialchars($row['filename']);
$db_ext = htmlspecialchars($row['file_extension']);
$db_username = htmlspecialchars($row['username']);
// from users table
$db_firstname = htmlspecialchars($row['firstname']);
$db_lastname = htmlspecialchars($row['lastname']);
?>
-- HTML OUTPUT
<?php } ?>
问题
我还在为该站点设置我的第一个搜索表单,当输出图像时,我希望它们提取与上面相同的信息(除了搜索查询之外),但因为它是一个搜索表单并有用户输入,我将需要使用准备好的语句,但我不知道如何处理这个问题?
搜索将在 imageposts
table 的 image_title
列上进行,因此就 sudo 代码而言,它将是:
$searchSQL = "SELECT * FROM `imageposts` WHERE `image_title` LIKE %$searchQuery% ";
其中 $searchQuery
是搜索输入字段的值。
但是我如何将它与这个问题第一部分中的查询集成,并使用准备好的语句来保证安全?
MySQL会是这个吗?:
"SELECT imgp.*, u.id, u.firstname, u.lastname
FROM imageposts AS imgp
INNER JOIN users AS u ON imgp.user_id = u.id WHERE image_title LIKE %$searchQuery%"
如果是这样,我如何根据 $searchQuery
上的准备语句确保它的安全?
备选方案 1:
$sql = "SELECT imgp.*, u.id, u.firstname, u.lastname
FROM imageposts AS imgp
INNER JOIN users AS u ON imgp.user_id = u.id
WHERE image_title LIKE CONCAT('%', ?, '%')";
$stmt = $connection->prepare($sql);
$stmt->execute([$searchQuery]);
备选方案 2:
$sql = "SELECT imgp.*, u.id, u.firstname, u.lastname
FROM imageposts AS imgp
INNER JOIN users AS u ON imgp.user_id = u.id
WHERE image_title LIKE ?";
$stmt = $connection->prepare($sql);
$stmt->execute(["%{$searchQuery}%"]);
我有一些图像从 MySQL 数据库输出到带有 PHP 的页面上。输出它们的 while
循环包含一个连接,因为它从两个数据库 table 获取数据(一个 imageposts
table 和一个 users
table ).
当前输出的查询是 运行,但由于没有用户输入,它使用以下代码:
<?php
// IMAGE GRID JOIN
$stmt = $connection->query("SELECT imgp.*, u.id, u.firstname, u.lastname
FROM imageposts AS imgp
INNER JOIN users AS u ON imgp.user_id = u.id");
while ($row = $stmt->fetch()) {
// from imageposts table
$db_image_id = htmlspecialchars($row['image_id']);
$db_image_title = htmlspecialchars($row['image_title']);
$db_image_filename = htmlspecialchars($row['filename']);
$db_ext = htmlspecialchars($row['file_extension']);
$db_username = htmlspecialchars($row['username']);
// from users table
$db_firstname = htmlspecialchars($row['firstname']);
$db_lastname = htmlspecialchars($row['lastname']);
?>
-- HTML OUTPUT
<?php } ?>
问题
我还在为该站点设置我的第一个搜索表单,当输出图像时,我希望它们提取与上面相同的信息(除了搜索查询之外),但因为它是一个搜索表单并有用户输入,我将需要使用准备好的语句,但我不知道如何处理这个问题?
搜索将在 imageposts
table 的 image_title
列上进行,因此就 sudo 代码而言,它将是:
$searchSQL = "SELECT * FROM `imageposts` WHERE `image_title` LIKE %$searchQuery% ";
其中 $searchQuery
是搜索输入字段的值。
但是我如何将它与这个问题第一部分中的查询集成,并使用准备好的语句来保证安全?
MySQL会是这个吗?:
"SELECT imgp.*, u.id, u.firstname, u.lastname
FROM imageposts AS imgp
INNER JOIN users AS u ON imgp.user_id = u.id WHERE image_title LIKE %$searchQuery%"
如果是这样,我如何根据 $searchQuery
上的准备语句确保它的安全?
备选方案 1:
$sql = "SELECT imgp.*, u.id, u.firstname, u.lastname
FROM imageposts AS imgp
INNER JOIN users AS u ON imgp.user_id = u.id
WHERE image_title LIKE CONCAT('%', ?, '%')";
$stmt = $connection->prepare($sql);
$stmt->execute([$searchQuery]);
备选方案 2:
$sql = "SELECT imgp.*, u.id, u.firstname, u.lastname
FROM imageposts AS imgp
INNER JOIN users AS u ON imgp.user_id = u.id
WHERE image_title LIKE ?";
$stmt = $connection->prepare($sql);
$stmt->execute(["%{$searchQuery}%"]);