2012-04-26 4 views
9

Я пытаюсь немного поработать над безопасностью и дезинфекцией в моем приложении баз данных (для класса). для начала, я пытаюсь использовать mysql_real_escape_string, но всякий раз, когда я его использую, он всегда возвращает пустую строку!PHP mysql_real_escape_string возвращает пустую строку

Вот код подключения:

include_once ("./connect.php"); 
$db_connection = new mysqli($SERVER, $USERNAME, $PASSWORD, $DATABASE); 
if (mysqli_connect_errno()) { 
    echo("Can't connect to MySQL Server. Error code: " . mysqli_connect_error()); 
    return null; 
} 
$field = mysql_real_escape_string($_GET['value']); 
$upc = $_GET['upc']; 
$type = $_GET['field_type']; 
echo $field; 
echo $upc; 
echo $type; 

Когда PHP фактически получает выполняется, $ UPC и $ типа распечатана, но НИЧЕГО за $ поля. Ive пытался использовать промежуточную строку, но я получаю тот же результат. Я серьезно не понимаю, что здесь происходит.

Кроме того, я сделал var_dump на $field, и он утверждает, что mysql_real_escape_string возвращается FALSE, что должно произойти, когда нет соединения (?), Но есть один.

+2

Вы уверены, что ** есть активное соединение? Как вы протестировали? Кроме того, включите отчет об ошибках, если вы еще этого не сделали. – Brad

+2

Вы уверены, что значение заполнено? – JonathanRomer

+4

Откуда вы знаете, что есть связь? Я также предлагаю полностью исключить 'mysql_ *' и использовать' PDO' или, по крайней мере, * некоторую * оболочку DB, такую ​​как MDB2 –

ответ

18

Вы подключаетесь с помощью MySQLi, не MySQL, так что вам нужно mysqli_real_escape_string

Хотя вы можете легко использовать подготовленные заявления в MySQLi и тогда вам не нужно будет либо ...

+1

lol, его всегда такие глупые вещи, как это. Я собираюсь работать над подготовленными заявлениями следующего ... – Drake

+1

Почему это принятый ответ? действительно ли это работает? – Sliq

+2

@Panique да, потому что вы не должны смешивать mysql_ с mysqli. –

6

См PHP Документация http://php.net/manual/en/function.mysql-real-escape-string.php

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

что означает, что вам нужно активное соединение, чтобы использовать эту функцию

Если вы не видите какие-либо ошибки попробуйте

error_reporting(E_ALL); 
ini_set('display_errors','On'); 

mysql_real_escape_string альтернативный

Использование

$escaped = htmlspecialchars($_GET['value'], ENT_QUOTES, "ISO-8859-1"); 

ИЛИ

$escaped = filter_var($_GET['value'], FILTER_SANITIZE_STRING);  
+1

AHA! Я получаю это как вывод: Предупреждение: mysql_real_escape_string(): доступ запрещен для пользователя 'www-data' @ 'localhost' (с использованием пароля: нет) в /cslab/home/paw5k/public_html/cainedb/edit_execute_update_gn_query.php on line 70 Предупреждение: mysql_real_escape_string(): Не удалось установить ссылку на сервер в /cslab/home/paw5k/public_html/cainedb/edit_execute_update_gn_query.php в строке 70 XXseries изменить успешно? – Drake

+0

явно проблема аутентификации или подключения ... – Drake

+0

Lol .. i Угадайте, сколько ... вам нужно подключиться к базе данных с помощью 'mysql_connect' или вам нужна замена ??? – Baba

2

«Это расширение устарело с PHP 5.5.0 и будет удалено в будущем. Вместо этого, расширение MySQLi или PDO_MySQL должны быть использованы «из http://php.net/manual/en/function.mysql-real-escape-string.php

Простое добавление„я“к имени функции не решение Заметьте параметр идентификатор ссылки больше не факультативный http://www.php.net/manual/en/mysqli.real-escape-string.php

PS:.. Что касается как downvotes, я поддерживаю свой ответ. Функция в вопросе будет удалена с PHP, это очень важно, и я чувствовал, что нужно указывать, поскольку никто не упоминал об этом. Вы не согласны? исходный вопрос важен, но многие люди (включая меня) пришли сюда, ища информацию о mysql_real_escape_string(), и первое, что вам нужно понять при поиске информации о mysql_real_escape_string(), - это то, что оно устарело. Sysadmins рано или поздно придется обновлять PHP, и, несомненно, тонна приложений все еще использует эту устаревшую функцию.

5

Вы получаете пустую строку, потому что функция принимает два параметра; фактическое подключение к базе данных, а затем строку. Используйте это:

$sanitizedField = mysqli_real_escape_string($connection, $field); 
+0

OP использует объектно-ориентированный стиль, который принимает только один параметр '$ connection-> real_escape_string ($ field);'. См. [This] (http://php.net/manual/en/mysqli.real-escape-string.php#example-1679) пример из документации PHP. – War10ck

0

Мы также столкнулись с такой же проблемой. mysql_real_escape_string работал над нашей системой разработки Linux, но не работал на тестовой площадке. Нам было интересно, почему это работает в нашей системе, а не на тестовой кровати, хотя все php rpms имеют одинаковую версию. После обращения к документации по PHP выяснилось, что перед вызовом mysql_real_escape_string требуется активное подключение к MySQL. Если активного подключения нет, PHP внутренне пытается подключиться к MySQL с параметрами по умолчанию. Когда PHP внутренне пытался подключиться к базе данных на нашей машине разработки, он работал, но он не удался на нашем тестовом стенде и привел к пустым ответам на вызов mysql_real_escape_string. После добавления вызова в mysql_connect() перед mysql_real_escape_string() наша проблема была решена.

Ниже была ошибка при запуске команды mysql, и эта ошибка не была обнаружена на нашей машине разработки и успешно подключена к серверу базы данных. ОШИБКА 1045 (28000): Доступ запрещен для пользователя 'root' @ 'localhost' (с использованием пароля: НЕТ)

Заключение заключается в том, что мы должны явно подключаться к mysql перед вызовом mysql_real_escape_string. Внутренняя попытка php подключаться к базе данных может работать на некоторой системе и не работать на некоторых других системах в зависимости от уровней безопасности или учетных данных для входа.

0

@ jeroen, кажется, это объясняет. Хотя он должен работать без подключения к базе данных на локальном сервере (многие вещи работают таким образом), но он не будет на веб-сервере, кроме того, что вы подключаетесь к базе данных до mysql_rea ..... Я просто попробовал, и это сработало. Вот почему он заработал мой голос

Смежные вопросы