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 不会相互混合。
- Connecting through PDO 在 PHP.net
如果您使用 mysqli_
连接:
- See mysqli prepared statements 以及如何使用它们。
将 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)
。
我正在尝试制作一个 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 不会相互混合。
- Connecting through PDO 在 PHP.net
如果您使用 mysqli_
连接:
- See mysqli prepared statements 以及如何使用它们。
将 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)
。