在PHP

时间:2015-09-06 16:04:11

标签: php mysql mysqli

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

以下是选项: name year type room day time

除了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行来处理时,如何创建动态查询?

为了演示,我已经添加...我需要动态生成查询。

我无法使用PDO因为应用程序的其余部分当前正在使用MYSQLi,因此工作量太大了。

或者,是否可以在IN子句中使用通配符?在这种情况下,我可以在PHP中创建'' = '*'。但room in ('*')无效。

1 个答案:

答案 0 :(得分:2)

好吧,对于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);

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

我只需要提到准备好的语句只在这里模拟,但它和本机语句一样安全。

顺便说一句,我希望看到其他DBAL或ORM的方法。推荐一个是一回事,展示一个有效的例子是另一回事。