在搜索表单查询中使用 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}%"]);