Php 登录表单查询错误

Php 登录表单查询错误,php,mysql,login,Php,Mysql,Login,我在我的网站上创建了一个注册表单,该表单应该在一个名为mayan_users的数据库中注册用户,但当我在表单中输入详细信息并提交时,会出现“查询错误”,有人能看到我可能在哪里犯了错误吗?我已经包括了下面的代码。谢谢 <?php include("dbconnect.php"); $firstname=$_POST['first_name']; $lastname=$_POST['last_name']; $address=$_POST['addres

我在我的网站上创建了一个注册表单,该表单应该在一个名为mayan_users的数据库中注册用户,但当我在表单中输入详细信息并提交时,会出现“查询错误”,有人能看到我可能在哪里犯了错误吗?我已经包括了下面的代码。谢谢

<?php
     include("dbconnect.php");
     $firstname=$_POST['first_name'];
     $lastname=$_POST['last_name'];
     $address=$_POST['address'];
     $postcode=$_POST['postcode'];
     $emailaddress=$_POST['emailaddress'];
     $password=$_POST['password'];
     $query = "select emailaddress FROM mayan_users  where emailaddress='$emailaddress'";
      $link = mysql_query($query);
     if (!$link) {
      die('query error');
     }
     $num=mysql_num_rows($link);
     if ($num>0){
      die('email already exists'); //email already taken
     }
     $query = "insert into mayan_users (firstname, lastname, address, postcode, emailaddress, password) values('$firstname','$lastname','$address','$postcode', '$emailaddress','$password')";
     $link = @ mysql_query($query);
     if (!$link) {
      die('table write error');
     }
     ?>

首先,您需要知道,您的代码对于SQL注入是不可攻击的。出现“query error”错误的原因可能是$\u POST['emailaddress']值中输入的格式

还要确保数据库中不存储明文密码。如果网站/应用程序遭到黑客攻击,黑客可以很容易地收集密码

如果不希望从post数据中删除HTML,请删除ipSafe函数

我建议你这样做: 我增加了一些基本的安全措施。请阅读上的函数
mysql\u real\u escape\u string
htmlspecialchars

$firstname=ipSafe($_POST['firstname']);
$lastname=ipSafe($_POST['lastname']);
$address=ipSafe($_POST['address']);
$postcode=ipSafe($_POST['postcode']);
$emailaddress=ipSafe($_POST['emailaddress']);
$password=$_POST['password'];//请使用加密!:(
$sql=”
选择“电子邮件地址”`
来自“玛雅人”用户`
其中`emailaddress`='.dbSafe($emailaddress)。“'
限值1;
";
if(($query=mysql\u query($sql))&&(mysql\u num\u rows($query)<1))
{
$sqlinsert=”
插入“玛雅人”用户`(
`名字`,
`姓氏`,
`地址`,
`邮政编码`,
`电子邮件地址`,
`密码`
)
价值观(
“.dbSafe($firstname)。”,
“.dbSafe($lastname)。”,
“.dbSafe($address)。”,
“.dbSafe($postcode)。”,
“.dbSafe($emailaddress)。”,
“.dbSafe($password)。”
)
";
if(mysql_查询($sqlinsert))
{
打印“用户已添加。”;
}
其他的
{
打印“出错:”.mysql_error();
}
}
其他的
{
//数据库中存在电子邮件或错误
如果(mysql_errno()>0)
{
打印“发生错误:”.mysql_error();
}
}
函数dbSafe($string)
{
如果(获取\u魔术\u引号\u gpc())
{
$string=stripslashes($string);
}
返回mysql\u real\u escape\u字符串($string);
}
函数ipSafe($string)
{
返回htmlspecialchars(strip_标记($string));
}

只需尝试以下内容即可

HTML部分:

<form action="" method="post" name="register">
<table>
<tr><td>First Name</td><td><input type="text" name="first_name" /></td></tr>
<tr><td>Last Name</td><td><input type="text" name="last_name" /></td></tr>
<tr><td>Address</td><td><input type="text" name="address" /></td></tr>
<tr><td>Postal Code</td><td><input type="text" name="postcode" /></td></tr>
<tr><td>Email</td><td><input type="text" name="emailaddress" /></td></tr>
<tr><td>Password</td><td><input type="password" name="password" /></td></tr>
<tr><td colspan="2" align="center"><input type="submit" name="register" value="Register" /></td></tr>
</table>
</form>
<?php
$con = mysql_connect("localhost","root","") or die(mysql_error());
$select_db = mysql_select_db("mayan",$con);
if(isset($_POST['register']))
{
     $firstname = mysql_real_escape_string($_POST['first_name']);
     $lastname = mysql_real_escape_string($_POST['last_name']);
     $address = mysql_real_escape_string($_POST['address']);
     $postcode = mysql_real_escape_string($_POST['postcode']);
     $emailaddress = mysql_real_escape_string($_POST['emailaddress']);
     $password = mysql_real_escape_string($_POST['password']);

     $query = "select emailaddress FROM mayan_users where emailaddress='$emailaddress'";
     $link = mysql_query($query)or die(mysql_error());
     $num = mysql_num_rows($link);

     if ($num>0){
      echo 'Email already exists'; //email already taken
     }

     else {
     $insert_query = "insert into `mayan_users`(`firstname`,`lastname`,`address`,`postcode`,`emailaddress`,`password`) values('$firstname','$lastname','$address','$postcode','$emailaddress','$password')";
     $result = mysql_query($insert_query)or die(mysql_error());
     echo "Registered Successfully!";
     }
}
?>
CREATE TABLE IF NOT EXISTS `mayan_users` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) NOT NULL,
  `lastname` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `postcode` varchar(255) NOT NULL,
  `emailaddress` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

我认为这可能有助于您解决问题。

发布实际错误。此外,请不要使用mysql,因为它已被弃用。请改用PDO或mysqli。您需要参数化查询,使其不易受到SQL注入攻击。请使用mysql_query($query)或die(mysql_erorr());一般提示:永远不要使用“静态”错误消息。它们对调试毫无用处。mysql会告诉你为什么它会抛出错误……
或者死亡(mysql\u error())
将帮助您自己解决这一问题。另外,在获取服务器pwn3d.htmlspecialchars/striptags之前,请先阅读相关内容。sql注入对SpecialChars/striptags毫无用处,在对字符串执行sql转义后,您不应再对其进行操作。您可能会撤消转义并重新打开一个注入孔。因此,请使用-1。sql转义是最后一个在查询中使用字符串之前,请先检查字符串。我注意到我切换了函数。我知道这些函数,请查看您的注释。不,您仍在执行与
$fn=ipSafe(dbSave(…)相同的操作
顺序很重要。字符串首先会清除
html和其他不需要的字符。当您将它们放入数据库时,它们对于数据库输入是安全的,因此sql注入是安全的。是的,现在我看到您修复了顺序。但是您假设OP希望删除html。字符串没有转义或参数化…没有b上野。@Nicarus这是一个粗略的例子,可以帮助被提问的用户摆脱他上面所说的当前问题。您好,总体来说这看起来不错,但它返回时在“字段列表”中出现了一个错误“未知列”emailaddress”。不过我看不出这个错误在哪里。@JohnPeter-我理解,我认为您至少欠OP a免责声明呃,如果你打算在你的回答中发布它,我很感激任何帮助,说实话,因为这个网站是一个大学项目,我不必太担心安全问题,因为这个网站实际上永远不会上线。
CREATE TABLE IF NOT EXISTS `mayan_users` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) NOT NULL,
  `lastname` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `postcode` varchar(255) NOT NULL,
  `emailaddress` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;