2015-09-06 131 views
1

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

下面是选项: nameyeartyperoomdaytime

他们全部来自name除了是可选的,可以由用户留空。某些选项可以包含由,分隔的多个值。

这里是我的代码中加入这样的信息:

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

作为参考,选择我将使用这些dymanic列:

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 ('*')不起作用。

+0

您应该考虑一个已经涵盖这种用例的框架或[ORM](https://en.wikipedia.org/wiki/Object-relational_mapping)。 – Gumbo

回答

1

那么,用香草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的方法。推荐一个是一回事,并且展示一个实例是另一回事。