【问题标题】:PHP Logic for Username NOT WORKING用户名的PHP逻辑不起作用
【发布时间】:2011-08-04 21:33:05
【问题描述】:

我得到的错误:无论我尝试使用有效的用户名还是密码,它总是说“对不起,用户名已经存在”。我的逻辑有问题,特别是这个代码块:

 $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

【问题讨论】:

  • "SELECT uname FROM Student WHERE uname= $aRegUsr" -- 你不需要在 $aRegUser 周围加上单引号吗? SELECT uname FROM Student WHERE uname= '$aRegUsr' 例如?
  • $stmt 是一个对象。它总是大于 0。

标签: php mysql login login-script


【解决方案1】:

您是否正在尝试创建用户注册或用户身份验证脚本?我认为您的实际目的并未明确列出以帮助提供有效的解决方案。

“是否尝试有效的用户名或密码”表示用户身份验证,而“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;
?>

【讨论】:

  • 用户认证。这应该是一个登录窗口,如果登录有效,则他们“登录”,否则需要提醒他们返回。我计划为此添加会话,也许还有 cookie
  • 我怎样才能编辑这个来做一些事情。请记住,我对 php 有点菜鸟
  • 问题是您当前的脚本仅尝试将指定的用户名与表中的记录匹配。如果匹配,则表明用户名有效,下一步将是验证密码。我已编辑我的答案以满足此标准。
【解决方案2】:

我不确定,因为我从未使用过此功能,但据我了解: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)
{
...

【讨论】:

    【解决方案3】:

    您的代码不正确。我假设您在if ($stmt &gt; 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
    

    【讨论】:

    • 这完全没有什么不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多