Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.01.2015, 09:55
Интересующийся
Отправить личное сообщение для xcislav Посмотреть профиль Найти все сообщения от xcislav
 
Регистрация: 25.11.2013
Сообщений: 10

Минимальная, одностраничная PHP регистрация: БД, форма, $_POST, $_SESSION
Кроме структуры, формируемой header("location:") всё достаточно прямолинейно,
Отправка формы попадает -> соединением с БД (PDO+немного SQL кода)
и
всё происходит методом $_POST и выводится в $_SESSION.

index.php:
<!DOCTYPE html>
    <html>
    <h1>Register</h1>
    <form method="POST">
    <input type="text" name="user">
    <input type="pass" name="pass">
    <input type="submit">
    </form>
    <?php
    session_start();
    if(isset($_POST['user'], $_POST['pass'])){
    require 'connect.php';
    $zr++;
    $query = d()->prepare("INSERT INTO u (user, pass, loc) VALUES (:user, :pass, :loc)");
    $query->bindParam(':user', $_POST['user']);
    $query->bindParam(':pass', $_POST['pass']);
    $query->bindParam(':loc', $zr);
    if($query->execute()){
    $_SESSION['user'] = $row['user'];
    $_SESSION['pass'] = $row['pass'];
    header("Location: ".$_SERVER['PHP_SELF']);
    } else{
    echo 'ERROR';
    }
    }
    ?>
    <h1>Login</h1>
    <form method="POST">
    <input type="text" name="user">
    <input type="pass" name="pass">
    <input type="submit">
    </form>
    <?php
    echo $_POST['user'];
    if(isset($_POST['user'], $_POST['pass'])){
    require 'connect.php';
    $query = d()->prepare("SELECT user, pass FROM u WHERE user=:user AND pass=:pass");
    $query->bindParam(':user', $_POST['user']);
    $query->bindParam(':pass', $_POST['pass']);
    $query->execute();
    if($row = $query->fetch()){
    $_SESSION['user'] = $row['user'];
    $_SESSION['pass'] = $row['pass'];
    header("Location: ".$_SERVER['PHP_SELF']);
    }
    }
    $us=$_SESSION['user'];
    echo 'user ',$us;
    ?>
    <?php
    if(isset($_SESSION['user'])){
    $us=$_SESSION['user'];
    echo '
 user ',$us, ' ', '<a href="logout.php">Logout</a>';
    echo '
', '<a href="zrs.php">zero session</a>';
    }
    ?>
    </html>


connect.php:
<?php
    function d(){
    try{
    $db = new pdo("mysql:host=localhost;dbname=tx;","root","hyuiuik");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $db;
    } catch(PDOException $e){
    echo 'ERROR', $e->getMessage();
    }
    }
    ?>


ВИД на табл. пользователей:
Код:
mysql> select * from u;
+----+--------+------+------+
| id | user   | pass | loc  |
+----+--------+------+------+
|  1 | a      | asdf |    0 |
|  2 | b      | bsdf |    0 |
|  3 | b      | bsdf |    0 |
|  4 | c      | csdf |    0 |
Но непонимание на этапе формирования структуры подготовления и отправки собранных данных.
примерный вид:

1.php

<?php
session_start();
К
О
Д
session_write_close();

if( isset($_POST['user'] ){
К
О
Д
}else{
К О Д
}

if( !isset($_POST['user']) ){
header("location: http://" . $_SERVER['HTTP_HOST'] . "/login.php");
}else{
//user установлен
КОД ЗАПУСКА
}
Ответить с цитированием
  #2 (permalink)  
Старый 08.01.2015, 10:07
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

function run()
  if(!empty($_POST))
  {
   // валидация, сохранение, редирект или exception
  }
  //  catch block
   // рендер сообщения об ошибке
  // рендер формы
}
Ответить с цитированием
  #3 (permalink)  
Старый 08.01.2015, 10:18
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Ну а вообще - говнокод. Так не делают давным давно.

после

header("Location: ".$_SERVER['PHP_SELF']);

полезно добавить

exit;

После

if(isset($_POST['user'], $_POST['pass'])){

try{
// проверки. Если что-то не понравилось то в любом месте
  if($something_wrong)
     throw new Exception('Жалоба что не понравилось');
// иначе flow катится как обычно до записи и редиректа с Exit'ом
}
catch(Exception $e) {
 echo $e->getMessage();
}


Одно только неясно - зачленом вам pdo в таком гавнокоде.

Обработку прерывания можно сделать системной, или классовой. Но самое простое это трай-катч. А чтобы собирать свои ошибки и рендерить красиво, делается расширения Exception и там все дописывается, как правило __toString() делается свой. Или допустим чтобы собрать сразу все ошибки в массив делается свой приемник, ибо стандартный Exception массивов на входе не понимает.

Последний раз редактировалось kostyanet, 08.01.2015 в 10:21.
Ответить с цитированием
  #4 (permalink)  
Старый 08.01.2015, 16:52
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

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

Последний раз редактировалось Vlasenko Fedor, 08.01.2015 в 17:51.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Форма <action> PHP papacoca Серверные языки и технологии 3 30.09.2014 18:55