成功的mysql INSERT后显示空行

时间:2014-01-25 22:07:02

标签: php mysql phpmyadmin

问题是当我填写表单时,它会在sql上插入两个条目,第一个是我输入的,第二个是空白的!我真的不知道为什么它会增加第二个。 我怀疑if($result)我认为$ result第二次执行,这就是为什么它显示空行。

<?php
$connection = mysql_connect("localhost", "db", "pass"); 
mysql_select_db("dbname", $connection); 
$name = mysql_real_escape_string(stripslashes($_POST['name']));
$email = mysql_real_escape_string(stripslashes($_POST['email']));
$password = mysql_real_escape_string(stripslashes($_POST['pass']));
$sql="INSERT INTO users VALUES('$name','$email','$password')";
$result = mysql_query($sql);

if($result) {
echo '{"success":1}'; 
} else {
echo '{"success":0,"error_message":"Sorry, your registration failed. Please go back and try    again."}';
}

?>

3 个答案:

答案 0 :(得分:2)

不确定为什么要添加空白行。表格可以提交两次吗?

你可以在这里做很多事情来提高安全性。

您可以添加一些验证,例如:

  • 检查字段是否为空
  • 确保电子邮件字段包含有效的电子邮件地址

此外,您不应将密码直接添加到数据库中。以原始形式存储密码是非常糟糕的做法。你应该首先添加一个'salt',这是一个只有你的应用程序知道的密钥(即任何随机字符串'dwewsd2r23345wfsdf')然后哈希整个事情。这将使任何设法访问您的数据库的黑客的生活变得更加困难。 See here for more on password hashing

最后,您应该使用PDO而不是mysql函数进行数据库查询。如果您使用准备好的语句将添加另一层安全性。 See here for more on PDO

答案 1 :(得分:0)

您为什么使用strip_slashes()

mysql_real_escape_string()就足够了。虽然使用PDO准备语句当然是现代的,更安全的做事方式。

我也建议你使用:

if($result !== false)而不是if($result),以确保您获得了积极的结果。

您是否可以发布查询“SHOW CREATE TABLE [table_name]”的完整结果,以便我们可以看到您的表结构?

正如其他人建议的那样,您不应该在数据库中保存纯文本密码。

function securePassword($plain_text_pw) {
  $salt = 'jklolomfg99';
  $salted_password = $salt . $password;
  $hashed_pw = md5($hashed_pw);
  return $hashed_pw;
}


function checkPassword($username,$plain_text_pw) {
  $secure_pw = securePassword($plain_text_pw);
  // query would look something like this:
  // $sql = "SELECT `id` FROM `users` WHERE `name` = "' . $username . '"
  // AND `secure_password` = "' . $secure_password . '"';
  // if no results, then return false. If 1 result, return true. log user in.
}

注意:SHA1可能比MD5更安全,但您可能不会成为世界级黑客的受害者。

答案 2 :(得分:-1)

如果您的数据库表包含多于3列,E.G id,name,email,password,那么您应指定要将值插入的列。

"INSERT INTO users (name, email, password) VALUES (:name, :email, :pass);"

虽然这样做不会导致双行插入,但您需要详细说明如何将这些值发布到此文件中。您是否偶然使用jQuery来POST值但不返回false或阻止表单上的默认操作? (从JSON回应中推断出来)

此外,你没有保护或检查它甚至POST,一个机器人可以命中你的代码并导致许多空白插入,因为你没有检查任何只是盲目插入。

如果您打算将代码投入生产,请注意有关安全性的其他答案。