3

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

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

但这不是正确的方法:/

有人可以帮忙吗?:)

4

2 回答 2

7

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

userLogin=':login'

作为

userLogin=:login

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

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

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

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


见解:

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

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

如果您mysqli_用于连接:


错误报告添加到文件顶部,这将有助于查找错误(如果有关于 POST 数组的错误)或其他可能的错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告应该只在暂存中完成,而不是在生产中完成。


编辑:

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

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

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

请参阅有关散列密码的 Stack 上的问答:

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

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


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

  • 密码列应该是VARCHAR.
  • 它还应该足够长以存储散列。
  • 使用VARCHAR(255)是最好的。
于 2015-04-16T14:05:47.917 回答
5

首先,如果您要准备、使用->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
于 2015-04-16T14:05:15.783 回答