【问题标题】:PDO Inserting and ExecutionPDO 插入和执行
【发布时间】:2013-02-16 09:29:22
【问题描述】:

首先,我的mysql知识非常有限,我决定尝试使用PDO,因为我听说使用它更安全。话虽如此,如果您在尝试帮助我时发现任何注射责任,请告诉我!无论如何,我在如何处理 PDO 查询的输出以及一般执行时遇到问题......

我尝试做的第一件事是获取表单数据,然后搜索数据库以查看是否有其他人使用相同的用户名或相同的电子邮件:

if(isset($_POST['name']) && !empty($_POST['name']) AND isset($_POST['password']) && !empty($_POST['password']) AND $_POST['password'] == $_POST['password2'] AND isset($_POST['email']) && !empty($_POST['email']) AND isset($_POST['year']) && !empty($_POST['year']) AND isset($_POST['termsandconditions']) && !empty($_POST['termsandconditions'])){
        $name = $_POST['name'];
            $password = $_POST['password'];
        $email = $_POST['email'];
        foreach ($_POST['year'] as $year);
        $termsandconditions = $_POST['termsandconditions'];

        $idqry = $sql->prepare("SELECT id FROM users WHERE username = :idcheck");
        $idqry->bindParam(':idcheck', $name, PDO::PARAM_STR,20);
        $idqry->execute();

        $emailqry = $sql->prepare("SELECT id FROM users WHERE email = :idcheck");
        $emailqry->bindParam(':emailcheck', $email, PDO::PARAM_STR, 40);
        $emailqry->execute();

稍后,我尝试使用 PDO 查询检查重复的用户名/电子邮件并创建不同的条件:

if(!eregi("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.(edu)$", $email)){
        // Return Error - Invalid Email
        $msg = 'The email you have entered is invalid, please try again.<br />*NOTE: You must use a .edu email to be able to register!';
    }elseif($idqry != FALSE){
        $msg = "That username has already been used, please try another one.";
    }elseif($emailqry != FALSE){
        $msg = 'That email has already been used, <a class=statusmsg href="../recovery/">need to recover your password?</a>.';
    }else{
        $msg = 'Your account has been made, <br /> please verify it by clicking the activation link that has been sent to your email.';
        $hash = md5(rand(0,1000));
        $hashedpass = password_hash($password, PASSWORD_BCRYPT);



        $sqlinsert = $sql->prepare("INSERT INTO users (username, password, email, hash, year, termsandconditions) VALUES (:username, :password, :email, :hash, :year, :termsandconditions)");
        $sqlinsert->execute(array(
                            ':username' => $name,
                            ':password' => $hashedpass,
                            ':email' => $email,
                            ':hash' => $hash,
                            ':year' => $year,
                            ':termsandconditions' => $termsandconditions));
    }
}

当我尝试对此进行测试时,我总是得到“该用户名已被使用,请尝试另一个”的 $msg 输出。 (即使我输入了唯一的用户名)

你看出什么不对了吗? 另外,是否可以绑定参数数据库插入? 谢谢!

【问题讨论】:

  • eregi 函数很久以前就被弃用了。你还在使用古老的php版本吗?而且,如果您想验证电子邮件地址,则不需要正则表达式。使用内置 filter_var() 函数 (>= PHP 5.2+)
  • 我同意@metal_fan 在 PHP 中使用内置函数。确保您也在客户端进行验证,以节省一些服务器处理。话虽如此,始终在服务器端进行验证。

标签: php mysql pdo


【解决方案1】:

我认为你想要做的是这个。

$idqry = $sql->prepare("SELECT id FROM users WHERE username = :idcheck");
$idqry->bindParam(':idcheck', $name, PDO::PARAM_STR,20);
$idqry->execute();
//This is how you get the number of rows returned
$rowCount = $idqry->rowCount();

if ($rowCount > 0){
echo 'user name taken';
}else{
echo 'user name available';
}

我相信你可以解决剩下的:)

【讨论】:

    【解决方案2】:

    execute 命令的返回是 TRUE 或 FALSE 值取决于查询是否成功,因此只要查询可以成功执行(这意味着表存在,选择有效,mysql 有效),那么它就是 true . (澄清:如果用户名不存在,则返回的结果是空集,但它仍然是结果,因此查询成功。)

    您应该检查是否没有返回任何结果,因为这确实表明用户名不存在:

    $idqry->execute();
    $count = $idqry->rowCount();
    
    if ($count != 0) {
        // ERROR
    }
    

    如前所述,也可以使用 rowCount() 而不是像我最初使用的那样获取所有内容。即使您试图保证最多 1 个结果,这也比获取所有数据更有效。

    【讨论】:

    • fetchAll 会有点多余,不是吗?
    • 不是真的,我认为在这种情况下,因为您仅限于 1 个结果,所以没关系。可以使用 fetch 并仅测试它是否返回 false,但无论如何都需要测试查询返回的结果数量。为什么说有点多余?
    猜你喜欢
    • 2012-12-16
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2017-09-05
    • 2012-08-30
    • 2012-11-28
    • 2019-01-12
    相关资源
    最近更新 更多