Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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和mysqli创建登录表单_Php_Mysqli - Fatal编程技术网

使用PHP和mysqli创建登录表单

使用PHP和mysqli创建登录表单,php,mysqli,Php,Mysqli,我是这方面的初学者,我正在努力学习。我正在使用php、mysqli创建简单的登录表单。我已经创建了包含所有需要信息的数据库。我选择了下面的php代码来尝试在我的页面上登录用户,但现在发生的事情是,在输入正确的电子邮件和密码后,它只会将我带回到同一页面(index.php),似乎信息不正确,但我知道这是因为我自己将它们放在数据库中,它只是不想将我带到下一个页面(home.php)。请有人看看我的代码,看看我做错了什么。多谢各位 登录表单(index.php): 登录\u process.php:

我是这方面的初学者,我正在努力学习。我正在使用php、mysqli创建简单的登录表单。我已经创建了包含所有需要信息的数据库。我选择了下面的php代码来尝试在我的页面上登录用户,但现在发生的事情是,在输入正确的电子邮件和密码后,它只会将我带回到同一页面(index.php),似乎信息不正确,但我知道这是因为我自己将它们放在数据库中,它只是不想将我带到下一个页面(home.php)。请有人看看我的代码,看看我做错了什么。多谢各位

登录表单(index.php):

登录\u process.php:

require("db_config.php");

$email = $_POST['email'];
$password = $_POST['password'];

$conn = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);

$email = mysqli_real_escape_string($conn, $email);
$query = "SELECT * FROM users WHERE email = '$email'";

$result = mysqli_query($conn, $query);

if(mysqli_num_rows($result) == 0){
    header("Location: index.php");
}

$userData = mysqli_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password));

if($hash != $userData['password']){
    header("Location: index.php");
}else{
    header("Location: home.php");
}

您不能只在字符串中使用变量,您需要将它们链接在一起

那么你的

"SELECT * FROM users WHERE email = '$email'";
一定是

"SELECT * FROM users WHERE email = " . $email;
但这是不安全和不好的做法

你很容易受到攻击

你至少需要使用

以链接为例,这是一个如何编写此类查询的示例

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

请开始使用PDO和准备好的语句。试着一步一步地调试从mysqli_num_行中得到的内容。@dariusz.g PDO不是强制性的,mysqli是可以的……如果你用mysqli_error()检查错误就好了。@ClementMalet,你是对的,但是使用PDO是向前迈出的一步。使用
if($hash=$userData['password']){header(“Location:home.php”)}else{header(“Location:index.php”);}
将比您当前的结构库更好。我将进一步查找此信息。我还按照Janaka的建议进行了更正,现在我可以处理到下一页(home.php),即使我输入了错误的密码。if($hash!=$userData['password']){header(“Location:home.php”);}else{header(“Location:index.php”);}你是从你的选择中得到一个结果吗?还是它是空的?我不确定我是否理解。在我输入电子邮件和密码后,它会将我带到我想要的页面(home.php),但即使我输入了错误的电子邮件和密码,它也会将我带到下一页。我希望在输入错误的信息后,将我放回登录页面(index.php).是的,我理解。我想知道的是,在您启动
SELECT
语句后,您是否可以确认
$result
实际具有预期值!如果没有数据,将永远不会正确检查数据是否正确,因为没有可比较的数据
"SELECT * FROM users WHERE email = " . $email;
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();