2010-10-12 5 views
1

Таким образом, я получаю это предупреждение при использовании mysql_real_escape_stringНевозможно использовать mysql_real_escape_string

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'username'@'localhost' (using password: NO) in /home/path/php/functions.php on line 11 

Остальной части сайта отлично работает, подключается к БД и все, но я получаю сообщение об ошибке при использовании этой функции ,

Он работает полностью на моем сервере тестирования localhost.

Любые идеи?

Я использую вышеупомянутую функцию в моей доморощенной функции строки канализации:

function sani($string){  
    $string = strip_tags($string); 
    $string = htmlspecialchars($string); 
    $string = trim(rtrim(ltrim($string))); 
    $string = mysql_real_escape_string($string); 
    return $string; 
} 

И я использую эту функцию каждый раз, когда я делаю запросы ...

function mm_mysqlquery($query) { 
if (MM_DEBUG == true) { echo "Query: $query <br>"; mm_log("Query: $query"); } //print query if MM_DEBUG 
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ("mysql_error: " . mysql_error()); 
$db_selected = mysql_select_db(DB_NAME); 
return mysql_query($query, $link); 
} 

Спасибо на заранее!

ответ

8

Первый пункт: если вы получаете сообщение об ошибке mysql_real_escape_string(), это потому, что вы вызываете функцию перед подключением к базе данных.

Похоже, вы подключаетесь к базе данных прямо перед запуском запроса. Итак, все, что вы делаете до того, как вы назовете свою функцию mm_mysqlquery(), не будет иметь соединение.

Функция mysql_real_escape_string() нуждается в живом подключении к базе данных, поэтому она может сделать правильный вид экранирования по отношению к набору символов соединения. Таким образом, вам нужно подключиться до, что вы делаете экранирование.

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

Во-вторых, пожалуйста, не принимайте предложения по использованию addslashes() - это не то же самое, что и mysql_real_escape_string(). Эти два не являются взаимозаменяемыми. Вы должны привыкнуть использовать mysql_real_escape_string().

В-третьих, ваша функция sani() показывает общее заблуждение.

function sani($string){  
    $string = strip_tags($string); 
    $string = htmlspecialchars($string); 
    $string = trim(rtrim(ltrim($string))); 
    $string = mysql_real_escape_string($string); 
    return $string; 
} 

Общее заблуждение состоит в том, что вам нужны все эти функции, чтобы сделать строку безопасной в инструкции SQL. Вы этого не сделаете. Требуется только mysql_real_escape_string(). Все остальные функции в этом примере не защищают от SQL-инъекций.

Эти функции полезны, если вы выводите строку в HTML-презентации и хотите уменьшить риск атак XSS, но тогда mysql_real_escape_string() не имеет значения.

Использовать каждый тип метода дезинфекции в соответствующем контексте.

+0

+1 это все о контексте – alex

0

строка mysql_real_escape_string (строка $ unescaped_string [, ресурс $ link_identifier])

Где $ unescaped_string ваша строка и $ link_identifier Ваш дб ресурс.

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

PHP.NET mysql_real_escape_string resource

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