2013-07-29 35 views
4

在我的一台服务器上,我遇到了一件奇怪的事情。PHP已经停止隐式检测MySQL数据库链接

通常情况下,当一个脚本执行mysql_query($query)时,如果预先成功调用了mysql_connect(),它就会正常工作。

现在,它的工作时间不到一半。现在,我突然不得不编辑整个购物车的价值的mysql_query调用,以包括过去是一个可选的数据库链接。换句话说,mysql_query($query, $db_link)现在是代码的样子。

我已经做了这个暂时的访问者仍然可以使用该网站,但我真的需要知道什么可能导致这样的事件。

是否有一些设置可能会在某个php.ini文件中发生某种改变,导致这种情况?我知道在发生这种情况时我并没有触及他们,而且当时我是唯一登录服务器的人(据我所知)。

+0

你确定现在脚本中没有另外一个'mysql_connect()'了吗?我不相信这种行为是可配置的。 – Brad

+0

我可以链接到使用'mysql_?' – Ohgodwhy

+0

@Ohgodwhy的购物车:网上的每个购物车仍使用旧代码。可能有很多。 :) – Herbert

回答

2

没有连接参数的调用mysql_query()将使用最近建立的连接。所以只要你只连接到一个数据库,你就不会看到任何问题。

the docs

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

如果您添加或添加了一些新代码(不过可能是命中跟踪器或分析工具),则可能会破坏现有代码,因为它会建立另一个mysql连接,并且在建立新连接后发生的任何查询现在将使用错误的连接。

即使额外的代码被正确编写并且始终使用自己的连接标识符,它也会发生 - 它不会有意外使用连接的问题,但代码仍会意外地使用它的连接。

为了安全使用mysql_query(),您确实需要跟踪数据库连接,并在每个查询中使用它。


之所以这么说 - 如果你是要修改所有mysql_*电话反正,请考虑切换到mysqlimysql_*函数已被弃用,no longer supportedmysqli扩展可以几乎是一个直接替换,并且还提供了对诸如预准备语句等功能的支持。

PDO扩展是另一种可能的替代方案,但从使用mysql_*转换时需要更多一点的重写。

+0

所以,我不是旧的mysql_ *函数的粉丝。我开发的大部分课程都使用PDO。我的使用PDO的类是否会导致与mysql_ *过程函数的冲突?我知道PDO有时会连接数据库。 – eComEvo

+0

据我所知,只有'的mysql_connect()'的连接将被确定默认时使用(最近期成立)对'的mysql_query)连接('。 – jcsanyi