Простой скрипт активации


Скрипт полностью рабочий, но я спрашиваю, есть ли лучший способ я могу сделать это лучше, чем назвать все переменные запроса, , $В1 и т. д., а затем использовать , если еще заявления, чтобы выполнить код.

<?php 
// open the mysql connection

require_once('mysqli.php');

// successful login variables

$q = $dbc -> prepare("SELECT * FROM accounts WHERE email = ? && password = ? && logcount != ''");
$q -> bind_param('ss', ($_POST['email']), ($_POST['password'])); 
$q -> execute();
$q -> store_result();

// wrong password variables

$q1 = $dbc -> prepare("SELECT * FROM accounts WHERE email = ? && password != ? && logcount != ''");
$q1 -> bind_param('ss', ($_POST['email']), ($_POST['password']));
$q1 -> execute();
$q1 -> store_result();  

// not active variables

$q2 = $dbc -> prepare("SELECT * FROM accounts WHERE email = ? && logcount = ''");
$q2 -> bind_param('s', ($_POST['email']));
$q2 -> execute();
$q2 -> store_result();  

// successful login query

if ($q -> num_rows == 1) {
    $q = $dbc -> prepare("UPDATE accounts SET logcount = logcount+1 WHERE email = ?");
    $q -> bind_param('s', ($_POST['email']));
    $q -> execute();
    $dbc -> close();
    header('location: shack');
    exit();
}

// wrong password query

elseif ($q1 -> num_rows == 1) {
    echo '<p>Your password is incorrect.</p>';
}

// not activated query

elseif ($q2 -> num_rows == 1) {
    echo '<p>Your account is not activated.</p>';
}

// blank email form entry

elseif (empty($_POST['email'])) {
    echo '<p>You did not fill in an email on the login form.</p>';
}

// account not found

else {
    echo '<p>An account could not be found.</p>';
}

// close the mysql connection

$dbc -> close();

?>


370
5
задан 15 апреля 2011 в 11:04 Источник Поделиться
Комментарии
2 ответа

Кажется, вы храните пароли в открытом виде и делать 1:1 сравнения. Это плохо.

Вы можете очистить код следующим образом и выполнить 1 запрос к MySQL:

require_once('mysqli.php');  
// successful login variables
$q = $dbc -> prepare("SELECT email,dbClearTextPassword,accountActive FROM accounts WHERE email = ?");
$q -> bind_param('s', ($_POST['email']));
$q -> execute();
$q -> store_result();

// check to see if you returned any information from your query
if ($q->num_rows == 0) {
// email doesn't exist in db .. #fail
exit;
}

if ($q['accountActive'] != '1') {
// email account is not active .. #fail
exit;
}

// check the password matches
if ($_POST['clearTextPassword'] == $q['dbClearTextPassword']) {
// do some of your fancy code to process the successful login
} else {
// do some other fancy code to process a login failure
}

$dbc->close();

5
ответ дан 15 апреля 2011 в 12:04 Источник Поделиться

Об эффективности: я предлагаю не выбирать данные, которые не нужны.

Например, вместо

SELECT * FROM accounts WHERE email = ? && password = ? && logcount != ''

использовать

SELECT COUNT(*) FROM accounts WHERE email = ? && password = ? && logcount != ''

Также я полностью согласен с @sdolgy о том, чтобы не хранить пароль в виде обычного текста.

Еще один момент, а не про эффективность, а про ООП-дизайна и читабельности: разбить код на несколько классов:


  • Все SQL-запросы перейдите на слой DAO

  • Все чеки переехать в сервисный слой (который называет Дао-методы и бросить исключение при возникновении ошибки)

  • Все остальные действия оставить как есть

См. также: Дао шаблон

1
ответ дан 4 мая 2011 в 09:05 Источник Поделиться