有没有办法用 mysql_query 设置默认数据库句柄?

Posted

技术标签:

【中文标题】有没有办法用 mysql_query 设置默认数据库句柄?【英文标题】:Is there a way to set the default database handle with mysql_query? 【发布时间】:2010-07-27 18:47:18 【问题描述】:

有没有办法用 mysql_query 设置默认的数据库句柄?所以我知道 mysql_query 可以在没有 sql 句柄的情况下调用,但它基本上会使用你从 last mysql_connect 获得的任何句柄。如果我想自己设置默认句柄怎么办?


我只是想明确一点,我们编写的所有代码都没有传入处理程序。我们无法更改这些。我们在幕后有一些代码可以在不同的数据库集群之间更改数据库。我们希望能够在不重复调用 mysql_connect 的情况下在数据库之间切换。

【问题讨论】:

厌倦了每次都将参数传递给函数?尝试使用using an object-oriented 数据库接口,并免费获得prepared statements!立即购买! (另外,PDO。不过,请认真考虑使用更现代的数据库界面。) 不久前我在 asp wid mySQl 中也遇到过类似的问题。我也问了一个问题,可惜没有回复。你的问题给了某种尤里卡来解决我的问题......谢谢。 【参考方案1】:

超级贫民区版本。

$defaultHandle;

function SetDefaultHandle($handle)
    global $defaultHandle;
    $defaultHandle = $handle;


function q($query)
    global $defaultHandle;
    return mysql_query($query,$defaultHandle);

【讨论】:

+1 实际提供了一个可用的解决方案,并为它的 hack 大声疾呼。 你能覆盖mysql_query函数吗?否则这是行不通的。 为什么不呢?当然,您必须将现有代码库中对mysql_query 的所有调用替换为对q 的调用。但无论如何你都必须这样做。 没有办法让mysql_query 做你想做的事,只有变通方法和技巧。这是一种解决方法,而且是一种骇人听闻的方法。但是,它会起作用的。【参考方案2】:

试试这个:

$dbc = mysql_connect('localhost', 'mysql_user', 'mysql_password');
mysql_query($query, $dbc);

来自manual:

resource mysql_query ( string $query [, resource $link_identifier ] )

link_identifier - MySQL 连接。如果未指定链接标识符,则假定由 mysql_connect() 打开的最后一个链接。如果没有找到这样的链接,它将尝试创建一个,就好像 mysql_connect() 没有参数被调用一样。如果没有找到或建立连接,则会生成 E_WARNING 级别的错误。

【讨论】:

【参考方案3】:

而不是根据您的问题将您指向手册,您现在肯定已经阅读了...

您不能使用 mysql 扩展来执行此操作。

神奇的“选择最后打开的句柄”行为是由扩展本身定义的。您无法改变这种行为。

您要求的行为将需要自定义代码,几乎可以肯定的是,使用适当的包装器替换对每个函数的每个调用,该包装器为您的负载平衡情况选择正确的数据库句柄。

【讨论】:

【参考方案4】:

如果你想提供连接,你可以在函数调用中将它作为第二个参数传递。详情请见documentation of mysql_query

【讨论】:

我们不能编写我们的代码,使得所有查询都在不传递句柄的情况下完成。然后我们在我们的数据库农场之间切换幕后的数据库 不连接怎么生成链接标识符?

以上是关于有没有办法用 mysql_query 设置默认数据库句柄?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法为 sfWidgetFormFilterDate 小部件设置默认值?

Extjs Grid Grouping - 设置默认标题/值

MySQL 批量写入数据报错:mysql_query:Lost connection to MySQL server during query

有没有办法为引导程序设置默认缩放

有没有办法为 Heroku Toolbelt 设置默认应用程序?

有没有办法将“a”标签链接取消设置为默认颜色