【问题标题】:bindParam & bindValue don't work?bindParam 和 bindValue 不起作用?
【发布时间】:2015-06-23 00:00:43
【问题描述】:

我正在尝试制作一个注册/登录系统。要检查是否未使用用户名和电子邮件地址,我使用这个:

$username = $_POST['uLogin'];
    $usernameLC = strtolower($username);
    $query1 = $db0->query("SELECT userLogin FROM tbuser WHERE userLogin=':login';");
    $query1->bindValue(":login", $usernameLC, PDO::PARAM_STR);

但它不起作用。我可以根据需要创建尽可能多的具有相同用户名的用户。通过扩展,它也不会让我连接到网站,因为它没有绑定值或任何东西,所以它无法将我的用户名与数据库中的用户名进行比较。

当我这样使用用户名时,验证用户名是否未被使用

$username = $_POST['uLogin'];
    $usernameLC = strtolower($username);
    $query1 = $db0->query("SELECT userLogin FROM tbuser WHERE userLogin='$usernameLC';");

但这不是正确的方法:/

有人可以帮忙吗? :)

【问题讨论】:

    标签: php mysql pdo bindvalue


    【解决方案1】:

    首先,如果您要准备,请使用 ->prepare(),并删除命名占位符中的引号,他们不需要这样做:

    $query1 = $db0->prepare("SELECT userLogin FROM tbuser WHERE userLogin= :login");
    

    然后$query1->execute(),绑定后的prepared statement,总而言之:

    $username = $_POST['uLogin'];
    $usernameLC = strtolower($username);
    $query1 = $db0->prepare('SELECT userLogin FROM tbuser WHERE userLogin = :login'); // prepare
    $query1->bindValue(':login', $usernameLC, PDO::PARAM_STR); // bind
    $query1->execute(); // execute
    

    【讨论】:

    • 糟糕,我没有注意到他们没有准备。很好地抓住幽灵;-)
    • @Fred-ii- 有趣的是,我只是在修复答案的缩进时注意到它哈哈:D
    • 我在(同时)输入我的,没有注意到你的回答。 OP应该选择你的接受。 干杯我刚刚在我的底部做了一个额外的注释。
    • 谢谢,效果很好。但是,登录时,将提交的密码与数据库中的密码进行比较会返回 false。我尝试将收到的密码存储在$_SESSION['test'] 中以查看它得到了什么,print_r($_SESSION); 向我返回:Array ( [test] => Array ( [userPwd] => test12 [0] => test12 ) )(test12 是我的密码,userPwd 是数据库中的密码字段)有什么想法吗? ^^'
    • 请不要在 cmets 中转储代码,这将成为 另一个 问题@BatteMan
    【解决方案2】:

    它们不起作用,因为您的绑定值包含引号;删除它们。

    userLogin=':login'
    

    作为

    userLogin=:login
    

    “当我这样使用时,验证用户名是否未被使用”

    WHERE userLogin='$usernameLC'
    
    • 您需要删除绑定中的引号,如顶部所述,并确保您使用 PDO 进行连接,如下所述; 如果就是这样。

    使用setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) 会发出语法错误信号。

    了解如何在 PDO 中使用准备好的语句来准备和执行:


    洞察力:

    确保您确实使用的是 PDO 连接,而不是基于 mysqli 的连接(未知)。我经常看到这类问题,OP 使用mysqli_ 连接和查询 PDO。

    这些不同的 MySQL API 不会相互混合。

    如果您使用mysqli_ 连接:


    error reporting 添加到文件的顶部,这将有助于发现错误(如果有关于您的 POST 数组或其他可能的错误)。

    <?php 
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    // rest of your code
    

    旁注:错误报告只能在暂存阶段完成,而不能在生产阶段完成。


    编辑:

    “谢谢,它很好用。但登录时,将提交的密码与数据库中的密码进行比较返回 false。我尝试将收到的密码存储在 $_SESSION['test'] 中以查看它得到了什么并 print_r ($_SESSION); 返回我这个: Array ( [test] => Array ( [userPwd] => test12 [0] => test12 ) ) (test12 是我的密码,userPwd 是数据库中的密码字段)知道吗? ^^"

    关于您留下的关于使用密码的评论。

    您似乎是以纯文本而不是哈希存储密码。强烈建议不要这样做,并且将其存储在会话中; 一个非常糟糕的主意

    在 Stack 上查看有关散列密码的问答:

    使用 PHP 的 password_hash() 函数和 password_verify() 函数。

    对于 PHP password_hash() compatibility pack


    存储散列密码时有关列类型和长度的说明。

    • 密码栏应为VARCHAR
    • 它还应该足够长以存储哈希。
    • 最好使用VARCHAR(255)

    【讨论】:

    • 看起来我在过去 1/2 小时内激怒了某人,尽管如此,我还是对我投了反对票。我的朋友,你将过着非常悲惨的生活。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2011-04-13
    • 2019-05-09
    • 2013-01-03
    相关资源
    最近更新 更多