3

У меня есть этот код на моем ПК (Windows), вызывающий базу данных из виртуальной машины Ubuntu с сетью только для хоста. Я использую VirtualBox для Ubuntu Machine

$ipHost = "xxx.xxx.x.xxx";
$nombreUsuario = "rootpi";
$passUsuario = "rootpi";
$bddNombre = "tienda";

$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);

if ($conexion->connect_error) {
    die("Conexión fallida: " .$conexion->connect_error);
}

$sql = "SELECT id, name, address, image FROM people";
$result = $conexion->query($sql);

if ($result->num_rows > 0 ) {
    //Stuff...
}

Этот код работает нормально. Соединение установлено и показывает результат на моей странице PHP на сервере Apache. Моя основная задача - передать файлы на мою виртуальную машину Ubuntu 14.04 в каталоге /var/www/html с помощью WinSCP и вызвать их оттуда.

Единственная строка, которую мне нужно изменить, - это переменная $ ipHost от ip до localhost:

$ipHost = "xxx.xxx.x.xxx"; -> $ipHost = "localhost";

Но это не работает. Я попытался повторить после:

$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);

Но это не показывает эхо после него.

У меня установлен MySQL в Ubuntu, также пакет php5 php5-mcrypt .

Мои версии PHP:

Windows: PHP версии 5.6.3 - Ubuntu: PHP версии 5.5.9-1ubuntu4.5

1 ответ1

1

Итак, вы в основном говорите, что когда вы подключаетесь через IP-адрес к Ubuntu MySQL, вы можете подключиться, но когда вы находитесь на localhost вы не можете исправить?

Это может быть проблемой с привязкой грантов MySQL к IP-адресу. Но неясно. Я бы сделал следующее для отладки.

Во-первых, основы.

Прежде всего, вы говорите, что у вас установлены php5 и php5-mcrypt . Но как насчет php5-mysql? Что-то простое может вызвать у вас головную боль. Просто запустите эту строку:

sudo aptitude install php5-mysql

И как только это будет установлено, перезапустите Apache следующим образом:

sudo service apache2 restart

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

Далее, проверьте, как связаны сети MySQL.

Если на вашей системе Ubuntu установлена nmap , войдите в командную строку в Ubuntu и выполните следующую команду:

nmap localhost -p 3306

Если у вас не установлен nmap , просто запустите следующую команду, чтобы установить его; это хороший простой сетевой инструмент отладки, все настройки должны быть установлены по умолчанию:

sudo aptitude install nmap

Это скажет вам, если порт MySQL (3306) на вашем компьютере открыт или нет. Например, я только что сделал это на тестовой установке Ubuntu 12.04, которую я имею, и вот ответ, который я получаю:

Starting Nmap 5.21 ( http://nmap.org ) at 2014-11-30 01:29 EST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000070s latency).
PORT     STATE SERVICE
3306/tcp open  mysql

Это говорит о том, что порт MySL (3306) на моем localhost хосте открыт. Если это показывает, что закрыто, это может быть проблемой, и я открою my.cnf в системе Ubuntu и поищу bind-address . Мне нравится использовать nano поэтому эту команду я бы использовал:

sudo nano /etc/mysql/my.cnf

А при не сетевой установке MySQL настройка bind-address будет следующей:

bind-address            = 127.0.0.1

Это заставит привязку быть только localhost (127.0.0.1). Но если вы говорите, что можете подключиться к базе данных MySQL с хост-компьютера Windows, это может быть установлено на IP-адрес VirtualBox, как здесь; используя псевдо-пример с поддельным IP-адресом:

bind-address            = 123.456.789.0

И это определенно позволило бы хосту Windows подключаться, но - и это очень важно - но это позволило бы подключаться только через 123.456.789.0 .

Поэтому лучший способ разрешить Windows, а также Ubuntu использовать сервер MySQL в этой настройке VirtualBox - это закомментировать строку bind-address следующим образом:

# bind-address            = 123.456.789.0

А затем перезапустите MySQL следующим образом:

sudo service mysql restart

После этого ваш MySQL будет доступен в Ubuntu через localhost а также на вашем компьютере с Windows через IP-соединение. Это в основном позволяет любому сетевому соединению в мире подключаться к этой машине. Что не очень хорошо для реального производственного сервера, но для локализованной настройки тестирования / разработки это должно быть хорошо.

Теперь проверьте, как настроены гранты MySQL для пользователя базы данных.

Теперь, если эта первая часть в основном показала вам, что у вас есть успешное сетевое взаимодействие между мирами Ubuntu и Windows, но вы все еще не можете подключиться, следующая проблема может быть связана с MySQL GRANTS которые в основном являются разрешениями пользователя в MySQL.

Чтобы проверить гранты вашего пользователя, вы должны сначала войти в MySQL как привилегированный пользователь и выполнить эту команду для подключения к базе данных ядра mysql :

CONNECT `mysql`;

А затем выполните эту команду, чтобы увидеть, каких пользователей / хостов вы настроили:

SELECT `user`, `host` from `user`;

Вывод при базовой установке MySQL должен выглядеть примерно так, если у вас есть только root установка:

+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | 127.0.0.1 |
| root             | ::1       |
| debian-sys-maint | localhost |
| root             | localhost |
+------------------+-----------+

Конечно, ваш список может отличаться от моего, так что имейте это в виду. Но ключ в том, что вы должны увидеть что-то подобное. Обратите внимание , как root имеет три различные записи в user один для 127.0.0.1 (IPv4 - адрес), ::1 (IPv6 - адрес) и localhost ( для чтения человека имени хоста). Это ключ здесь.

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

Делать что-то подобное довольно легко. Некоторым людям нравится отбрасывать все гранты пользователю в такой среде разработки:

GRANT ALL PRIVILEGES ON `some_database`.* TO 'some_user'@'localhost';

Но мне это не нравится по многим причинам. Я предпочитаю использовать довольно безопасный, безопасный и стандартный набор грантов для пользователей MySQL, который позволяет им делать то, что им нужно, в своей базе данных, но запрещает привилегии root, как это:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `some_database`.* TO 'some_user'@'localhost';

Конечно, измените some_database и some_user в соответствии с вашими настройками. Но после выполнения одной из этих команд GRANT , вы должны указать MySQL перезагрузить привилегии следующим образом:

FLUSH PRIVILEGES;

И теперь, если вы запускаете SHOW GRANTS для этого пользователя, вы можете видеть все его права, как вы их установили:

SHOW GRANTS FOR 'some_user'@'localhost';

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

Наконец, проверьте соединение из командной строки.

А теперь, чтобы проверить соединение из командной строки Ubuntu 14.04, просто введите следующую команду:

mysql -u some_user -p

Конечно, измените some_user в соответствии с вашим пользователем, а затем введите свой пароль. Теперь вы должны быть подключены к MySQL через этого пользователя. Если вы можете успешно подключиться через командную строку, то вы знаете, что работа с сетями / соединениями MySQL работает хорошо. Так что все, что может быть связано с вашим PHP-кодированием. И это действительно нечто, выходящее за рамки простого ответа на этом сайте; вам нужно отладить свой локальный код PHP самостоятельно, чтобы решить это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .