Я пытаюсь подключиться к моей базе данных MySQL с помощью терминала на своем Apple (с PHP).
Вчера он работал нормально, и теперь я неожиданно получил ошибку в названии.
script работает, когда я использую свой браузер для его запуска (у меня установлен XAMPP), но Terminal отказывается подключиться к БД.
Вот файл, который я включаю для подключения (script работает, когда я не включаю это, но потом он не подключается к БД):
<?php
mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("FNB1C_data") or die(mysql_error());
?>
Это должно работать, поскольку оно работает с моим браузером.
Команда, которую я использую в терминале, PHP скриптname.php
.
По какой-то причине mysql на OS X получает места в файле требуемого сокета немного неправильно, но, к счастью, решение так же просто, как создание символической ссылки.
У вас может быть сокет (отображаемый как файл с нулевой длиной) как /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.
У меня также была эта ошибка, но я мог исправить ее только через предложение здесь.
Подводя итог, используйте:
127.0.0.1
Вместо:
localhost
Причина в том, что "localhost" является специальным именем для драйвера MySQL, заставляя его использовать сокет UNIX для подключения к MySQL вместо сокета TCP.
hosts
, он может отсутствовать или испортиться
У меня была такая же проблема, и я исправил ее:
У меня было это, и это не сработало:
$con = mysql_connect('localhost', 'root', '1234');
Я сделал это, и это сработало:
$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');
Вместо использования сервера mysql я подключился непосредственно к Unix Socket. Работал для меня.
Сокет MySQL находится, в общем, в /tmp/mysql.sock
или /var/mysql/mysql.sock
, но, вероятно, PHP выглядит не в том месте.
Проверьте, где находится ваш сокет:
sudo /usr/libexec/locate.updatedb
Когда updateb завершается:
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
php.ini.default
в php.ini
.
Я на XAMPP на Mac OS X, а решение Брайана Лоу выше работало с небольшой модификацией.
Файл 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
Mac OS X EL Capitan + MAMP Pro Сделайте это
cd /var
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock
Тогда сделайте это
cd /tmp
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock
Надеюсь, это сэкономит вам некоторое время.
mysql.dock
в /tmp
который решил это. Спасибо!
Причина в том, что php не может найти правильный путь mysql.sock
.
Пожалуйста, убедитесь, что ваш mysql работает в первую очередь.
Затем, пожалуйста, подтвердите, какой путь находится mysql.sock
, например /tmp/mysql.sock
затем добавьте эту строку пути в php.ini:
Наконец, перезапустите Apache.
Если у вас возникла следующая проблема:
Ошибка металокации PHP "Предупреждение: mysql_connect() http://function.mysql-connect: 2002 Нет такого файла или каталога (попытка подключения через unix:///tmp/mysql.sock)"
Задайте значение "mysql.default_socket" в /etc/php.ini
до
"mysql.default_socket = /var/mysql/mysql.sock".
Затем перезапустите веб-службу в сервере admin
Исправить нависшую ошибку сокета 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/
У меня была такая же проблема
[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
При установке 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 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
Другим решением является исправление местоположения сокета в файле конфигурации php.ini следующим образом:
pdo_mysql.default_socket=/tmp/mysql.sock
Конечно, символическая ссылка тоже работает, поэтому ее предпочтение зависит от того, что вы меняете.
Поскольку вы можете использовать MAMP, либо измените свой порт на 3306 по умолчанию, либо используйте 127.0.0.1 в database.php
$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
);
Вы можете сделать это, просто наложив MAMP php на терминал Apple:
alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'
Пример: > phpmamp - v
Теперь вы можете запускать что-то вроде: > phpmamp scriptname.php
Примечание. Это будет применяться только для текущего сеанса терминала.
У меня была эта проблема, но она появилась только при загрузке определенных страниц (другие страницы работали нормально). Оказалось, что я звонил в MySQL после того, как я закрыл соединение с mysql_close()
. Итак, как сказал @brucenan: убедитесь, что MySQL работает, когда вы вызываете его.
У меня были те же ошибки. Mysql запускался как отдельное приложение, прежде чем я начал phpMyAdmin.
Я просто остановил mysql затем sudo/Приложения/XAMPP/xamppfiles/xampp stop sudo/Приложения/XAMPP/xamppfiles/xampp start
Он отлично работал