PHP交互式mysql()不起作用,但mysqli()正在工作;为什么呢?

时间:2015-12-22 06:23:40

标签: php mysql mysqli mariadb

概要:转储/恢复后,无法再从Web应用程序连接到MariaDB。这似乎是在MariaDB中处理PHP mysql()和mysqli()接口的方式之间的一些区别。

MacOS X 10.6.8(Snow Leopard)上的MariaDB 10.1.8,PHP 5.3.8和Apache 2.2.24。

由于磁盘驱动器出现故障,我遇到了一个"数据库腐烂的情况,“一些InnoDB表变得无法访问,最终导致服务器崩溃。我按照服务器错误日志条目指向的网页中的说明进行操作,并且能够使用“mysqld --innodb_force_recovery = 2”以只读方式运行它。 (1级仍然崩溃,我不敢尝试3级。)

在“force_recovery”模式下,我对所有数据库(11 GB)进行了逻辑(SQL代码)转储,重命名了错误的数据目录,并运行“scripts / mysql_install_db.sh”来初始化空数据目录。然后我加载了逻辑备份,只有很小的问题。

现在它变得令人费解。我可以使用各种工具访问数据库,包括mysql CLI,phpMyAdmin,Sequel Pro,Valentia等。

但我无法通过我托管的任何网站进入数据库,包括MediaWiki的几个版本和本土图像库的几个实例。它在mysql_connect()中失败,登录凭据通过mysql CLI工作。但phpMyAdmin使用相同的登录凭据工作!

所以我浏览了phpMyAdmirn代码,发现它使用的是mysqli(),而破碎的网页应用程序似乎正在使用mysql()。 phpMyAdmin有一个配置变量来控制它;我把它从“mysqli”改为“mysql”,它就破了。将其改回“mysqli”,它再次起作用。

我没有更改任何PHP代码。我没有改变任何apache设置。我没有改变/etc/my.cnf。我没有改变/etc/php.ini。我没有更改任何登录凭据。唯一改变的是转储,重新启动和恢复所有数据库。

我想也许一些神奇的MySQL系统变量设置没有通过转储/恢复周期。

我做了phpinfo(),表示mysqli()正在使用正确的套接字:/tmp/mysql.sock,但是mysql()正在使用/var/mysql/mysql.sock,它未在/ etc /中启用php.ini中。 / var / mysql中有一个指向/tmp/mysql.sock的符号链接,这让我觉得我之前已经走过了这条道路......我试着把它变成一个硬链接;仍然没有快乐。

我跑了" php -info",实际上,编译好的套接字是/var/mysql/mysql.sock。所以我把" socket = / var / mysql / mysql.sock"在/etc/my.cnf中,删除了/ var / mysql中的符号链接,并重新启动了mysql和apache。套接字在/ var / mysql中。现在,使用mysqli()的web应用程序不再有效,但使用mysql()的应用程序也不行!

所以我很困惑。特别是因为在我完成mysql数据目录的转储/初始化/恢复之前它一切正常。

提前感谢您提供的任何建议!

(是的,我知道mysql()已经被弃用了,但我确实把#5.3; PHP 5.3.8"放在了前面。感谢所有没有回答这个问题的人指出一个人不应该使用已弃用的代码进行新开发。现在,如果你非常聪明,那就试着回答这个问题吧!我有遗留代码要维护!)

2 个答案:

答案 0 :(得分:2)

在这种情况下,它是套接字位置。

虽然我提到在/etc/php.ini中放置正确的套接字位置,但phpinfo()中的其他内容引起了我的注意:"扫描此目录以获取其他.ini文件:/ usr / local / php5 / php .D&#34 ;.这显然是在读取主/etc/php.ini文件后完成的。啊。

所以我进去了,果然,那里有一个文件将mysql(但不是mysqli)的套接字设置到错误的位置。双啊。

我编辑了违规文件以指向/tmp/mysql.sock,并且" apachectl优雅"和中提琴! (或者对于那些不喜欢弦乐器的人来说,瞧!)它又有效了!

我不知道为什么既不创建硬链接也不创建这两个位置之间的符号链接(如我的问题所解释)修复了问题,我也不知道为什么简单地转储/恢复我的数据库会导致事情经过多年的努力,它已经成功了。我所知道的就是追捕并改变坏的插座位置固定的东西。

因此,如果您遇到一个界面而不是另一个界面的问题,请务必仔细阅读phpinfo(),并检查所有修改php运行状态的位置, 不仅仅是 /etc/php.ini。

非常感谢您提供深思熟虑且乐于助人的评论!

答案 1 :(得分:0)

  

警告此扩展在PHP 5.5.0中已弃用,已被删除   在PHP 7.0.0中。相反,MySQLi或PDO_MySQL扩展应该是   用过的。另请参见MySQL:选择API指南。该功能的替代方案包括:

使用MySQLiPDO

mysqli_connect()

PDO::__construct()