Как изменить систему входа в MSQli запрос к PDO? - PullRequest
0 голосов
/ 20 сентября 2018
session_start();

if($_SERVER['REQUEST_METHOD'] == 'POST'){ 

  $email  = $mysqli->escape_string($_POST['email']);
  $result = $mysqli->query("SELECT * FROM users WHERE email='$email'");

  if( $result->num_rows == 0 ){
   // User doesn't exist
    $_SESSION['message'] = "User with that email doesn't exist!";
    header("location: error-login.php");

  } else{ // User exists

      $user = $result->fetch_assoc();

      if( password_verify($_POST['password'], $user['password'])){

        $_SESSION['email'] = $user['email'];
        $_SESSION['first_name'] = $user['first_name'];
        $_SESSION['last_name'] = $user['last_name'];
        $_SESSION['active'] = $user['active'];


        $_SESSION['logged_in'] = true;

        header("location: riscar.php");

      } else {
          $_SESSION['message'] = "You have entered wrong password, try again!";
          header("location: error-login.php");
        }      
    }  
}

Мне нужно изменить этот код выше для PDO.Я попытался внести некоторые изменения:

 define('DB_HOSTNAME', 'localhost');
 define('DB_USERNAME', 'root');
 define('DB_PASSWORD', null);
 define('DB_CHARSET', 'utf8');

 define('DB_DATABASE', 'publicacoes');

 $conn = new PDO('mysql:host=' . DB_HOSTNAME . ';dbname=' . DB_DATABASE . ';charset=' . DB_CHARSET . ';', DB_USERNAME, DB_PASSWORD);

 $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

session_start();

if($_SERVER['REQUEST_METHOD'] == 'POST'){ 

  $email = $conn->prepare("SELECT * FROM users WHERE email = :email"); ###
  $result->execute([':email' => $_POST['email']]); ###

  if( $result->num_rows == 0 ){
   // User doesn't exist
    $_SESSION['message'] = "User with that email doesn't exist!";
    header("location: error-login.php");

  } else{ // User exists

      $user = $result->fetch_assoc();

      if( password_verify($_POST['password'], $user['password'])){

        $_SESSION['email'] = $user['email'];
        $_SESSION['first_name'] = $user['first_name'];
        $_SESSION['last_name'] = $user['last_name'];
        $_SESSION['active'] = $user['active'];


        $_SESSION['logged_in'] = true;

        header("location: riscar.php");

      } else {

          $_SESSION['message'] = "You have entered wrong password, try again!";
          header("location: error-login.php");

        }      
    }  
}

Но это не работает, я получил ошибки:

1 - Undefined variable: result.2 - Fatal error: Uncaught Error: Call to a member function execute() on null.

Появляется та же ошибка, если я изменяю и получаю в результате $ email.

Что не так с кодом?Я не знаком с MYSQLi.Я думаю, что, возможно, мне нужно изменить весь код в этой системе входа в систему.Мне нужно изменить его на PDO.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я не голосовал против вас.

Однако я предполагаю, что ваш сценарий входа работает хорошо.

Во-первых, вам не нужно escape_string с pdo подготовленным заявлением..

Во-вторых, вы должны изменить соединение с базой данных, совместимое с pdo вместе с атрибутами pdo PDO::ATTR_ERRMODE & PDO::ERRMODE_EXCEPTION, чтобы вы могли как минимум ловить ошибки и исключения pdo.Вы также можете добавить другие атрибуты обработки ошибок в свой оператор соединения.См. http://php.net/manual/en/pdo.error-handling.php для получения более подробной информации.

$DATABASESERVER = "YOUR_DATABASE_SERVER_NAME";
$DATABASENAME =  "YOUR_DATABASE_NAME";
$DATABASEUSERNAMNE = "YOUR_DATABASE_USERNAME";
$DATABASEPASSWORD = "YOUR_DATABASE_PASSWORD";


try {
$DatabaseCon = new PDO("mysql:host=$DATABASESERVER; dbname=$DATABASENAME", $DATABASEUSERNAMNE, $DATABASEPASSWORD);
$DatabaseCon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 
catch(PDOException $e){
echo "$DatabaseCon-> failed: " . $e->getMessage();
}

и, наконец, вы можете заменить свой код на:

session_start();

if($_SERVER['REQUEST_METHOD'] == 'POST'){ 

$email = trim($_POST['email']);

try{
$Query = "SELECT * FROM users WHERE email=:email";
$statement = $DatabaseCon->prepare($Query);
$statement->bindValue(':email', $email);
$statement->execute();
$user = $statement->fetch(PDO::FETCH_ASSOC);    
$RowCount = $statement->rowCount();
}
catch (PDOerrorInfo $e){
die('QuerySCD Error '.$e->getMessage());
}


  if( $RowCount == 0 ){
   // User doesn't exist
    $_SESSION['message'] = "User with that email doesn't exist!";
    header("location: error-login.php");

  } else{ // User exists


      if( password_verify($_POST['password'], $user['password'])){

        $_SESSION['email'] = $user['email'];
        $_SESSION['first_name'] = $user['first_name'];
        $_SESSION['last_name'] = $user['last_name'];
        $_SESSION['active'] = $user['active'];


        $_SESSION['logged_in'] = true;

        header("location: riscar.php");

      } else {
          $_SESSION['message'] = "You have entered wrong password, try again!";
          header("location: error-login.php");
        }      
    }  
}

 //close database connection
 $DatabaseCon-> = NULL;

Однако вы также можете использовать позиционный заполнитель и метод bindParamв вашем синтаксисе pdo.Подробнее см. В руководстве.

Всего наилучшего.

0 голосов
/ 20 сентября 2018

Ваш код может быть написан так, используя мой класс-обертку PDO под названием GrumpyPDO .

session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST'){ 

    //select row of results where email is posted email
    //$db must be set prior to this
    $user = $db->row("SELECT * FROM users WHERE email=?", [$_POST['email']]);

    if(!empty($user)) { //user exists if $result is not empty

        //everything from here on is the same
        if(password_verify($_POST['password'], $user['password'])) {
            $_SESSION['email'] = $user['email'];
            $_SESSION['first_name'] = $user['first_name'];
            $_SESSION['last_name'] = $user['last_name'];
            $_SESSION['active'] = $user['active'];

            // This is how we'll know the user is logged in
            $_SESSION['logged_in'] = true;

            header("location: riscar.php");
        } else {
            $_SESSION['message'] = "You have entered wrong password, try again!";
            header("location: error-login.php");
        }
    } else {
        $_SESSION['message'] = "User with that email doesn't exist!";
        header("location: error-login.php");
    }
}
...