Я разрабатываю простое приложение LAMP, где пользователи могут кредитовать свою учетную запись с помощью Paypal. Я подозреваю, что это простая проблема, но потратил немало времени на эксперименты без всякой пользы и по достоинству оценил любые мысли:
Система имеет систему управления пользователями, отлично работающую с использованием сеансов, но я не могу заставить ее отображать текущий пользовательский кредит.
Но я пробовал вещи в соответствии с:
$result = mysql_query ( "
SELECT *
ОТ пользователей
INNER JOIN account
ON account.UserID = account.UserID
ORDER BY account.accountID ");while ($ _ SESSION ['Username'] = $row ['Username']) { echo $row ['Username']; echo $row ['Credit']; }
Я подозреваю, что оператор while недействителен, но я хочу, чтобы он использовал имя пользователя и кредит, где текущее имя пользователя сеанса = имя пользователя, хранящееся в базе данных.
Большое спасибо за то, что посмотрели - очень ценили.
Хорошо, что в коде есть много ошибок, которые не могут быть исправлены вами, поскольку у вас явно нет знания php.
Но позвольте мне объяснить это, чтобы вы могли хорошо понять, что вы сделали неправильно:
Прежде всего, ваш оператор mysql просто ошибается.
Почему вы присоединяетесь к полю самостоятельно? Вы не получите соответствующие строки ↔ учетных записей пользователей, потому что пользователи никогда не присоединяются.
В дополнение к этому, если вы хотите получить одну строку (вам нужно только одно, потому что вы хотите только эхо-данные одного пользователя, выборка будет более тяжелой в ресурсах), скажите mysql, чтобы сделать это. Простым примером будет "WHERE a =" b "LIMIT 1 (выберите только строку, где a равно" b ", вернитесь после поиска первого).
Теперь, чтобы прочитать что-то из вашего запроса, вам нужно получить соответствующие данные.
Вы можете сделать это, используя mysql_fetch_assoc/mysql_fetch_array/mysql_fetch_object.
Это будет выглядеть примерно так: $data = mysql_fetch_array($query);
.
В этом случае вам не нужно использовать цикл while()
, поскольку у вас есть только одна строка. Цикл while необходим только в том случае, если вы хотите работать с более чем одной строкой.
Остальная часть вашего кода будет правильной, хотя вам не нужно дважды вызывать эхо. Вы можете просто подключить обе переменные с помощью..: echo $row['Username'].$row['Credit'];
.
Если вы хотите вставить промежуток между ними, соедините его с другой точкой: echo $row['Username']." ".$row['Credit'];
.
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
if ($row['Username'] == $_SESSION['Username'])
{
echo $row['Username'];
echo $row['Credit'];
break; // I believe username is unuque.
}
}
Но гораздо лучше получить только одну строку из таблицы:
$result = mysql_query("
SELECT *
FROM users
INNER JOIN account
ON account.UserID=users.UserID
WHERE Username ='".mysql_real_escape_string($_SESSION['Username'])."'" );
if ($result && $row = mysql_fetch_array($result, MYSQL_ASSOC))
{
echo .....
}
WHERE
). По этой причине я предложил второе решение, которое берет одну строку из БД.
Одна вещь, которая выпрыгивает на меня, заключается в том, что ваш запрос объединяется:
account.UserID=account.UserID
вместо:
account.UserID=user.ID
Кроме того, это неверно:
while($_SESSION['Username'] = $row['Username'] )
Знак =
предназначен для назначения, а не для сравнения, поэтому вы фактически устанавливаете значение $_SESSION['Username']
на $row['Username']
. Затем выражение оценивается как логическое (поскольку оно в течение некоторого времени условно), и если оно истинно один раз, оно будет истинным навсегда. Город бесконечной петли.
У вас есть только результат mysql, теперь вы должны вернуть эту информацию как ассоциативный массив (или объект)
while ($row = mysql_fetch_assoc($result)) {
if ($_SESSION['username'] == $row['Username']) {
echo $row['Username'];
echo $row['Credit'];
}
}
Кажется, что вы используете $_SESSION ['username'], чтобы проверить аутентификацию пользователя на сайте, гораздо лучше использовать соленую + хэшированную версию имени пользователя и, возможно, время входа в систему (никогда не включайте пароль).