我的查询一直允许我注册现有帐户

时间:2018-03-05 20:41:26

标签: php mysql pdo

我正在尝试创建一个添加学生的主帐户,并且我希望通过电子邮件或唯一的USN(大学学生编号)显示某个帐户已存在

<?php 
require 'config.php';

if (isset ($_POST['fname']) && (isset($_POST['mname']) && (isset($_POST['lname']) && (isset($_POST['email']) && (isset($_POST['usn']) && (isset($_POST['schedule'])))))))
{
    $fname = $_POST['fname'];
    $mname = $_POST['mname'];
    $lname = $_POST['lname'];
    $email = $_POST['email'];
    $usn = $_POST['usn'];
    $schedule = $_POST['schedule'];

    $sql = 'INSERT INTO students(fname, mname, lname, email, usn, schedule) VALUES (:fname, :mname, :lname, :email, :usn, :schedule))'; 

    $statement = $db->prepare($sql);

执行变量/数组

    if ($statement->execute([':fname' => $fname, ':mname' => $mname, ':lname' => $lname, ':email' => $email, ':usn' => $usn, ':schedule' => $schedule])) 
    {

        echo "<script type= 'text/javascript'> alert('New Student Record Inserted Successfully'); </script>";
    }

尝试显示具有相同usn的学生存在的错误

        $check = $db->prepare("SELECT COUNT(*) FROM students WHERE 'usn' = :usn");
        $check->bindValue(':usn', $_POST['usn']);
        $check->execute();

    if($check->fetch(PDO::FETCH_ASSOC) > 0)
    {
    echo "<script type= 'text/javascript'> alert('User already exist.'); </script>";


    }

尝试显示存在相同电子邮件的学生

        $check2 = $db->prepare("SELECT COUNT(*) FROM students WHERE 'email' = :email");
        $check2->bindValue(':email', $_POST['email']);
        $check2->execute();

    if($check2->fetch(PDO::FETCH_ASSOC) > 0)
    {
    echo "<script type= 'text/javascript'> alert('Email already exist.'); </script>";
    }

    if (empty ($_POST['fname']) or (empty($_POST['lname']) or (empty($_POST['email']) or (empty($_POST['usn']) or (empty($_POST['schedule']))))))

    {

        echo "<script type= 'text/javascript'> alert('There are some field/s that must be filled.'); </script>";
    }


    }
?>

我尝试过这样做,但它会立即激活错误处理程序

1 个答案:

答案 0 :(得分:1)

一个问题是您在查询中引用了列标​​识符('usn' = :usn"'email' = :email"。)这会将绑定值与文字字符串'usn'和'email'进行比较。所以不要这样做。

if($check2->fetch(PDO::FETCH_ASSOC) > 0)也是一个问题。

如果您的查询成功运行,$check2->fetch(PDO::FETCH_ASSOC)将是一个包含一个值的数组,其值为&gt; 0,无论其中的值如何。 (PHP将数组转换为int以与0进行比较,即undefined behavior,但在这种情况下显然返回&gt; 0.)

您需要从结果中get the first column,然后在if条件中引用它。

if ($check2->fetchColumn() > 0) ...

此外,无论如何,如果您的某些列在表中应该保持唯一,请为它们添加唯一索引,这样即使您的应用程序没有正确捕获它们,它们也不会接受重复值。