Этот вопрос был впервые опубликован в Stack Overflow, но, поскольку это, возможно, такая же проблема с сервером, я, хотя, возможно, было бы также лучше разместить его здесь.
Я только что установил и настроил Apache, MySQL, PHP и phpMyAdmin на своем Macbook, чтобы создать локальную среду разработки. Но после того, как я переместил один из своих проектов на локальный сервер, я получил странную ошибку MySQL от одного из моих вызовов mysql_query ():
Доступ запрещен для пользователя _securityagent @ localhost (с паролем: NO)
Прежде всего, запрос, который я отправляю в MySQL, действителен, и я даже протестировал его через phpMyAdmin с идеальным результатом. Во-вторых, сообщение об ошибке появляется только здесь, когда у меня есть как минимум 4 других соединения и запроса mysql на странице. Этот вызов mysql_query () происходит в конце действительно длинной функции, которая обрабатывает данные для вновь созданных или измененных статей. В основном это то, что он делает:
Я знаю, что это довольно просто. Я не узнал имя пользователя «_securityagent», поэтому после быстрого поиска я наткнулся на это и в статье в Apple Developer Connection, в которой говорилось о какой-то случайной ошибке:
Инфраструктура безопасности Mac OS X решает эту проблему, выполняя код графического интерфейса пользователя от имени специального пользователя «_securityagent».
Затем я попытался поместить var_dump () во все переменные, используемые в вызове mysql_connect (), и каждый раз, когда он возвращает правильные значения (где имя пользователя, конечно, не «_securityagent»). Таким образом, мне интересно, знает ли кто-нибудь, почему «агент безопасности» пытается подключиться к моей базе данных - и как я могу предотвратить появление этой ошибки, когда я вызываю mysql_query ().
Обновление: вот точный код, который я использую для подключения к базе данных. Но должно последовать небольшое объяснение:
var $SYSTEM_DB_HOST = "";
function connect_db() {
// Reads the config file
include('system_config.php');
if (!($SYSTEM_DB_HOST == "")) {
mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS);
@mysql_select_db($SYSTEM_DB);
return true;
} else {
return false;
}
}
Как ты звонишь mysql_query()
? Я заметил, что вы не сохраняете дескриптор соединения из mysql_connect()
вызов. Мне это кажется неудачей mysql_query()
call не использует соединение, которое вы устанавливаете.
Я рекомендую вам изменить свой код, чтобы сделать что-то вроде этого:
function connect_db() {
// Reads the config file
include('system_config.php');
if ($SYSTEM_DB_HOST == "") {
return false;
}
$dbhandle = mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS);
if ($dbhandle) {
@mysql_select_db($SYSTEM_DB, $dbhandle);
return $dbhandle;
} else {
return false;
}
}
// ... invoke like this:
$dbhanle = connect_db();
if (!$dbhandle) {
// handle failed DB connection
}
// later, whenever you need to run queries:
$result = mysql_query($querysql, $dbhandle);
Это гарантирует, что соединение, которое вы устанавливаете с mysql_connect
фактически тот, который используется для запроса. Посмотрите, изменится ли это что-нибудь; даже если это не так, лично я считаю хорошей практикой явно указать MySQL, какое соединение с БД вы хотите использовать.
Вы проверили, что этот пользователь может выполнять запросы? Если вы можете войти в phpmyadmin как пользователь root, убедитесь, что пользователь _sercurityagent имеет права выполнять запросы:
Затем убедитесь, что на каждом из перечисленных дайте пользователю права на то, что, по вашему мнению, ему понадобится.
После этого вы сможете выполнить запрос.
Призыв к mysql_query()
возможно, выбирает неправильное соединение или пытается открыть новое соединение; попробуйте сохранить ресурс подключения из mysql_connect()
и явно передать его mysql_query()
. А еще лучше подумайте об обновлении до более современного драйвера, такого как mysqli или PDO. В качестве отдельного теста (и в другом скрипте) попробуйте выполнить mysql_connect()
и mysql_query()
без учетных данных и посмотрите, получите ли вы ту же ошибку.
Вы должны передать свои учетные данные mysql_connect.
Попробуйте что-нибудь вроде:
var $SYSTEM_DB_HOST = "";
function connect_db() {
// Reads the config file
include('system_config.php');
if (!($SYSTEM_DB_HOST == "")) {
$handle = mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS);
@mysql_select_db($SYSTEM_DB,$handle);
return true;
} else {
return false;
}
}
$handle = connect_db();
mysql_query("QUERY",$handle);
.....
mysql_close($handle);