bindParam& bindValue不起作用?

时间:2015-04-16 14:02:52

标签: php mysql pdo bindvalue

我试图建立一个注册/登录系统。要检查用户名和电子邮件地址是否未被使用,我使用此:

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

但这不是正确的方法:/

有人可以帮忙吗? :)

2 个答案:

答案 0 :(得分:8)

由于您的绑定值包含引号,它们无法正常工作;删除它们。

userLogin=':login'

作为

userLogin=:login
  

"当我像这样使用用户名时,验证用户名是否有效?"

WHERE userLogin='$usernameLC'
  • 您需要删除绑定中的引号,如上所述,并确保您正在使用PDO进行连接,如下所述; if 就是这种情况。

使用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