【问题标题】:PHP interafce mysql() not working, but mysqli() is working; why?PHP interafce mysql() 不工作,但 mysqli() 工作;为什么?
【发布时间】:2016-03-28 08:28:40
【问题描述】:

概要:转储/恢复后无法再从 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 CLI 工作的登录凭据在 mysql_connect() 中失败。但是 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() 的 web 应用程序也不再运行!

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

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

(是的,我知道 mysql() 已被弃用,但我确实将“PHP 5.3.8”放在前面。感谢所有没有回答问题的人指出不应使用已弃用的代码新的开发。现在,如果你这么聪明,让我们试着回答这个问题吧!我有遗留代码要维护!)

【问题讨论】:

标签: php mysql mysqli mariadb


【解决方案1】:

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

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

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

我编辑了有问题的文件以指向 /tmp/mysql.sock,并做了“apachectl graceful”,中提琴! (或者对于那些不喜欢弦乐器的人,瞧!)它再次起作用了!

我不知道为什么在这两个位置之间既不创建硬链接也不创建符号链接(如我的问题中所解释的那样)解决了问题,我也不知道为什么我的数据库的简单转储/恢复会导致问题打破,经过多年拥有它的方式。我所知道的是,寻找并更改错误的套接字位置可以解决问题。

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

非常感谢周到和乐于助人的 cmets!

【讨论】:

    【解决方案2】:

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

    使用MySQLiPDO

    mysqli_connect()
    
    PDO::__construct()
    

    【讨论】:

    • 换句话说; “谁在乎为什么,你必须切换,所以这样做!”。
    • 这是粗鲁无益的。是的,我需要切换。不,在我能让事情按原样工作之前,我不会这样做。任何专业的程序员都知道,当你遇到问题时,你一次只改变一件事,直到你解决它。任何为维护遗留代码而获得报酬的人都知道,当您遇到问题时,您不会到处升级。
    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多