Как выводить информацию из таблицы MySQL в PHP при использовании сессий. - PullRequest
0 голосов
/ 13 июля 2010

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

  1. Когда пользователь входит в систему, действие формы отправляется в login.php, который я указал ниже:

login.php

$loginemail = $_POST['loginemail'];     

$loginpassword = md5($_POST['loginpassword']);  

$con = mysql_connect("xxxx","database","pass");  
if (!$con)  
    {      
  die('Could not connect: ' .mysql_error());  
    }  

mysql_select_db("db", $con);  

$result = mysql_query("SELECT * FROM Members  
WHERE fldEmail='$loginemail'   
and Password='$loginpassword'");


//check if successful  
if($result){  
    if(mysql_num_rows($result) == 1){  
            session_start();  
            $_SESSION['loggedin'] = 1; // store session data  
            $_SESSION['loginemail'] = fldEmail;  
    header("Location: main.php"); } 
}  
mysql_close($con);  
  1. Теперь, чтобы использовать $ _SESSION ['loggedin'] по всему сайту для страниц, требующих авторизации, я создал 'auth.php', который проверяет, вошел ли пользователь в систему.

'auth.php' указан ниже:

session_start();        
if($_SESSION['loggedin'] != 1){  
header("Location: index.php"); }  
  1. Суть в том, что когда вы входите в систему, вы направляетесь через login.php в main.php через заголовок. Как я могу вывести полное имя пользователя, которое хранится в столбце 'fldFullName' в MySQL на main.php? Должен ли я подключиться снова, как я это сделал в login.php? или есть другой способ, которым я могу просто вывести имя пользователя из таблицы MySQL? Это то, что я сейчас пытаюсь сделать в main.php, но имя пользователя не появляется:

    $result = mysql_query("SELECT * FROM Members  
    WHERE fldEmail='$loginemail'     
        and Password='$loginpassword'");  
    
    //check if successful  
    if($result){  
        if(mysql_num_rows($result) == 1){  
            $row = mysql_fetch_array($result);  
              echo '<span class="backgroundcolor">' . $row['fldFullName'] .       '</span><br />' ;  
    

Ответы [ 3 ]

2 голосов
/ 13 июля 2010

Должен ли я подключиться снова, как я делал это в login.php?

Да. Так работает PHP и mysql

или есть другой способ, которым я могу просто вывести имя пользователя из таблицы MySQL?

Нет. Чтобы получить что-то из таблицы MySQL, вы должны сначала подключиться.
Вы можете поместить оператор connect в некоторый конфигурационный файл и включить его во все ваши скрипты.

Как я могу вывести полное имя пользователя, которое хранится в столбце 'fldFullName' в MySQL на main.php?

Вам понадобится некоторый идентификатор, чтобы получить правильную строку из базы данных. электронная почта может работать, но настоятельно рекомендуется вместо этого использовать поле идентификатора автоинкремента, которое будет сохранено в сеансе.
И в этот момент у вас нет ни $ loginemail, ни $ loginpassword в вашем последнем фрагменте кода, не так ли?

И некоторые примечания к вашему коду

  1. любой оператор header("Location: "); должен сопровождаться exit;. Или не было бы никакой защиты вообще.

  2. Любые данные, которые вы собираетесь поместить в запрос в кавычках, должны быть экранированы функцией mysql_real_escape_string(). Без исключений.

итак, это будет так

include $_SERVER['DOCUMENT_ROOT']."/dbconn.php";

$loginemail = $_POST['loginemail'];     
$loginpassword = md5($_POST['loginpassword']);  

$loginemail = mysql_real_escape_string($loginemail);     
$loginpassword = mysql_real_escape_string($loginpassword);  

$query = "SELECT * FROM Members WHERE fldEmail='$loginemail' and Password='$loginpassword'";
$result = mysql_query($query) or trigger_error(mysql_error().$query);

if($row = mysql_fetch_assoc($result)) {  
  session_start();  
  $_SESSION['userid'] = $row['id']; // store session data  
  header("Location: main.php"); 
  exit;
} 

и main.php part

session_start();
if(!$_SESSION['userid']) {
  header("Location: index.php"); 
  exit;
} 
include $_SERVER['DOCUMENT_ROOT']."/dbconn.php";

$sess_userid = mysql_real_escape_string($_SESSION['userid']);
$query  = "SELECT * FROM Members  WHERE id='$sess_userid'";  
$result = mysql_query($query) or trigger_error(mysql_error().$query);
$row = mysql_fetch_assoc($result));

include 'template.php';
1 голос
/ 13 июля 2010

Да, вам нужно переподключаться к базе данных для каждой загрузки страницы.Просто поместите этот код в отдельный файл и используйте функцию PHP require_once () для его включения.

Другая проблема, с которой вы столкнулись, состоит в том, что переменные $loginemail и $loginpassword не будутсуществует в main.php.Вы сохраняете адрес электронной почты пользователя в массиве $ _SESSION, поэтому просто перезагрузите информацию о пользователе:

$safe_email = mysql_real_escape_string($_SESSION['loginemail']);
$result = mysql_query("SELECT * FROM Members
  WHERE fldEmail='$safe_email'");

Кроме того, ваш код допускает атаки SQL-инъекций.Перед вставкой любой переменной в запрос SQL всегда используйте функцию mysql_real_escape_string () и заключите переменную в кавычки (как в приведенном выше фрагменте).

1 голос
/ 13 июля 2010

Позвольте мне указать, что у используемой вами техники есть некоторые неприятные дыры в безопасности, но в целях избежания серьезных споров о безопасности быстрое решение состоит в том, чтобы просто сохранить $row из login.php в переменной сеанса, и тогда это ваш доступ. Я удивлен, что это работает без вызова session_start() на вершине login.php.

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

...