-2
我正在为我的网站开发一个登录系统,但是当我将所有信息(用户,密码,电子邮件)插入到sigm-up函数的数据库中时,它将所有变量设置为0.我知道这不是传递变量的问题,因为我已经回复了用户名和密码,并且它们处于它们的意图之中。我的注册页面的代码如下:当插入表格时,PHP mysqli将变量设置为0
<?php
include '../includes/conn.php';
include 'salt.php';
if($_POST['signup']){
$user = $_POST['user'];
$pass = $_POST['pass'];
$cpass = $_POST['cpass'];
$email = $_POST['email'];
if($pass == $cpass){
$hpass = create_hash($pass);
$query = $conn->prepare("INSERT INTO Users (Name, Password, Email) VALUES (?, ?, ?)");
$query->bind_param('sss', $user, $hpass, $email);
$query->execute();
if($query){
$msg = 'Account created successfully, please check your email to verify it.';
}else{
$msg = 'There was an error creating your account: ' . $conn->error . ', please try again later';
}
//echo $user . ' ' . $pass . ' ' . $hpass . ' ' . $email;
}else{
$msg = 'Passwords do not match.';
}
}
?>
<html>
<head>
<title>DiscFire Softworks - Login test</title>
<link rel="stylesheet" type="text/css" href="../includes/ie-styles.css">
<style type="text/css">
@import url('../includes/styles.css');
</style>
</head>
<body>
<div class="body">
<img src="../images/header.jpg" />
<div class="navbar">
<?php
$query = $conn->prepare("SELECT Name FROM pages ORDER BY ID asc");
$query->execute();
$query->bind_result($name);
while($query->fetch())
{
echo '<a href="/?page=' . $name . '">' . $name . '</a>';
}
?>
</div>
<?php
echo '<p>' . $msg . '</p>';
?>
<form method="POST" action="index.php" id="sign-up">
<input type="hidden" name="signup" value="1"/>
<label for="user">Username: </label>
<input type="text" style="width: 30%; margin-left: 59px;" name="user"></textarea>
<br />
<label for="pass">Password: </label>
<input type="password" style="width: 30%; margin-left: 60px;" name="pass"></textarea>
<br />
<label for="cpass">Confirm Password: </label>
<input type="password" style="width: 30%; margin-left: 1px;" name="cpass"></textarea>
<br />
<label for="user">Email: </label>
<input type="text" style="width: 30%; margin-left: 90px;" name="email"></textarea>
<input type="submit" />
</form>
</div>
</body>
</html>
这里是SQL结构,通过@Prix的要求:提前
谢谢!
看起来您有严重的SQL注入漏洞。另外,为什么要先检查现有用户并告诉最终用户一个帐户已经存在?从安全的角度来看,这通常是不被接受的,实际上却浪费地在数据库中增加了一个额外的查询调用。只需进行插入操作,如果由于唯一的限制而失败,则只需告诉用户该帐户无法创建。您可以在执行之前显示查询的转储吗? –
你为什么使用'textarea'而不是'input'字段?你知道如果没有正确的消毒,他们可以使用输入和其他几个可以破坏登录系统的角色?你也应该把'Name'作为一个独特的领域,所以你不必浪费一个查询来知道它是否开放。您已经在使用MySQLi,似乎为什么不使用预先准备好的语句,以便避免注入?如果你要重复同样的错误,从mysql_ *库到MySQLi没有任何意义。 – Prix
看起来你有明显无意义的表格声明。 –