#php #mysql
#php #mysql — сервер #mysql
Вопрос:
У меня есть PHP-скрипт, который вставляет запись в базу данных после получения данных из заполненной пользователем формы. Я разработал на своем локальном компьютере (сервер WAMP) и в моем PHP-скрипте есть следующий код:
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
//connecting to db
mysql_connect("host", "user", "pass") or die('save_failed');
mysql_select_db("db") or die('save_failed');
//inserting into table
mysql_query("INSERT INTO table(name, email) VALUES('" . $name . "', '" . $email . "' ) ")
or die('save_failed');
Скрипт работал так, как ожидалось, и записи были успешно вставлены в таблицу.
Как только я перенес скрипт на свой веб-сервер, я понял, что значения, хранящиеся в базе данных, были пустыми строками. Удаление mysql_real_escape_string
исправило это.
Почему это mysql_real_escape_string
не будет работать на моем веб-сервере?
База данных, над которой я работаю, не изменилась. Даже при локальной разработке я попадал в базу данных своего веб-сервера. Версия PHP на localhost равна 5.3.8, а на веб-сервере — 5.2.
Не поддерживает ли PHP 5.2 mysql_real_escape_string
, и если да, то какова альтернатива?
Комментарии:
1. Почему вызываются все сообщения об ошибках
save_failed
? Как вы определяете, был ли сбой соединения, инструкции select database или запроса insert?2. Я не слишком беспокоюсь об этом, потому что эти ошибки должны регистрироваться в файлах журнала php (если я не ошибаюсь).
Ответ №1:
Поставьте mysql_connect("host", "user", "pass") or die('save_failed');
перед mysql_real_escape_string
.
Комментарии:
1. о, вау … да. понятия не имел, что функция зависит от подключения к mysql. Спасибо.
Ответ №2:
Сначала вам нужно подключиться к базе данных, затем mysql_real_escape
к вашим строкам. Я подозреваю, что это работает локально, потому что PHP и ваша база данных настроены таким образом, что они могут автоматически устанавливать соединение при необходимости.
http://www.php.net/mysql_real_escape_string
Если идентификатор ссылки не указан, предполагается, что последняя ссылка открыта
mysql_connect()
. Если такая ссылка не найдена, она попытается создать ее, как если быmysql_connect()
была вызвана без аргументов. Если соединение не найдено или не установлено, генерируется ошибкаE_WARNING
уровня.
Очевидно, вам также следует активировать отчеты об ошибках и / или проверить свои журналы ошибок.
Ответ №3:
Со страницы руководства для mysql_real_escape_string():
Параметры
unescaped_string: Строка, которая должна быть экранирована.
link_identifier: Соединение с MySQL. Если идентификатор ссылки не указан, предполагается последняя ссылка, открытая mysql_connect(). Если такая ссылка не найдена, он попытается создать ее, как если бы mysql_connect() был вызван без аргументов. Если соединение не найдено или не установлено, генерируется ошибка уровня E_WARNING.
Ваш код использует mysql_real_escape_string()
перед вызовом mysql_connect()
. Это означает, что PHP пытается открыть соединение с сервером MySQL раньше, чем вы думаете, и вы не предоставляете учетные данные и не выполняете проверку ошибок. Если это работает в вашем окне разработки, это, вероятно, чистая случайность: у вашего локального сервера есть учетные данные по умолчанию в php.ini
или учетная запись MySQL без пароля.
Переместите часть подключения к БД наверх, и все готово.