【问题标题】:Generate a dynamic MYSQLi prepared statement in PHP在 PHP 中生成动态 MYSQLi 准备语句
【发布时间】:2023-04-07 20:53:01
【问题描述】:

我有一个应用程序可以显示数据库表中的文件列表。我希望用户能够通过选择将过滤文件列表并仅显示匹配的选项来创建组。组选项被添加到另一个表以供以后使用。

以下是选项: nameyeartyperoomdaytime

除了name 之外,所有这些都是可选的,用户可以留空。一些选项可以包含多个由, 分隔的值。

这是我添加此信息的代码:

if ($addGrp = $m->prepare("SELECT * FROM pro_files WHERE userid=?, name=? ...")) {
    $addGrp->bind_param('is ...',$userid, $name ...;
}

作为参考,选择我将使用的这些动态列:

WHERE room in (g23,f43,g43) AND type in ('pptx,ppt,ai,pdf')

并且用于绑定它们的变量是逗号分隔的值(根据用户选择的内容生成,如果用户什么都不选择,则该变量将不存在):

$room = 'g23,f43,g43';
$type = 'pptx,ppt,ai,pdf';

使用旧的 MYSQL 方法,我可以创建一个查询字符串,没有问题。当我还需要处理 bind_param 行时,如何创建动态查询?

为了演示,我在需要动态生成查询的地方添加了...

由于应用程序的其余部分当前正在使用 MYSQLi,因此我无法使用 PDO,这项工作太棒了。

另外,是否可以在 IN 子句中使用通配符?在这种情况下,我可以在 PHP 中创建'' = '*'。但是room in ('*') 不起作用。

【问题讨论】:

  • 您应该考虑一个框架或 ORM 已经涵盖了此类用例。

标签: php mysql mysqli


【解决方案1】:

好吧,使用 vanilla mysqli 准备好的语句将是一个相当艰巨的挑战。
但是使用一些 DBAL 或 ORM 可以简化它。比如说,通过使用DBAL I wrote,它可以以一种非常简洁的方式完成:

首先根据用户输入定义变量。

$name = 'Bill';
$year = NULL;
$room = ['g23','f43','g43'];
$type = NULL;
$day  = 4;
$time = NULL;

然后编写一个查询,其中每个变量都被使用两次

$sql = "SELECT * pro_files WHERE name=?s 
(AND ?s is NULL OR year = ?s)
(AND ?a is NULL OR type = ?a)
(AND ?a is NULL OR room = ?a)
(AND ?s is NULL OR day  = ?s)
(AND ?s is NULL OR time = ?s)";

最后运行查询:

$data = $db->getAll($sql,$name,$year,$year,$room,$room,$type,$type,$day,$day,$time,$time);

它将根据提供的非空值返回搜索结果。

我只需要提一下,prepared statements 仅在此处进行模拟,但它与本地语句一样安全。

顺便说一下,我想看看其他 DBAL 或 ORM 的方法。推荐一个是一回事,展示一个可行的例子是另一回事。

【讨论】:

    猜你喜欢
    • 2015-03-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多