我可以有一个持久的 PDO 对象,它只接受从 AJAX 调用绑定的新变量吗?

Posted

技术标签:

【中文标题】我可以有一个持久的 PDO 对象,它只接受从 AJAX 调用绑定的新变量吗?【英文标题】:Can I have a persistent PDO object which just accepts new variables to be bound from AJAX calls? 【发布时间】:2011-09-12 11:31:34 【问题描述】:

如果我想创建一个 ajax 搜索(用户填写表单元素,在对表单元素进行任何更新时,搜索结果都会实时更新。)

是否可以创建只需要绑定/执行通过 ajax 发送的新变量的持久(准备好的)PDO 连接?

还有其他聪明的方法吗?

编辑:要清楚,也许更具体:我正在寻找的是跨连接的持久准备语句。

【问题讨论】:

你确定存储过程不会更适合这个吗? 【参考方案1】:

您可以使用以下方法建立持久连接:

http://php.net/manual/en/pdo.connections.php

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));

这样,如果您必须重新连接新请求,PDO 将使用池中的连接而不是创建新连接。如果您将准备好的语句与prepare()bindParam() 一起使用,则查询将在数据库端进行编译,并且比通常的查询运行得更快。

一些关于缓存的链接:

http://www.snipe.net/2009/03/quick-and-dirty-php-caching/

http://docstore.mik.ua/orelly/webprog/pcook/ch10_15.htm

http://mysqlhacker.com/kabir/performance/understanding-mysql-query-cache-for-php-developers-part-i.html

【讨论】:

我明白这些分别是正确的。准备好的语句将在数据库端编译并运行得更快 - 并且 - 持久连接将尝试使用与上次相同的连接......但是我不确定这些将如何协同工作。我有一种感觉,仅仅这两个基本的部分不足以实现我正在寻找的东西,这是一个跨连接的持久准备语句。 数据库引擎将编译和缓存连接之间传递的查询。但是你不是想优化太多吗? 它用于标记系统,随着数据集开始变大(或者我的理解是这样),它可能会在关系数据库上开始变得密集。使用 AJAX 样式搜索,这将增加额外的负载,所以我试图尽可能减少计算量。 这对我来说是错误的方式。优化连接时间不会给您带来任何好处。在 PHP 中缓存查询结果,这是要走的路。 关于“如果您使用带有prepare() 和bindParam() 的准备好的语句,查询将在数据库端编译并比通常的查询运行得更快。” - 看看在bugs.php.net/bug.php?id=54638,它声明“PDO_MySQL 驱动程序默认 emulate_prepare 为 1,这会强制驱动程序模拟所有准备好的查询。”,因此服务器端编译或缓存准备好的查询刚刚获胜默认情况下不会发生。【参考方案2】:

我想你在这里谈论的是准备好的陈述,而不是“连接”。

没有办法在调用之间保持相同的准备好的语句(ajax 与否)

另一种方法是将变量存储在临时表中,并在流程结束时发送真正的请求...

【讨论】:

以上是关于我可以有一个持久的 PDO 对象,它只接受从 AJAX 调用绑定的新变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

PDO 持久连接缓存要求

是否可以将 Doctrine 与持久 PDO 连接一起使用?

从 PDO 准备好的语句中获取查询 [重复]

单例数据库与持久数据库 [重复]

使用 SSL 与远程数据库的 PDO 连接;验证服务器证书时出现 FastCGI 错误

PHP PDO 语句可以接受表名或列名作为参数吗?