Я учу PHP+MySQL. Воспользовался бесплатным хостингом www.awardspace.com. Создал там свой субдомен narrowaymyst.awardspace.info и базу narrowaymyst_01
С помощью phpMyAdmin создал таблицу Logs.
Затем создал файлик LogsWork.php примерно такого содержания:
<?php
error_reporting( E_ALL & E_STRICT );
// Константы (пока все вместе)
$c_hostname = "82.197.131.27";
$c_username = "narrowaymyst_01";
$c_password = "*******";
$c_dbName = "narrowaymyst_01";
/* создать соединение */
mysql_connect($с_hostname,$с_username,$с_password) or die("<span id=result>Ошибка</span>! Не удалось создать соединение: " . mysql_error());
echo "Соединение установлено.";
/* выбрать базу данных. Если произойдет ошибка - вывести ее */
mysql_select_db($с_dbName) or die("<span id=result>Ошибка</span>! Не удалось выбрать БД: " . mysql_error());
echo "База данных выбрана.";
if ($_POST['command'] = 'addLog') {
/* составить запрос для вставки информации в таблицу */
$time = strPOST('time');
$type = strPOST('type','s'); //s(simple) - простое сообщение
//e(error) - сообщение об ошибке
//b(begin) - начальное сообщение уровня
//f(finish) - конечное сообщение уровня
$level = intPOST('level');
$msg = strPOST('msg');
$sql = "INSERT INTO `Logs` (`time`, `type`, `level`, `msg`, `id`) "
."VALUES ('$time', '$type', '$level', '$msg', '')";
/* Выполнить запрос. Если произойдет ошибка - вывести ее. */
mysql_query($sql) or die("<span id=result>Ошибка</span> при выполнении запроса: " . mysql_error());
echo "<span id=result>OK</span>. Лог добавлен.";
} else {
echo "<span id=result>Нет</span> команд на выполнение.";
}
?>
В результате посещения страницы http://narrowaymyst.awardspace.info/LogsWork.php в любом браузере получаю такое сообщение:
Ошибка! Не удалось создать соединение: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Подскажите где искать проблему, и как ее исправить?
Спустя 6 минут, 19 секунд (26.07.2010 - 00:58) Ice написал(а):
Цитата (DiamondeX @ 26.07.2010 - 01:52) |
server through socket |
Сокет предполагает не только айпишник, но и порт, через который он устанавливается. Я не думаю что сервер БД находится на 80 порту.
Цитата (PHP Manual @ 26.07.2010 - 01:58) |
Замечание: При указании параметру server значения "localhost" или "localhost:port" клиентская библиотека MySQL будет пытаться соединиться с локальным сокетом. Если вы всё же хотите использовать TCP/IP, используйте адрес "127.0.0.1" вместо "localhost". Если клиентская библиотека пытается подключиться не к тому локальному сокету, это можно исправить через указание директивы mysql.default_host в конфигурации PHP, после чего можно оставлять параметр server пустым. Поддержка указания порта через ":port" была добавлена в PHP 3.0B4. Поддержка указания локального сокета как ":/path/to/socket" была добавлена в PHP 3.0.10. Подавить вывод ошибок можно добавив @ в начало названия функции (@mysql_connect()) |
Спустя 5 минут, 23 секунды (26.07.2010 - 01:03) DiamondeX написал(а):
Наверно вы правы. А как узнать этот самый порт?
Спустя 1 минута, 2 секунды (26.07.2010 - 01:04) Ice написал(а):
Связаться с техподдержкой, наверное, или в настройках глянуть. Не юзал, не в курсе, к сожалению.
Спустя 12 минут, 9 секунд (26.07.2010 - 01:17) DiamondeX написал(а):
Я посмотрел в их phpInfo: по-умолчанию используется порт 3306 (видимо как обычно).
mysql.default_port | 3306 | 3306
Там же прописан и этот "сокет":
mysql.default_socket | /var/run/mysqld/mysqld.sock | /var/run/mysqld/mysqld.sock
Не знаете, что значит этот сокет, и как он вообще используется/настраивается? Что можно почитать на эту тему (если уж на то пошло)?
mysql.default_port | 3306 | 3306
Там же прописан и этот "сокет":
mysql.default_socket | /var/run/mysqld/mysqld.sock | /var/run/mysqld/mysqld.sock
Не знаете, что значит этот сокет, и как он вообще используется/настраивается? Что можно почитать на эту тему (если уж на то пошло)?
Спустя 5 минут, 22 секунды (26.07.2010 - 01:22) Ice написал(а):
Сокет, слово не страшное. Другими словами, сокет - это соединение, установленное между машинами. Всё, что нужно для его настройки - это IP и порт.
Моя настольная книга - мануал, и, собственно, что там говорится по этому поводу:
Моя настольная книга - мануал, и, собственно, что там говорится по этому поводу:
Цитата |
mysql_connect (PHP 4, PHP 5) mysql_connect — Открывает соединение с сервером MySQL Описание resource mysql_connect ([ string $server [, string $username [, string $password [, bool $new_link [, int $client_flags ]]]]] ) Возвращает указатель на соединение с MySQL в случае успешного выполнения, или FALSE при неудаче. mysql_connect() устанавливает соединение с сервером MySQL. Следующие значения по умолчанию установлены для отсутствующих параметров: server = 'localhost:3306', username = имя пользователя владельца процесса сервера и password = пустой пароль. Параметр server может также включать номер порта, к примеру "hostname:port" или путь к сокету, к примеру ":/path/to/socket" для локального сервера. Замечание: При указании параметру server значения "localhost" или "localhost:port" клиентская библиотека MySQL будет пытаться соединиться с локальным сокетом. Если вы всё же хотите использовать TCP/IP, используйте адрес "127.0.0.1" вместо "localhost". Если клиентская библиотека пытается подключиться не к тому локальному сокету, это можно исправить через указание директивы mysql.default_host в конфигурации PHP, после чего можно оставлять параметр server пустым. Поддержка указания порта через ":port" была добавлена в PHP 3.0B4. Поддержка указания локального сокета как ":/path/to/socket" была добавлена в PHP 3.0.10. Подавить вывод ошибок можно добавив @ в начало названия функции (@mysql_connect()) Если второй вызов функции произошёл с теми же аргументами mysql_connect(), новое соединение не будет установлено. Вместо этого функция вернёт ссылку на уже установленное соединение. Параметр new_link может заставить функцию mysql_connect() открыть ещё одно соединение, даже если соединение с аналогичными параметрами уже открыто. Параметр client_flags должен быть комбинацией из следующих констант: MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE, MYSQL_CLIENT_INTERACTIVE. Замечание: Параметр new_link добавлен в PHP 4.2.0 Параметр client_flags добавлен PHP 4.3.0 Соединение с сервером будет закрыто при завершении исполнения скрипта, если до этого оно не будет закрыто с помощью функции mysql_close(). |
Спустя 10 минут, 28 секунд (26.07.2010 - 01:32) Guest написал(а):
Цитата (Ice @ 25.07.2010 - 22:22) |
Параметр server может также включать номер порта, к примеру "hostname:port" или путь к сокету, к примеру ":/path/to/socket" для локального сервера. ... Если клиентская библиотека пытается подключиться не к тому локальному сокету, это можно исправить через указание директивы mysql.default_host в конфигурации PHP, после чего можно оставлять параметр server пустым. ... Поддержка указания локального сокета как ":/path/to/socket" была добавлена в PHP 3.0.10. |
Ну, через указание директивы mysql.default_host в конфигурации PHP у меня не получится исправить положение - это запрещено правилами хостинга. Вопрос теперь, как узнать мой сокет? или как предотвратить использование сокета по умолчанию, который, видимо, не ведет к нужному серверу бд? можно ли как-то указать пустой сокет, вроде ":/"?
Спустя 1 минута, 27 секунд (26.07.2010 - 01:34) DiamondeX написал(а):
На всяк случай: предыдущий пост от Guest - мой

Спустя 4 минуты, 57 секунд (26.07.2010 - 01:39) Ice написал(а):
Цитата (Guest @ 26.07.2010 - 02:32) |
можно ли как-то указать пустой сокет, вроде ":/" |
Две составляющие сокета? (неужели зря все говорил)
Можно вообще не указывать порт, но тогда он будет выставлен по умолчанию - 3306 (а не 80 - я ошибся, конечно же 3306).
Наверняка, порт можно узнать у техподдержки хостинга, иначе что ж за хостинг такой, у которого техподдержки нет.
Спустя 23 минуты, 45 секунд (26.07.2010 - 02:03) DiamondeX написал(а):
Нет, говорил не зря. Просто было не понятно, почему он пытается где-то там найти сокет, когда он задан явно?
Как оказалось (та самая техподдержка среагировала), необходимо в качестве параметров указывать именно строковые константы, а не переменные, содержащие эти константы. То есть вместо
просто писать
Сейчас пытаюсь уточнить в чем причина таких правил...
Как оказалось (та самая техподдержка среагировала), необходимо в качестве параметров указывать именно строковые константы, а не переменные, содержащие эти константы. То есть вместо
$c_hostname = "82.197.131.27";
$c_username = "narrowaymyst_01";
$c_password = "*******";
/* создать соединение */
mysql_connect($с_hostname,$с_username,$с_password) or die("<span id=result>Ошибка</span>! Не удалось создать соединение: " . mysql_error());
просто писать
/* создать соединение */
mysql_connect("82.197.131.27","narrowaymyst_01","*******") or die("<span id=result>Ошибка</span>! Не удалось создать соединение: " . mysql_error());
Сейчас пытаюсь уточнить в чем причина таких правил...
Спустя 15 минут, 10 секунд (26.07.2010 - 02:18) Guest написал(а):
Снова оч. быстро ответили:
Цитата |
It could be just because your variables contain the symbol _ or something like that, anyway there is no strict rule that you have to put your database connection details in the mysql_connect() function in order to work. |
или по-русски
Цитата |
Это могло произойти просто из-за использования символа _ в переменных или чего-то подобного, в любом случае, нет строгого правила помещать детали соединения с базой данных в вызов функции mysql_connect(), чтобы обеспечить работоспособность. |
Спустя 1 минута, 10 секунд (26.07.2010 - 02:19) DiamondeX написал(а):
Опять забыл ник свой указать в предыдущем посте
