bindParam 和 bindValue 不起作用?

bindParam & bindValue don't work?

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

$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';");

但这不是正确的方法:/

有人可以帮忙吗? :)

首先,如果您要准备,请使用 ->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

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

userLogin=':login'

作为

userLogin=:login

"Verifying if a username is not taken worked when I used it like this"

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

旁注:错误报告只能在试运行中进行,绝不能在生产中进行。


编辑:

"Thanks, it works great. When logging in though, comparing submitted password to the password in DB returns false. I try stocking the received password in $_SESSION['test'] to see what it gets and print_r($_SESSION); returns me this : Array ( [test] => Array ( [userPwd] => test12 [0] => test12 ) ) (test12 is my password, userPwd is the password Field in the db) Any idea ? ^^"

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

您似乎以纯文本而不是散列存储密码。这是非常不鼓励的,并且存储在会话中; 一个非常糟糕的主意

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

  • 问:Php 5.5 And Pdo Login
  • 答:

使用 PHP 的 password_hash() function and password_verify() 函数。

对于 PHP < 5.5 使用 password_hash() compatibility pack.


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

  • 密码栏应该是VARCHAR
  • 它也应该足够长以存储散列。
  • 最好使用 VARCHAR(255)