#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
.