bindParam和bindValue不起作用?

Bat*_*Man 3 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

但这不是正确的方法:/

有人可以帮忙吗?:)

Fun*_*ner 8

他们没有工作,因为你的绑定值包含引号; 删除它们.

userLogin=':login'
Run Code Online (Sandbox Code Playgroud)

userLogin=:login
Run Code Online (Sandbox Code Playgroud)

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

WHERE userLogin='$usernameLC'
Run Code Online (Sandbox Code Playgroud)
  • 您需要删除绑定中的引号,如上所述,并确保您使用PDO进行连接,如下所述; 如果是这样的话.

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

阅读如何在PDO中使用预准备语句,准备和执行:


洞察力:

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

那些不同的MySQL API不会相互混合.

如果您正在使用以下内容mysqli_:


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

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

// rest of your code
Run Code Online (Sandbox Code Playgroud)

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


编辑:

"谢谢,它工作得很好.但是登录时,将提交的密码与DB中的密码进行比较会返回false.我尝试在$ _SESSION ['test']中存储收到的密码以查看它获得的内容和print_r($ _ SESSION);返回我这个:数组([test] =>数组([userPwd] => test12 [0] => test12))(test12是我的密码,userPwd是数据库中的密码字段)任何想法?^^"

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

您似乎以纯文本形式存储密码,而不是哈希.这是非常沮丧的,并且存储在会话中; 一个非常糟糕的主意.

在散列密码的堆栈上查看此问答:

使用PHP的password_hash()功能和password_verify()功能.

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


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

  • 密码列应该是VARCHAR.
  • 它也应该足够长以存储哈希.
  • 使用VARCHAR(255)是最好的.


Kev*_*vin 5

首先,如果您要准备,使用->prepare()和删除命名占位符中的引号,则不需要:

$query1 = $db0->prepare("SELECT userLogin FROM tbuser WHERE userLogin= :login");
Run Code Online (Sandbox Code Playgroud)

然后$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
Run Code Online (Sandbox Code Playgroud)