Логика PHP для имени пользователя НЕ РАБОТАЕТ

Ошибка, которую я получаю: пытаюсь ли я ввести действительное имя пользователя или пароль, он всегда говорит: «Извините, имя пользователя уже существует». Что-то не так с моей логикой, особенно с этим блоком кода:

 $q = $conn->query("SELECT uname FROM Student WHERE uname= $aRegUsr ");
    $stmt = $conn->prepare($q);
    $stmt->fetch($q);
    if($stmt > 0){ #if there are 1 or more users with enter username, deny.

dbcred.php

<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'databasename';

?>

PHP:

<?php
#Login Details
require_once('dbcred.php');
$conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass);

$aRegUsr = $_POST['regduser']; 

#Check for Existing User
$q = $conn->query("SELECT uname FROM Student WHERE uname= $aRegUsr ");
$stmt = $conn->prepare($q);
$stmt->fetch($q);
if($stmt > 0){ #if find that username in use, deny ability to register, else{ALLOW}
echo "Sorry, username already exists";
}
else{
echo "Success";
}

?>

HTML

<form action="inc/check_regUsr.php" method="post" id="userLogon">
    <div class="field required">
        Username: <input type="text" name="regduser" tabindex="1" /><br />
        </div>
        <div class="field required">
        Password: <input type="password" name="regdpass" tabindex="2" /><br />
        </div>
        <input type="submit" name="submitUser" />
</form>

Таблица БД: Student img1


person Jshee    schedule 04.08.2011    source источник
comment
ВЫБЕРИТЕ uname FROM Student WHERE uname= $aRegUsr -- разве вам не понадобятся одинарные кавычки вокруг $aRegUser? ВЫБЕРИТЕ uname FROM Student, ГДЕ, например, uname= '$aRegUsr'?   -  person Marvo    schedule 05.08.2011
comment
$stmt — это объект. Он всегда будет больше 0.   -  person Endophage    schedule 05.08.2011


Ответы (3)


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

«Попытаюсь ли я ввести действительное имя пользователя или пароль» указывает на аутентификацию пользователя, тогда как «if($stmt > 0){ #если есть 1 или более пользователей с вводом имени пользователя, отклонить». указывает на регистрацию пользователя.

РЕДАКТИРОВАТЬ: исходя из ваших обновленных требований, аутентификация пользователя может немного усложниться в зависимости от безопасности вашего развертывания. Ниже приведен пример кода, основанный на вашем базовом коде. Обратите внимание, что вы можете найти готовый сценарий и изменить его для своих нужд, так как это может лучше соответствовать вашей цели.

<?php #Login Details 
require_once('dbcred.php'); 

#Variables
$error = '';
$auth = 0;
$aRegUsr = $_POST['regduser'];   #Check for Existing User 
$aRegPass = $_POST['regdpass'];   #Check for Existing User 

#DB stuff
$conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass); 
$sql = "SELECT uname,password FROM Student WHERE uname= $aRegUsr ";

#Dataset stuff
foreach($conn->query($sql) as $row){ 
    if($row['password'] != $aRegPass){
        $error = 'Invalid Password';
        $auth = 0; #If $auth = 0 then user is logged in
    }else{
        $auth = 1; #If $auth = 1 then user is logged in
    }
}
$conn = null;
?>
person RobB    schedule 04.08.2011
comment
Аутентификация пользователя. Предполагается, что это окно входа в систему, если вход в систему действителен, они вошли в систему, в противном случае их нужно предупредить, чтобы они вернулись. Я планирую добавить сеансы к этому и, возможно, файлы cookie - person Jshee; 05.08.2011
comment
Как я могу отредактировать это, чтобы сделать что-то из этого. Имейте в виду, что я немного новичок в php - person Jshee; 05.08.2011
comment
Проблема в том, что ваш текущий скрипт только пытается сопоставить указанное имя пользователя с записью в таблице. Если есть совпадение, это означает, что имя пользователя действительно, и следующим шагом будет проверка пароля. Я отредактировал свой ответ, чтобы он соответствовал этим критериям. - person RobB; 05.08.2011

Я не уверен, так как никогда не использовал эту функцию, но из того, что я понял отсюда: http://php.net/manual/en/pdostatement.fetch.php fetch возвращает результаты, поэтому вам действительно нужно проверить и посмотреть, больше ли количество результатов, чем 0. Проверьте fetchAll http://php.net/manual/en/pdostatement.fetchall.php должно быть примерно так:

$results = $stmt->fetchAll();
if(count($results)>0)
{
...
person virlan2004    schedule 04.08.2011

Ваш код неверен. Я предполагаю, что ваша логика в if ($stmt > 0) состоит в том, чтобы проверить, существует ли уже пользователь с таким именем.

Используйте это вместо этого -

<?php 

#Check for Existing User
$q = $conn->query("SELECT uname FROM Student WHERE uname= $aRegUsr ");
$stmt = $conn->prepare($q);
$rows = $stmt->fetchAll();
if ($rows > 1) { # The username already exists
    #... rest  of your code
person arunkumar    schedule 04.08.2011
comment
Это абсолютно ничем не отличается. - person Jshee; 05.08.2011