mysql_real_escape_string перестал работать, когда я переместил свой код на другой сервер - PullRequest
1 голос
/ 10 января 2012

Следующий код прекрасно работает в моей локальной установке xampp (Windows 7), но когда я перенес его на сервер Win2K8 R2, фрагмент mysql_real_escape_string не работает. Когда я это комментирую, все работает нормально. Я уверен, что это как-то связано с файлом php.ini, но не могу точно определить, что это такое. Возможно, мой код должен был быть написан по-другому.

function add_asset($asset_type_ID, $org_ID, $asset_desc, $asset_cost, $asset_value, $purchase_date) {
    global $db;
    $asset_desc = mysql_real_escape_string($asset_desc);
    $query = "INSERT INTO assets
                 (asset_ID, asset_type_ID, org_ID, asset_desc, asset_cost, asset_value, purchase_date)
              VALUES
                 (DEFAULT, '$asset_type_ID', '$org_ID', '$asset_desc', '$asset_cost', '$asset_value', '$purchase_date')";
    $add_asset = $db->exec($query);
    $last_asset_ID = $db->lastInsertId();
    return $last_asset_ID;

В частности, когда запись вводится в MySQL, поле asset_desc остается пустым.

Спасибо!

ОБНОВЛЕНИЕ: просмотрев журнал ошибок PHP, я обнаружил следующее:

[ function.mysql-real-escape-string ]: доступ запрещен для пользователя '' @ 'localhost' (с использованием пароля: НЕТ)

Ответы [ 4 ]

1 голос
/ 11 января 2012

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

mysql_real_escape_string() для правильной работы требуется активное соединение MySQL; если вы не подключены к базе данных, она потерпит неудачу.

  • Отметьте, где в вашем коде вы звоните mysql_connect(); из сообщения об ошибке кажется, что ваша система разработки использует значения по умолчанию для расширения Mysql .

  • В качестве альтернативы ресурс соединения может быть недоступен для mysql_real_escape_string() в системе сервера. С документация для mysql_real_escape_string() (выделено мое):

    link_identifier

    Соединение MySQL. Если идентификатор ссылки не указан, предполагается последняя ссылка, открытая mysql_connect(). Если такая ссылка не найдена, он попытается создать ее, как если бы mysql_connect() был вызван без аргументов. Если соединение не найдено или не установлено, генерируется ошибка уровня E_WARNING.

    Возможно, ваш сервер dev настроен так, что вызов mysql_connect() без аргументов устанавливает соединение с сервером базы данных MySQL. Наиболее вероятные причины этого: либо dev-сервер MySQL разрешает анонимные подключения, либо php.ini указывает действительные учетные данные по умолчанию.

    Однако это не работает на производстве, скорее всего, из-за того, что производственный сервер MySQL не разрешает анонимные подключения, и в php.ini не указываются учетные данные по умолчанию.

    Проверьте свой код на наличие ситуаций, когда возможно поступить на звонок на mysql_real_escape_string() без mysql_connect(), когда вам сначала не позвонят (обратите внимание, что установление соединения с PDO в этом случае не считается ).

  • Поскольку вы используете PDO, рассмотрите возможность перехода на подготовленные операторы , что полностью исключит необходимость в mysql_real_escape_string().

1 голос
/ 10 января 2012

Вы, вероятно, думаете о "магических цитатах"

http://php.net/manual/en/security.magicquotes.disabling.php

0 голосов
/ 29 июля 2014

Быстрый ответ:

Сначала подключиться к базе данных

Тогда используйте mysql_real_escape_string.

Не наоборот ......

0 голосов
/ 10 января 2012

Эта функция устарела в php 5.3 http://php.net/manual/en/function.mysql-escape-string.php

Вы должны будете переписать свой код, в идеале теперь использовать PDO и использовать подготовленные операторы.

...