我正在尝试使用Apple上的终端(使用PHP)连接到我的MySQL数据库。
昨天它工作正常,现在我突然收到标题中的错误。
当我使用浏览器运行它时(我安装了XAMPP),脚本可以工作,但是终端拒绝连接到数据库。
这是我要连接的文件(当我不包含此脚本时,脚本可以工作,但它不会连接到数据库):
<?php
mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("FNB1C_data") or die(mysql_error());
?>
这应该可行,因为它适用于我的浏览器。
我在终端使用的命令是php scriptname.php
。
答案 0 :(得分:412)
由于某些原因,OS X上的mysql获取所需套接字文件的位置有点不对,但幸好解决方案就像设置符号链接一样简单。
您可能有一个套接字(显示为零长度文件)为/tmp/mysql.sock
或/var/mysql/mysql.sock
,但是一个或多个应用正在查找其他位置。找出这个命令:
ls -l /tmp/mysql.sock /var/mysql/mysql.sock
而不是移动套接字,编辑配置文件,并且必须记住将编辑后的文件保留在本地并远离路径正确的服务器,只需创建符号链接,以便Mac找到所需的套接字,即使它正在查找错误的地方!
如果您有/tmp/mysql.sock
但没有/var/mysql/mysql.sock
,那么......
cd /var
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /tmp/mysql.sock mysql.sock
如果您有/var/mysql/mysql.sock
但没有/tmp/mysql.sock
,那么......
cd /tmp
ln -s /var/mysql/mysql.sock mysql.sock
您将需要权限来创建目录和链接,因此如果需要,只需在上面添加sudo命令。
答案 1 :(得分:358)
我也遇到了这个错误,但只能通过建议here修复它。
总结一下,使用:
127.0.0.1
而不是:
localhost
原因是“localhost”是MySQL驱动程序的特殊名称,它使用UNIX套接字连接到MySQL而不是TCP套接字。
答案 2 :(得分:23)
我遇到了同样的问题,这就是我修复它的方法:
我有这个并且它不起作用:
$con = mysql_connect('localhost', 'root', '1234');
我做到了这一点并且有效:
$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');
我没有使用mysql服务器,而是直接连接到Unix Socket。为我工作。
答案 3 :(得分:21)
MySQL套接字通常位于/tmp/mysql.sock
或/var/mysql/mysql.sock
中,但可能PHP查找错误的位置。
检查套接字的位置:
sudo /usr/libexec/locate.updatedb
当updatedb终止时:
locate mysql.sock
然后找到你的php.ini:
php -i | grep php.ini
这将输出如下内容:
Configuration File (php.ini) Path => /opt/local/etc/php54
Loaded Configuration File => /opt/local/etc/php54/php.ini
编辑你的php.ini
sudo vim /opt/local/etc/php54/php.ini
更改行:
pdo_mysql.default_socket=/tmp/mysql.sock
mysql.default_socket=/tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock
其中/tmp/mysql.sock是套接字的路径。
保存修改并退出ESC + SHIFT:x
重启Apache
sudo apachectl stop
sudo apachectl start
答案 4 :(得分:11)
我在Mac OS X上使用XAMPP, Brian Lowe上面的解决方案稍作修改。
mysql.sock文件实际位于“/ Applications / xampp / xamppfiles / var / mysql /”文件夹中。所以不得不在/ tmp和/ var / mysql中将它链接起来。我没有检查PHP命令行使用哪一个,但是这样做了修复,所以我很高兴: - )
sudo su
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock
mkdir /var/mysql
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /var/mysql/mysql.sock
答案 5 :(得分:10)
Mac OS X EL Capitan + MAMP Pro 这样做
tac <file> | sed -n '/ENTRY/q;p' | tac
然后这样做
p
希望这可以节省你一些时间。
答案 6 :(得分:6)
原因是php无法找到mysql.sock
的正确路径。
请确保您的mysql首先运行。
然后,请确认mysql.sock
位于哪个路径,例如/tmp/mysql.sock
然后将此路径字符串添加到php.ini:
最后,重启Apache。
答案 7 :(得分:6)
当您遇到以下问题时:
PHP抛出错误“警告:mysql_connect()http://function.mysql-connect:2002没有这样的文件或目录(尝试通过unix:///tmp/mysql.sock进行连接)”
将/etc/php.ini
中的“mysql.default_socket”值设置为
"mysql.default_socket = /var/mysql/mysql.sock".
然后在服务器管理中重新启动Web服务
答案 8 :(得分:2)
修复迫在眉睫的2002套接字错误 - 这是MySQL放置套接字的位置和OSX认为它应该在哪里,MySQL将它放在/ tmp中,OSX在/ var / mysql中查找它,套接字是一种文件类型允许mysql客户端/服务器通信。
sudo mkdir /var/mysql
然后
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock
来源:http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/
答案 9 :(得分:1)
当您使用port安装php53-mysql时,它返回以下消息,这是此问题的解决方案:
To use mysqlnd with a local MySQL server, edit /opt/local/etc/php53/php.ini
and set mysql.default_socket, mysqli.default_socket and
pdo_mysql.default_socket to the path to your MySQL server's socket file.
For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock
答案 10 :(得分:1)
另一个解决方案是在php.ini配置文件中修复套接字位置,如下所示:
pdo_mysql.default_socket=/tmp/mysql.sock
当然,符号链接也有效,所以你需要更改哪一个。
答案 11 :(得分:1)
我遇到了同样的问题
<强> [PDOException] SQLSTATE [HY000] [2002]没有这样的文件或目录
<强> [ErrorException] 警告:PDO :: __ construct():[2002]没有这样的文件或目录(试图通过unix:///var/mysql/mysql.sock连接)... htdocs / Symfony / vendor / doctrine-dbal / lib / Doctrine /DBAL/Driver/PDOConnection.php
因此解决方案是对sock文件进行符号链接,从而解决问题。请执行以下操作以解决此问题:
$ sudo mkdir / private / var / mysql /
$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /private/var/mysql/mysql.sock
答案 12 :(得分:0)
我得到了同样的错误。 在我启动phpMyAdmin之前,Mysql作为一个独立的应用程序运行。
我刚刚停止了mysql 然后 sudo / Applications / XAMPP / xamppfiles / xampp stop sudo / Applications / XAMPP / xamppfiles / xampp start
工作正常
答案 13 :(得分:0)
我刚遇到这个问题,但只在加载某些页面时出现(其他页面工作正常)。事实证明,在我关闭与mysql_close()
的连接后,我正在调用MySQL。所以,正如@brucenan所说:确保MySQL在你调用时正在运行。
答案 14 :(得分:0)
你可以通过简单地在Apple终端上混淆MAMP php来实现它:
alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'
示例:> phpmamp - v
现在您可以运行类似:> phpmamp scriptname.php
注意:这仅适用于当前的终端会话。
答案 15 :(得分:0)
由于您可能使用MAMP,请将您的端口更改为默认值3306或在database.php中使用127.0.0.1
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',// leave it for port 3306
'username' => 'yourUserhere',
'password' => 'yourPassword',
'database' => 'yourDatabase',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
或使用默认设置:
$db['default'] = array(
'dsn' => '',
'hostname' => '127.0.0.1:8889',// leave it for port 8889
'username' => 'yourUserhere',
'password' => 'yourPassword',
'database' => 'yourDatabase',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
答案 16 :(得分:0)
默认情况下,mySQL客户端尝试通过称为套接字的本地文件进行连接,而不是连接至本地主机的回送地址(127.0.0.1)。
至少在OSX上,此套接字文件的默认位置是/tmp/mysql.sock
。
快速,简便的解决方案
创建一个符号链接,以欺骗操作系统查找正确的套接字。
ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp
正确的解决方案
更改startMysql.sh
中/Applications/MAMP/bin
文件中定义的套接字路径。