我试图建立一个注册/登录系统。要检查用户名和电子邮件地址是否未被使用,我使用此:
$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';");
但这不是正确的方法:/
有人可以帮忙吗? :)
答案 0 :(得分:8)
由于您的绑定值包含引号,它们无法正常工作;删除它们。
userLogin=':login'
作为
userLogin=:login
"当我像这样使用用户名时,验证用户名是否有效?"
WHERE userLogin='$usernameLC'
使用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
旁注:错误报告应仅在暂存时完成,而不是生产。
修改强>
&#34;谢谢,它很棒。登录时,将提交的密码与DB中的密码进行比较会返回false。我尝试在$ _SESSION [&#39; test&#39;]中存储收到的密码以查看它获得的内容和print_r($ _ SESSION);返回给我:Array([test] =&gt; Array([userPwd] =&gt; test12 [0] =&gt; test12))(test12是我的密码,userPwd是db中的密码字段)有什么想法吗? ^^&#34;
关于您使用密码的评论。
您似乎以纯文本形式存储密码,而不是哈希。这是非常沮丧的,并且存储在会话中; 一个非常糟糕的主意。
在散列密码的堆栈上查看此Q&amp; A:
使用PHP的password_hash()
函数和password_verify()
函数。
对于PHP&lt; 5.5使用password_hash() compatibility pack
。
存储散列密码时有关列类型和长度的说明。
VARCHAR
。VARCHAR(255)
。答案 1 :(得分:5)
首先,如果您要准备,请使用->prepare()
,并删除指定占位符中的引号,他们不需要这样做:
$query1 = $db0->prepare("SELECT userLogin FROM tbuser WHERE userLogin= :login");
然后$query1->execute()
,绑定后准备好的语句,总而言之:
$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