2017-02-23 9 views
0

Прошла тонну ответов, но ни одна из них не соответствовала моей проблеме.Проблема подключения к MySQL с mysqli в PHP

У меня есть база данных MySQL, и я пытаюсь подключиться к PHP с помощью mysqli. Код подключения выглядит следующим образом:

<?php 
    if(!isset($_COOKIE["uid"])) { 

      $servername = "localhost"; 
      $username = "study"; 
      $password = "somepassword"; 
      $dbname = "user_study"; 
      $conn = new mysqli($servername, $username, $password, $dbname); 
      if($conn->connect_error){ 
        die("aww"); 
      } 
} 

Однако каждый раз, когда я получаю ошибку

MySQLi :: MySQLi(): (28000/1045): Доступ запрещен для пользователя 'исследование' @» локальный»(используя пароль: ДА)

Я знаю, что пользователь 'study'@'localhost' имеет разрешение на доступ к этой базе данных, потому что я могу получить к нему доступ через командную строку MySQL просто отлично. Я пробовал другие учетные записи, такие как корни с тем же результатом.

Есть ли что-нибудь еще, что я должен проверять?


Новая информация (2/23) Кажется, что даже когда я закрыл базу данных вниз я получаю результат доступ запрещен, а это означает, что, кажется, пытается подключиться к какой-либо другой базе данных на сервере. Как я могу обеспечить его подключение к правильному?

+0

попытайтесь сменить хост с localhost на%. любой хост –

+0

Ничего не изменилось при принятии какого-либо хоста – Firebarrage

+0

Попробуйте следующее: $ con = 'mysqli_connect (" localhost "," my_user "," my_password "," my_db ");' –

ответ

1

Я думаю, что сообщение об ошибке указывает, что PHP смог связаться с MySQL Server с помощью файла сокета. (В противном случае это была бы другая ошибка.)

Существует несколько причин, по которым вы можете получить эту ошибку. Если мы сможем успешно подключиться к серверу MySQL с клиентом командной строки MySQL, как это:

> mysql --no-defaults -h localhost -u study -psomepassword user_study 

Это будет исключать много возможных причин отказа.

Наиболее разумным объяснением сообщения об ошибке с PHP является то, что пароль, предоставленный при попытке подключения с PHP, не соответствует паролю, который ожидает MySQL.


Некоторые идеи, которые мы должны уметь исключать. Привилегии в базе данных user_study предоставлены 'study'@'localhost', например.

GRANT SELECT ON user_study.* TO 'user'@'localhost' 

На совершенно другой галс, учитывая оператор присваивания:

$password = "somepassword"; 

И если предположить, что вы не будет поставлять фактический пароль в вопросе ... мы оставили интересно если действительный пароль содержит символы, подверженные интерпретации строк PHP, такие как символ обратной косой черты или знак доллара.

Для отладки я предлагаю выполнить echo $password; после назначения и убедиться, что испущенная строка является ожидаемой.

Другая возможность заключается в том, что в mysql нет точного соответствия.пользовательская таблица, а пользовательское «исследование» фактически соответствует другому mysql.user ... записи с пустым пользователем ''@'localhost'.

Я бы посмотрел на все записи в таблице mysql.user, где user = 'study' и user = ''.

Я также хочу исключить возможность того, что клиент командной строки mysql использует файл .mylogin.cnf.

Я также испытываю искушение предположить, что изменения были применены к таблице mysql.user, и инструкция FLUSH PRIVILEGES не была выполнена ... но это не приводит к поведению (успешному соединению), наблюдаемому в команде mysql лайн клиента.


Мы предполагаем, что сервер MySQL работает локально на той же машине, на которой выполняется PHP. И мы ожидаем подключения через локальный файл сокета.

В качестве теста я бы посоветовал подключиться через TCP. Указание хоста как 127.0.0.1. Это потребует другой записи в таблице mysql.user. Мы хотели проверить соединение от клиента командной строки MySQL:

> mysql --no-defaults -h 127.0.0.1 -u study -psomepassword user_study 

Но это попадет в целый ряд других проблем конфигурации с MySQL сервером, сети включены, привязать адрес, разрешение имен DNS, прослушивание порта, Iptables, брандмауэр и др.

-

Если проблема была неподдерживаемый протокол аутентификации, я бы ожидать различные ошибки. Если проблема заключалась в невозможности подключения к файлу сокета, я также ожидал бы другую ошибку.

Все обычные причины этой ошибки, по-видимому, исключаются из успешного соединения с клиентом командной строки, запущенного на локальном компьютере, для подключения к тем же учетным данным.

+0

Вы точно верны, что mysql --no-defaults -h localhost -u study -psomepassword user_study терпит неудачу. В настоящее время привилегии на учебу показывают: Гранты для изучения @ localhost ГРАНТ ВСЕ ПРИВИЛЕГИИ НА *. * TO 'study' @ 'localhost' IDENTIFIED BY PASSWORD '* hash' Я уже проверил и очистил всех пользователей '' @ 'localhost' , Тем не менее, я использую файл .cnf из-за ограничений, которые в настоящее время существуют. (На сервере размещаются несколько сайтов). Может ли быть что-то там, вызывающее это? – Firebarrage

+0

Когда вы «очистили» пользователя «@» локального хоста, если вы использовали операции DML, вам необходимо выпустить заявление «FLUSH PRIVILEGES», чтобы эти изменения были эффективными. Я бы сравнил значения хэша пароля. Получите хэш пароля, который вы используете, 'SELECT PASSWORD ('somepassword')' и сравните его с содержимым столбца пароля в mysql.user, чтобы убедиться, что они одинаковы. – spencer7593

+0

Сброшенные привилегии не действуют. Я сравнил хэши паролей, и они совпадают. – Firebarrage

Смежные вопросы