首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中生成一个动态的MYSQLi准备语句

在PHP中生成一个动态的MYSQLi准备语句
EN

Stack Overflow用户
提问于 2015-09-06 16:04:11
回答 1查看 493关注 0票数 1

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

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

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

下面是我添加这些信息的代码:

代码语言:javascript
复制
if ($addGrp = $m->prepare("SELECT * FROM pro_files WHERE userid=?, name=? ...")) {
    $addGrp->bind_param('is ...',$userid, $name ...;
}

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

代码语言:javascript
复制
WHERE room in (g23,f43,g43) AND type in ('pptx,ppt,ai,pdf')

用于绑定它们的变量是逗号分隔的值(根据用户选择的内容生成,如果用户不选择任何变量,变量就不存在):

代码语言:javascript
复制
$room = 'g23,f43,g43';
$type = 'pptx,ppt,ai,pdf';

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

为了进行演示,我添加了...,在这里我需要动态生成查询。

我不能使用PDO,因为应用程序的其余部分目前正在使用MYSQLi,这一工作太棒了。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-06 16:26:19

好吧,用香草的mysqli准备的声明,这将是一个相当困难的挑战。

但有了一些DBAL或ORM,它可以简化。比方说,通过使用DBAL我写,可以很好地完成这一任务:

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

代码语言:javascript
复制
$name = 'Bill';
$year = NULL;
$room = ['g23','f43','g43'];
$type = NULL;
$day  = 4;
$time = NULL;

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

代码语言:javascript
复制
$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)";

并最后运行查询:

代码语言:javascript
复制
$data = $db->getAll($sql,$name,$year,$year,$room,$room,$type,$type,$day,$day,$time,$time);

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

我只需要提到,准备好的声明只是在这里模仿,但它和本地声明一样安全。

顺便说一下,我希望看到来自其他DBAL或ORM的方法。推荐一个是一回事,展示一个工作的例子则是另一回事。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32425509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档