Назад | Перейти на главную страницу

PHP и MySQL в Mac OS X: доступ запрещен для пользователя GUI

Этот вопрос был впервые опубликован в Stack Overflow, но, поскольку это, возможно, такая же проблема с сервером, я, хотя, возможно, было бы также лучше разместить его здесь.

Я только что установил и настроил Apache, MySQL, PHP и phpMyAdmin на своем Macbook, чтобы создать локальную среду разработки. Но после того, как я переместил один из своих проектов на локальный сервер, я получил странную ошибку MySQL от одного из моих вызовов mysql_query ():

Доступ запрещен для пользователя _securityagent @ localhost (с паролем: NO)

Прежде всего, запрос, который я отправляю в MySQL, действителен, и я даже протестировал его через phpMyAdmin с идеальным результатом. Во-вторых, сообщение об ошибке появляется только здесь, когда у меня есть как минимум 4 других соединения и запроса mysql на странице. Этот вызов mysql_query () происходит в конце действительно длинной функции, которая обрабатывает данные для вновь созданных или измененных статей. В основном это то, что он делает:

  1. Соберите все данные из формы статьи (название, содержание, даты и т. Д.)
  2. Проверить собранные данные
  3. Подключиться к базе данных
  4. Динамическое построение SQL-запроса на основе проверенных данных статьи
  5. Отправить запрос в базу данных перед закрытием соединения

Я знаю, что это довольно просто. Я не узнал имя пользователя «_securityagent», поэтому после быстрого поиска я наткнулся на это и в статье в Apple Developer Connection, в которой говорилось о какой-то случайной ошибке:

Инфраструктура безопасности Mac OS X решает эту проблему, выполняя код графического интерфейса пользователя от имени специального пользователя «_securityagent».

Затем я попытался поместить var_dump () во все переменные, используемые в вызове mysql_connect (), и каждый раз, когда он возвращает правильные значения (где имя пользователя, конечно, не «_securityagent»). Таким образом, мне интересно, знает ли кто-нибудь, почему «агент безопасности» пытается подключиться к моей базе данных - и как я могу предотвратить появление этой ошибки, когда я вызываю mysql_query ().

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

  1. Ошибка подключения возникает при вызове mysql_query () в функции X в class_1
  2. class_1 использует class_2 для подключения к базе данных
  3. class_2 читает файл конфигурации с переменными соединения с базой данных (host, user, pass, db)
  4. class_2 подключается к базе данных с помощью следующей функции:

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 имеет права выполнять запросы:

  • localhost
  • IP-адрес ящика
  • петля

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

После этого вы сможете выполнить запрос.

Призыв к 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);