我已将 PushChatServer 目录放入 htdocs 文件夹中并创建数据库 puschat 尝试运行 @"http://localhost/PushChatServer/api/test/database.php"
然后我遇到了以下异常。
我想做同样的事情来解释这个链接http://www.raywenderlich.com/32963/apple-push-notification-services-in-ios-6-tutorial-part-2
我已经完成了所有这些,但我得到了这个例外
无法连接到数据库。原因:异常“PDOException”,消息“SQLSTATE[HY000] [2002] /Applications/MAMP/htdocs/PushChatServer/api/test/database.php:17 中没有此类文件或目录”堆栈跟踪:#0 /Applications/MAMP /htdocs/PushChatServer/api/test/database.php(17): PDO->__construct('mysql:host=loca...', 'root', 'root', Array) #1 {main}
您需要将主机从
localhost
更改为 127.0.0.1
Laravel 4:在您的
app/config/database.php
中尝试将主机从 localhost
更改为 127.0.0.1
Laravel 5:在
.env
文件中,将 DB_HOST
从 localhost
更改为 127.0.0.1
快速测试(在 shell 中运行):
php -r "new PDO('mysql:host=localhost;dbname=test', 'username', 'password');"
SQLSTATE[HY000] [2002] No such file or directory 表示 php 找不到 mysql.default_socket 文件。通过修改 php.ini 文件修复它。在 Mac 上,它是 mysql.default_socket = /tmp/mysql.sock (参见 MySQL 连接不工作:2002 没有这样的文件或目录)
SQLSTATE[HY000] [1044] 用户“用户名”@“localhost”的访问被拒绝 恭喜!您现在拥有正确的 mysql.default_socket 设置。修复您的数据库名/用户名/密码。
我在使用 PHP 5.6.30 (macOS Sierra) 时遇到了同样的错误,简单的 PDO 代码如下:
$pdo = new PDO('mysql:host=localhost;dbname=db_php', 'root', '');
我收到了同样的错误消息。为了解决这个问题,我在代码中将“localhost”更改为 IP(环回)“127.0.0.1”:
$pdo = new PDO('mysql:host=127.0.0.1;dbname=db_php', 'root', '');
测试连接:
$ php -r "new PDO('mysql:host=127.0.0.1;dbname=db_php', 'root', '');"
这个作品适合我!
PDO 对待 localhost 非常特别:
来自 http://php.net/manual/en/ref.pdo-mysql.connection.php:
注意:仅限 Unix:当主机名设置为“localhost”时,则 与服务器的连接是通过域套接字建立的。如果 PDO_MYSQL 是 针对 libmysqlclient 编译,然后是套接字文件的位置 位于 libmysqlclient 的编译位置。如果编译了PDO_MYSQL 针对 mysqlnd,可以通过以下方式设置默认套接字 pdo_mysql.default_socket 设置。
这就是为什么 PDO 和 mysql_connect 将为 localhost 提供不同的行为。
因此,如果您想使用带有 PDO 的 TCP 连接,切勿使用 localhost,而应使用 127.0.0.1。
重新启动数据库和本地 Web 服务器:
sudo service mysqld restart
应该可以!
我不确定这是否适合您;但我使用 CakePHP,每当我忘记将端口号放在“主机”末尾时,就会收到此错误。
希望这有帮助!
之前
'test' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
'username' => 'root',
'password' => 'root',
'database' => 'mylogin',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
'log' => false,
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
'url' => env('DATABASE_TEST_URL', null),
]
之后
'test' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost:8080',
'username' => 'root',
'password' => 'root',
'database' => 'mylogin',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
'log' => false,
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
'url' => env('DATABASE_TEST_URL', null),
]
我对 Mysql PDO 也有同样的错误,这段代码对我有用!
<?php
$dsn = 'mysql:host=127.0.0.1;dbname=testdb';
$username = 'username';
$password = 'password';
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
$dbh = new PDO($dsn, $username, $password, $options);
?>
从以下位置获取此代码:http://php.net/manual/en/ref.pdo-mysql.connection.php
在 shell 中运行以下命令,我认为会有帮助。
php artisan cache:clear
php artisan config:clear
php artisan view:clear
在 Mac OSX/MAMP 上,您可能会在 /Applications/MAMP/tmp/mysql 文件夹中找到 mysql.sock.lock 文件。
您可以安全地删除文件 mysql.sock.lock 并且您应该处于良好状态。
很高兴报告 PDO 套接字现在可以直接在 /etc/php.ini 中调整,尽管旧的来源表明它只能在编译 php/pdo 时指定:
[Pdo_mysql]
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
[MySQLi]
mysqli.default_socket = /var/run/mysqld/mysqld.sock
[MySQL]
mysql.default_socket = /var/run/mysqld/mysqld.sock
刚刚遇到了同样的问题,问题是密码。在教程中,作者将密码列出为:
"d]682\#%yl1nb3"
因此,根据@Marki555给出的建议,我查看了配置文件 - api_config.php。那里列出的密码是:
"d]682\#%yI1nb3"
大写“I”是导致问题的原因,因为您在数据库上为用户设置的密码具有小写l的密码,但它实际上正在寻找大写I。在我将pushchat用户的密码更改为大写后我,成功了!