Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建登录PHP的准备语句时出错_Php_Mysql_Sql_Login_Login Page - Fatal编程技术网

创建登录PHP的准备语句时出错

创建登录PHP的准备语句时出错,php,mysql,sql,login,login-page,Php,Mysql,Sql,Login,Login Page,我经常遇到这样的错误,PHP会说“很抱歉,我们无法让您登录。”根据我设置的一个条件,即使登录正确,我为避免SQL注入而准备的系统也会失败 我的代码是这样的: global $connected; $post = filter_var_array($_POST, FILTER_SANITIZE_STRING); $pwwd = $post['password']; $usrn = $post['username']; $usrn = mysqli_real_escape_string($conn

我经常遇到这样的错误,PHP会说“很抱歉,我们无法让您登录。”根据我设置的一个条件,即使登录正确,我为避免SQL注入而准备的系统也会失败

我的代码是这样的:

global $connected;

$post = filter_var_array($_POST, FILTER_SANITIZE_STRING);
$pwwd = $post['password'];
$usrn = $post['username'];
$usrn = mysqli_real_escape_string($connected, $usrn);
$pwwd = mysqli_real_escape_string($connected, $pwwd);

if (strlen($usrn) != 0 && strlen($pwwd) != 0 && !empty($post)) {
    $usrn = stripslashes($usrn);
    $pwwd = stripslashes($pwwd);
    $hashFormat = '$2ysomenumber$';
    $salt = 'somehashobviously';
    $hashF_and_salt = $hashFormat.$salt;
    $pwwd = crypt($pwwd, $hashF_and_salt);

    if (!mysqli_connect_errno()) {
        mysqli_select_db($connected, 'someDbname') or die('Database   select error');
    } else {
        die('Failed to connect to PHPMyAdmin').mysqli_connect_error();
    }

    $query = "SELECT Username, Password FROM users WHERE Username=? AND     Password=?";

    $stmt = mysqli_stmt_init($connected);

    if (mysqli_stmt_prepare($stmt, $query)) {
        //Some error in here somewhere

        mysqli_stmt_bind_param($stmt, "ss", $usrn, $pwwd);
        mysqli_stmt_execute($stmt);

        mysqli_stmt_fetch($stmt);

        mysqli_stmt_bind_result($stmt, $check_usrn, $check_pwd);

        if (strcasecmp($usrn, $check_usrn) == 0) {
            if ($pwwd == $check_pwd) {
                echo '<h1 class="text-center">Matches</h1>';
                print_r($row);
            }

        } else {
            echo "<h1 class=text-center>We're sorry we can't log you     in.</h1>";
        }

    }

} else { //This is for strlen boolean cond
    echo "<h1 class='text-center'>Both fields must not be empty.    </h1>";
}
global$connected;
$post=过滤器\变量\数组($\过滤器\清理\字符串);
$pwwd=$post['password'];
$usrn=$post['username'];
$usrn=mysqli\u real\u escape\u字符串($connected,$usrn);
$pwwd=mysqli\u real\u escape\u字符串($connected,$pwwd);
如果(strlen($usrn)!=0和strlen($pwd)!=0和空($post)){
$usrn=stripslashes($usrn);
$pwwd=条带斜杠($pwwd);
$hashFormat='$2ysomenumber$';
$salt='somehashsalt';
$hashF_和_salt=$hashFormat.$salt;
$pwwd=crypt($pwwd,$hashF_和_salt);
如果(!mysqli\u connect\u errno()){
mysqli_select_db($connected,'someDbname')或die('Database select error');
}否则{
die('未能连接到PHPMyAdmin')。mysqli_connect_error();
}
$query=“从用户名=?和密码=?”的用户中选择用户名、密码”;
$stmt=mysqli\u stmt\u init($connected);
if(mysqli_stmt_prepare($stmt,$query)){
//这里某个地方出了点差错
mysqli_stmt_bind_param($stmt,“ss”,$usrn,$pwwd);
mysqli_stmt_execute($stmt);
mysqli_stmt_fetch($stmt);
mysqli_stmt_bind_result($stmt、$check_usrn、$check_pwd);
如果(strcasecmp($usrn,$check_usrn)==0){
如果($pwwd==$check\U pwd){
回声“匹配”;
打印(行);
}
}否则{
echo“很抱歉,我们无法让您登录。”;
}
}
}else{//这是用于strlen布尔cond的
echo“两个字段都不能为空。”;
}
我以前使用的登录页面没有事先准备好的语句,但我意识到我需要这样做以提高安全性。我的数据库工作正常,所以问题就在我添加注释“//此处某处有错误”的地方附近


我是一名相对较新的PHP程序员,也是一名一年级学生,在假期里尝试大胆的新事物!将公开阅读我得到的所有帮助,谢谢

首先,我没有看到您连接数据库的连接代码,如下所示。
$connected=msqli\u connect(主机、用户、密码、数据库名称)则无需调用
mysqli\u select\u db()
函数

其次,您正在从
mysqli\u connect\u errno()
函数检查连接,如果最后一个
mysqli\u connect()
函数没有错误代码值,则返回0作为整数(非布尔值)

第三,不需要初始化prepare语句

第四个是
mysqli\u stmt\u bind\u reslut()
mysqli\u stmt\u fetch()之前。请参阅中的注释点

使用
hash_equals()
函数来匹配密码,而不是
=
。请参阅中的警告部分


首先,我没有看到您连接数据库的连接代码,就像这样。
$connected=msqli\u connect(主机、用户、密码、数据库名称)则无需调用
mysqli\u select\u db()
函数

其次,您正在从
mysqli\u connect\u errno()
函数检查连接,如果最后一个
mysqli\u connect()
函数没有错误代码值,则返回0作为整数(非布尔值)

第三,不需要初始化prepare语句

第四个是
mysqli\u stmt\u bind\u reslut()
mysqli\u stmt\u fetch()之前。请参阅中的注释点

使用
hash_equals()
函数来匹配密码,而不是
=
。请参阅中的警告部分


就像我说的连接没有问题,我已经在另一个页面上链接了它。这只是我希望您看到的代码的一部分。但我将删除不必要的代码。谢谢你的意见,非常感谢!我刚刚意识到我的两行诗被弄混了!为了提高安全性,我还更改了检查密码的功能。如果我有这个名声;我肯定会“+1”你的评论。你为我节省了很多时间!编辑:准备好的语句与PDO语句相比如何?你认为我有足够的安全感吗?你能给我一些SQL注入,我可以测试出来,这不会对我的数据库造成伤害吗?如果这是正确的答案,请选择正确的答案。这对我有帮助。对于PDO和SQL注入,正如我所说的,连接没有问题,我已经在另一个页面上链接了它。这只是我希望您看到的代码的一部分。但我将删除不必要的代码。谢谢你的意见,非常感谢!我刚刚意识到我的两行诗被弄混了!为了提高安全性,我还更改了检查密码的功能。如果我有这个名声;我肯定会“+1”你的评论。你为我节省了很多时间!编辑:准备好的语句与PDO语句相比如何?你认为我有足够的安全感吗?你能给我一些SQL注入,我可以测试出来,这不会对我的数据库造成伤害吗?如果这是正确的答案,请选择正确的答案。这对我有帮助。对于PDO和SQL注入,请参见执行
var_dump($usrn,$check_usrn)您将在代码中看到问题所在。我的$check\u usrn和$check\u pass与我所做的相比绝对是空值。现在我如何修复它,使它们不是空值和要在数据库中检查的值执行
var\u dump($usrn,$check\u usrn)您将在代码中看到问题所在。我的$check\u usrn和$check\u pass与我所做的相比绝对是空值。现在我如何修复它,使它们不是空值和要在数据库中检查的值
$connected = msqli_connect(host,user,password,db_name) ;
 if(!$connected)
 {
     die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
 } 
    echo "Your connection is  successful . "
 if($stmt = mysqli_prepare($connected,$query))
 {
       mysqli_stmt_bind_param($stmt, "ss", $usrn, $pwwd);
       mysqli_stmt_execute($stmt);
       mysqli_stmt_bind_result($stmt, $check_usrn, $check_pwd);
       mysqli_stmt_fetch($stmt);
       /* Now do Your Work */

 } else 
   {
      /* still prepare statement doesn't work */
   } `