2015-10-26 2 views
1

Я немного не уверен, как соединить все мои файлы вместе для этого проекта. В основном у меня есть простой экран входа в систему, который вытаскивает имя пользователя и пароль из моей регистрационной таблицы. Как только они войдут в систему, я хочу, чтобы они могли увидеть несколько случайных научных работ, которые им были назначены. Я добавлю ссылку в свою базу данных на бумагу, а затем назначу 2-3 документа для 2-3 пользователей. Однако в настоящее время, когда я вхожу в систему и нажимаю на страницу с документами, я получаю сообщение эха, в котором я не подписан. Вот мои файлы. Первый - это экран входа в систему, который затем дает им 2 варианта. Первое - вернуться на главную страницу, а вторая - их страница с присвоенными исследовательскими работами.Постоянный вход PHP и SQL

<?php 

define('DB_NAME', 'conference'); 
define('DB_USER', 'root'); 
define('DB_PASSWORD', 'password'); 
define('DB_HOST', 'localhost'); 

$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
mysqli_set_charset($link, 'utf8'); 
if (!$link) { 
    die("Database connection failed: " . mysqli_error($link)); 
} 

$username = mysqli_real_escape_string($link, $_POST['username']); 
$password = mysqli_real_escape_string($link, $_POST['password']); 

function SignIn($link) { 

    session_start(); 
    if (!empty($_POST['username'])) { 
     $query = mysqli_query($link, "SELECT * FROM users where username = '$_POST[username]' AND password = '$_POST[password]'")or die(mysqli_error($link)); 
     $row = mysqli_fetch_array($query) or die(mysqli_error($link)); 
     if (!empty($row['username']) && !empty($row['password'])) { 
      $_SESSION['username'] = $row['password']; 
      echo "Welcome to your User Account for CSIT Conference. Click to go home: "; 
      echo '<a href="index.html"> Home Page </a>. '; 
      echo "Or here to go to your assigned papers: "; 
      echo '<a href="assigned.php"> Assigned Papers </a>. '; 
     } else { 
      echo "SORRY... YOU ENTERD WRONG ID AND PASSWORD... PLEASE RETRY..."; 
     } 
    } 
} 

if (isset($_POST['submit'])) { 
    SignIn($link); 
} 

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

<?php 
session_start(); 

if (isset($_SESSION['verified_user'])) { 
echo "Hello, '$firstname', Here are your assigned papers: "; 

$paper1; 
$paper2; 
} 

else { 
echo "You are not logged in and cannot see this page."; 
} 
?> 

Наконец, вот таблица sql пользователя, если это помогает с чем угодно. Также, пожалуйста, дайте мне знать, если я могу добавить дополнительную информацию. Я все еще изучаю все это, поэтому все, что я могу сделать, чтобы прояснить, не проблема. Большое спасибо за Вашу помощь!

-- phpMyAdmin SQL Dump 
-- version 4.4.14 
-- http://www.phpmyadmin.net 
-- 
-- Host: 127.0.0.1 
-- Generation Time: Oct 26, 2015 at 02:49 AM 
-- Server version: 5.6.26 
-- PHP Version: 5.6.12 

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8mb4 */; 

-- 
-- Database: `conference` 
-- 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `users` 
-- 

CREATE TABLE IF NOT EXISTS `users` (
    `firstname` varchar(40) NOT NULL, 
    `lastname` varchar(40) NOT NULL, 
    `username` varchar(40) NOT NULL, 
    `password` varchar(40) NOT NULL, 
    `state` varchar(40) NOT NULL, 
    `city` varchar(40) NOT NULL, 
    `streetaddress` varchar(40) NOT NULL, 
    `zipcode` varchar(40) NOT NULL, 
    `phonenumber` varchar(40) NOT NULL, 
    `emailaddress` varchar(40) NOT NULL, 
    `email` tinyint(1) NOT NULL, 
    `help` tinyint(1) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

-- 
-- Dumping data for table `users` 
-- 

INSERT INTO `users` (`firstname`, `lastname`, `username`, `password`, `state`, `city`, `streetaddress`, `zipcode`, `phonenumber`, `emailaddress`, `email`, `help`) VALUES 
('Steve', 'Paul', 'root', 'root', 'ny', 'new york', '20 ridge road', '10990', '98493938383939', '[email protected]', 0, 0), 
('test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 0, 0), 
('gsdfgsdfgqsdfgsdfg', 'sdfasdf', 'asdfasdfsadf', 'asdfasdfasdfasdf', 'asdfasdfasdfsadfsadfsdf', 'asdfasdfasdfasdfsadf', 'asdfasdf', 'asdfasfsfsfsdfasdfsdf', 'asdfasdfasdfsd', 'asdfasdfsadf', 0, 0); 

/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 
+4

Где '$ _SESSION [ 'verified_user'] 'определено? – Twisty

+0

Хмм, я не знаю. Где это обычно определено? Я, вероятно, не вложил его. Извините, все еще учась этому – Vortex11

+0

Я не уверен, как ответить на это. Вы пишете код. Поэтому, если вы назначили переменную глобальному '$ _SESSION', вы должны знать, как она туда попала. Если вы не назначили его в глобальном, вы не сможете использовать его позже. – Twisty

ответ

1

Сначала создайте новый файл с именем constants.php.

<?php 
//This is constants.php file 
define('DB_HOST', 'localhost'); 
define('DB_USER', 'root'); 
define('DB_PASSWORD', 'password'); 
define('DB_NAME', 'conference'); 
?> 

Вы должны определить новый столбец с именем id, который имеет int type и это auto_increment так будет ваш первичный ключ. Первичные ключи должны быть уникальными, а в таблице нет такой колонки. Таким образом, в вашем PHPMYADMIN написать на вкладке SQL:

ALTER TABLE `users` ADD `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ; 

Затем в файле входа в систему вы можете использовать PDO, как упоминалось выше, от других пользователей (если вы не готовы к этому вы можете посмотреть here и here).

<?php 
function SignIn() { 
    require_once("constants.php"); //Now constants will be accessible 
    session_start(); 
    try { 
     $link = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASSWORD); 
     $username = $_POST['username']; //no need to esaping as we will use prepared statements 
     $password = $_POST['password']; 
     if (!empty($username) && !empty($password)) { 
      //You need to define a new column named "id" which will be int auto_increment and it will be your primary key 

      $sql = "SELECT id, username, password FROM users where username = :username AND password = :password"; 
      //Prepare your query 
      $stmt = $link->prepare($sql); 
      //Execute your query binding variables values 
      $stmt->execute(array(':username'=>$username, ':password'=>$password)); 
      //Fetch the row that match the criteria 
      $row = $stmt->fetch(); 

      if (!empty($row['username']) && !empty($row['password'])) { 
       $_SESSION['is_logged'] = true; //Now user is considered logged in 
       $_SESSION['username'] = $row['username']; 
       $_SESSION['id'] = $row['id']; 

       //Never store passwords in $_SESSION 

       echo "Welcome to your User Account for CSIT Conference. Click to go home: "; 
       echo '<a href="index.html"> Home Page </a>. '; 
       echo "Or here to go to your assigned papers: "; 
       echo '<a href="assigned.php"> Assigned Papers </a>. '; 
      } else { 
       echo "SORRY... YOU ENTERED WRONG ID AND PASSWORD... PLEASE RETRY..."; 
      } 

      $link = null; 
     } else { 
      echo 'Please enter username and password.'; 
     } 
    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
} 

if (isset($_POST['submit'])) { 
    SignIn(); 
} 
?> 

Наконец, в файле assigned_papers.php вы можете получить доступ к $_SESSION переменным, которые вы уже сохраненным, а затем извлечь все назначенные документы для пользователя, который только что вошел.

<?php 
//assigned_papers 
session_start(); 
require_once("constants.php"); //Now constants will be accessible 
if (!empty($_SESSION['is_logged'])) { 
    echo 'Hello, '.$_SESSION['username'].'! Here are your assigned papers: '; 

    try { 
     $link = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASSWORD); 
     $sql = "SELECT * FROM assigned_papers where users_id = :users_id"; 
     $stmt = $link->prepare($sql); 
     //We want all assigned papers for the particular user 
     $stmt->execute(array(':users_id'=>$_SESSION['id'])); 
     $result = $stmt->fetchAll(); 
     foreach ($result as $row) { 
      //You can echo what you want from table assigned_papers 
      //echo '<p>'.$row['paper_name'].'</p>'; 
     } 
    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 

} else 
    header("Location: login.php"); //If user isn't logged in then redirect him to login page 
    die(); 
} 
?> 
1

На основании того, что я вижу, переменная $_SESSION['verified_user'] не существует. Таким образом, ваш if всегда терпит неудачу.

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

Переключение на переменную вы определили:

$_SESSION['username'] = $row['username']; 
$_SESSION['firstname'] = $row['firstname']; 

А потом это сделать:

<?php 
session_start(); 

if (isset($_SESSION['username'])) { 
    echo "Hello, '{$_SESSION['firstname']}', Here are your assigned papers: $paper1, $paper2"; 
} else { 
    echo "You are not logged in and cannot see this page."; 
} 
?> 

Кроме того, вы хотите прочитать на SQL Injection. Этот код уязвим для него, и вы можете получить доступ к БД.

+0

Хорошо, отлично, что я сейчас вхожу в систему. Но теперь он не распознает зарегистрированного пользователя. Разве это не потянет имя из моей таблицы пользователя, которую я разместил выше? Это одно и то же имя пользователя. Также будет работать над материалом для ввода sql. Это просто рудиментарно. Спасибо! – Vortex11

+0

Я предлагаю использовать 'ID' вместо' Username' – Edmhar

+0

Я внес некоторые изменения. Взглянуть. @Edmhar также предлагает хорошее предложение. Опять же, все зависит от вас, как вы пишете свой код. – Twisty

0

В своем первом файле на строке 24, сделайте так:

$_SESSION['username'] = $row['username']; 

И документы (защищенный файл):

<?php 
session_start(); 

if (isset($_SESSION['username'])) { 
echo "Hello, $_SESSION['username'], Here are your assigned papers: "; 

$paper1; 
$paper2; 
} 

else { 
echo "You are not logged in and cannot see this page."; 
} 
?> 

PS: В ваших предыдущих файлов, вы не установили $_SESSION["verified_user"] и то же значение с переменной $firstname.

Смежные вопросы