mysql_real_escape_string работает на локальном хосте, но не на веб-сервере

#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 без пароля.

Переместите часть подключения к БД наверх, и все готово.