Итак, я получаю это предупреждение при использовании 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.
Есть идеи?
Я использую вышеупомянутую функцию в своей собственной функции санобработки строки homebrew:
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); }
Спасибо заранее!
Первая точка. Если вы получаете сообщение об ошибке из mysql_real_escape_string()
, это связано с тем, что вы вызываете эту функцию до того, как будете подключены к базе данных.
Похоже, вы подключаетесь к базе данных непосредственно перед запуском запроса. Итак, все, что вы делаете до вызова функции mm_mysqlquery()
, не будет иметь соединения.
Для функции mysql_real_escape_string()
требуется 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()
только mysql_real_escape_string()
. Все остальные функции в этом примере не защищают от SQL-инъекций.
Эти функции полезны, если вы выводите строку в HTML-презентации и хотите уменьшить риск атак XSS, но тогда mysql_real_escape_string()
имеет значения.
Используйте каждый тип метода дезинфекции в соответствующем контексте.
string mysql_real_escape_string (строка $ unescaped_string [, resource $ link_identifier])
Где $ unescaped_string – ваша строка, а $ link_identifier – ваш ресурс db.
Соединение MySQL. Если идентификатор ссылки не указан, предполагается последняя ссылка, открытая mysql_connect (). Если такой ссылки не обнаружено, она попытается создать такую, как если бы mysql_connect () был вызван без аргументов. Если соединение не установлено или не установлено, генерируется ошибка уровня E_WARNING.
Ресурс mysql_real_escape_string PHP.NET