Неизвестная ошибка PHP

#php

#php

Вопрос:

Итак, я создал функцию:

 function user_data($user_id) {
    $data = array();
    $user_id = (int)$unser_id;

    $func_num_args = func_num_args();
    $func_get_args = func_get_args();

    if ($func_num_args > 1){
        unset($func_get_args[0]);

        $fields = '`' . implode('`, `', $func_get_args) . '`';
        $data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` WHERE 'user_id' = $user_id"));


        return $data;
    }

}
  

По ошибке я ввел опечатку unser_id, но не возвращался до тех пор, пока мне не пришлось устранять неполадки дальше по строке в моем коде.

Я создаю сценарий входа в систему, но точка, в которой мне приходится устранять неполадки, показывает данные профиля от других моих пользователей.

Причина, по которой я указываю на опечатку, заключается в том, что по какой-то причине это странная ошибка. Если я изменю его на user_id, он больше не позволит мне войти в систему. Если я оставлю это как under_id, это сработает.

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

Например, в моем URL www.mywebsite.com/myprofile показывает мое имя пользователя и адрес электронной почты, если я ввожу www.mywebsite.com/otherprofile он по-прежнему показывает мою информацию. Но он показывает запрос, если я ввожу пользователя, которого нет в моей базе данных, так что эта часть работает.

Я считаю, что проблема связана с этой опечаткой, но я действительно застрял в оценке решения?

Итак, вот другой код:

страница профиля:

 if (isset($_GET['username']) === true amp;amp; empty ($_GET['username']) === false) {
    $username = $_GET['username'];



    if (user_exists($username) === true) {
        $user_id  = user_id_from_username($username);   
        $profile_data = user_data($user_id, 'first_name', 'last_name', 'email');

    ?>


    <p><?php echo $profile_data['profile']; ?></p>

    <h1><?php echo $profile_data['first_name']; ?> profile</h1>
    <p><?php echo $profile_data['email'] ?></p>



    <?php

    } else {
        echo 'Sorry, that user does not exist';
    }
    } else {
        header('Location: index.php');
    exit();
}
  

Здесь все связанные функции:

 function logged_in(){
    return (isset($_SESSION['user_id'])) ? true : false;    
}


function user_exists($username) {
    $username = sanitize($username);
    $query = mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'");
    return (mysql_result($query, 0) == 1) ? true : false;
}

function email_exists($email) {
    $email = sanitize($email);
    $query = mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `email` = '$email'");
    return (mysql_result($query, 0) == 1) ? true : false;
}




function user_active($username) {
    $username = sanitize($username);
    $query = mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `active` = 1");
    return (mysql_result($query, 0) == 1) ? true : false;
}




function user_id_from_username($username) {
    $username = sanitize($username);
    return mysql_result(mysql_query("SELECT `user_id` FROM `users` WHERE `username` = '$username'"), 0, 'user_id'); 
}




function login($username, $password) {
    $user_id = user_id_from_username($username);

    $username = sanitize($username);
    $password = md5($password);

    return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password' "), 0) == 1) ? $user_id : false;
}
  

Комментарии:

1. Заведите привычку проверять ваш запрос на наличие ошибок. if (!result) show_error

2. Я должен прочитать это еще раз, потому что вопрос довольно сложный, но $data = mysql_fetch_assoc(mysql_query(«SELECT $fields FROM users WHERE ‘user_id’ = $user_id»)); немного странно для меня? SELECT '$fields' from users where user_id = '$user_id' Я бы написал

Ответ №1:

Проблема в вашей первой функции заключается в том, что вы заключаете имя своего столбца в одинарные кавычки:

 $data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` WHERE 'user_id' = $user_id"));
                                                                         ^       ^
  

Это означает, что вы фактически используете не столбец user_id , а строку.

Вы должны изменить это на:

 $data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` WHERE `user_id` = $user_id"));
  

(или без обратных меток …).

Кроме того, вы используете устаревшие mysql_* функции, и у вас нет никакой обработки ошибок. Вы должны переключиться на PDO или mysqli, используя подготовленные инструкции, и убедиться, что он генерирует исключения (оба могут), чтобы вы точно знали, что идет не так.

Комментарии:

1. A: Спасибо, что заметили мою ошибку и B: переключив мой mysql_query на mysqli_query?

2. Единственное, что я бы предложил, это проверить запрос на наличие ошибки после его запуска. Существует много возможностей для ошибок, поскольку список полей является переменной, а вложенность делает ошибку незаметной.

3. Я нашел отличную тему по преобразованию старого mysql_query в PDO спасибо за совет

4. @user3746168 Я тоже предпочитаю PDO, и, как вы, вероятно, уже поняли, речь идет об изменении всего взаимодействия с вашей базой данных, а не только одной функции (и передаче / предоставлении доступа к соединению и т. Д.).

Ответ №2:

Вы заменяете аргумент $user_id user_data , переданный на $unser_id :

     $user_id = (int)$unser_id;
  

Таким образом, значением $user_id всегда будет то, что хранится в $unser_id , а не то, что передается функции. Вам следует попробовать удалить строку, чтобы код фактически использовал идентификатор пользователя, который вы ему передаете.

Если у вас нет ни одной вызываемой переменной $unser_id , вам следует проверить журналы ошибок PHP. Я подозреваю, что там будут строки, говорящие что-то вроде Undefined variable: unser_id .