2015-05-19 164 views
0

我有一个小问题。脚本没有插入数据[MySQL/PHP]

我做了一个PHP脚本,该脚本应该将数据插入到我的数据库中,但可悲的是,它不起作用,它已经工作过。我现在正在主机上运行我的脚本,这可能是问题..但我不认为它是。

代码:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 

<?php 
$usernameErr = $emailErr = $passwordErr = $password_valErr = ""; 
$username = $email = $password = $password_val = ""; 

if($_SERVER['REQUEST_METHOD'] == 'POST') { 
    if(empty($_POST['username'])) { 
     $usernameErr = "Name is required"; 
    } else { 
     $username = validate_input($_POST['username']); 
     if(strlen($username) <= 3) { 
      $usernameErr = "Username must be 4 characters or longer."; 
     } 
     if(strlen($username) > 26) { 
      $usernameErr = "Username can't be longer as 26 characters."; 
     } 
     if(!preg_match("/^[a-zA-Z ]*$/", $username)) { 
      $usernameErr = "Only letters and white space allowed."; 
     }  
    } 

    if(empty($_POST['email'])) { 
     $emailErr = "Email is required"; 
    } else { 
     $email = validate_input($_POST['email']); 
     if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
      $emailErr = "Invalid email format."; 
     }   
    } 

    if(empty($_POST['password'])) { 
     $passwordErr = "Password is required"; 
    } else { 
     $password = validate_input($_POST['password']); 
     if(strlen($password) <= 5) { 
      $passwordErr = "Password must be 6 characters or longer."; 
     } 
     if(strlen($password) > 26) { 
      $passwordErr = "Password can't be longer as 26 characters."; 
     } 
     if(!preg_match("#[0-9]+#", $password)) { 
      $passwordErr = "Password must contain atleast 1 number."; 
     } 
    } 

    if(empty($_POST['password_val'])) { 
     $password_valErr = "Password_val is required"; 
    } else { 
     $password_val = validate_input($_POST['password_val']); 
     if($password_val != $password) { 
      $password_valErr = "Password_val must be equal to password."; 
     }  
    } 

    if($usernameErr == '' && $emailErr == '' && $passwordErr == '' && $password_valErr == '') { 

     $check_user = mysqli_query($conn, "SELECT * FROM users WHERE username='".trim($username)."'"); 
     $check_mail = mysqli_query($conn, "SELECT * FROM users WHERE email='".trim($email)."'"); 

     if(mysqli_num_rows($check_user) > 0) { 
      echo 'This username allready exists'; 
     } elseif(mysqli_num_rows($check_mail) > 0) { 
      echo 'This email address is already registered.'; 
     } else { 
      $username = mysql_real_escape_string(trim($username)); 
      $email  = mysql_real_escape_string(trim($email)); 
      $password = mysql_real_escape_string(trim($password)); 
      $rand_salt = randString(); 

      /*$final_pass = password_hash($password_val, PASSWORD_DEFAULT)."\n";*/ 
      $final_pass = sha1($password.PASSWORD_SALT.$rand_salt); 
      $privileges = 0; 

      $sql = "INSERT INTO users (username,password,salt,email) 
        VALUES ('".$username."','".$final_pass."','".$rand_salt."','".$email."')"; 

      if($conn->query($sql) === TRUE) { 
       echo "User registered."; 

      } else { 
       echo 'Error: ' . $sql . '<br>' . $conn->error; 
      } 
     } 
    } 
} 
?> 

<table border="1"> 
    <tr> 
     <td><label>Username</label><?=' <b>' . $usernameErr . '</b>';?></td> 
     <td><input type="text" name="username" value="<?=$username;?>" placeholder="Enter your desired username..." /></td> 
    </tr> 
    <tr> 
     <td><label>E-mail</label><?=' <b>' . $emailErr . '</b>';?></td> 
     <td><input type="text" name="email" value="<?=$email;?>" placeholder="Enter your email address..." /></td> 
    </tr> 
    <tr> 
     <td><label>Password<?=' <b>' . $passwordErr . '</b>';?></label></td> 
     <td><input type="password" name="password" placeholder="Enter your desired password..." /></td> 
    </tr> 
    <tr> 
     <td><label>Repeat Password<?=' <b>' . $password_valErr . '</b>';?></label></td> 
     <td><input type="password" name="password_val" placeholder="Repeat your chosen password.." /></td> 
    </tr> 
    <tr> 
     <td><input type="submit" name="register" value="Register" /></td> 
    </tr> 
</table> 
</form> 

此代码应工作,但第一个问题是:

action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" 

此代码将不得不送我去同一个页面,register.php在这种情况下, ,但不知何故,它将我发送到index.php页面。所以,如果我删除此代码,并保留采取行动空或刚进入register.php在那里,得到的数据插入除用户名和电子邮件这两者都是VARCHAR处理..

我希望有人能帮助我,

谢谢!

+0

你在混合MySQL API /函数。不能这样做。 –

+0

你也可以做'action =“”''和“self”一样。 –

+0

你也很容易受到[sql注入攻击](http://bobby-tables.com)的攻击。 –

回答

1

您正在使用mysql_函数以及连接mysqli_ API。

你不能混合这些功能。您必须从连接中使用相同的MySQL API进行查询。

  • 您需要更改的mysql_real_escape_string所有实例mysqli_real_escape_string($conn, $_POST['variable'])

  • variable是您的接线柱阵列。

另外,请确保你确实有mysqli_,而不是mysql_或PDO连接对这一问题。

  • 即使您的代码确实包含多个mysqli_函数,您仍然不确定要连接哪个MySQL API。

添加错误报告给您的文件(S)的顶部您打开PHP的标记之后。

例如<?php error_reporting(E_ALL); ini_set('display_errors', 1);那么你的代码的其余部分,看它是否得到任何东西, 以及or die(mysqli_error($conn))mysqli_query()


旁注:sha1()不被认为是用于存储散列最安全的方法。

从ircmaxell的回答中拉出https://stackoverflow.com/a/29778421/并使用PDO和准备好的陈述以及password_hash()

只需使用一个库。认真。他们的存在是有原因的。

不要自己做。如果你创建你自己的。盐,你这样做是错误您应该使用一个处理一个库,为您

$dbh = new PDO(...); 

$username = $_POST["username"]; 
$email = $_POST["email"]; 
$password = $_POST["password"]; 
$hash = password_hash($password, PASSWORD_DEFAULT); 

$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?"); 
$stmt->execute([$username, $email, $hash]); 

并会在登录:。

$sql = "SELECT * FROM users WHERE username = ?"; 
$stmt = $dbh->prepare($sql); 
$result = $stmt->execute([$_POST['username']]); 
$users = $result->fetchAll(); 
if (isset($users[0]) { 
    if (password_verify($_POST['password'], $users[0]->password) { 
     // valid login 
    } else { 
     // invalid password 
    } 
} else { 
    // invalid username 
} 
+0

我不会做变量吗?既然我已经宣布了那些并给了那些$ _POST? – Peurr

+0

@Peurr你可以,但是你可以开放给SQL注入。 –

+0

但是,会发生什么?既然我已经宣布了变量?像这样:$ email = [email protected],如果我在那之后再做mysqli_real_escape_string,它会起作用吗? – Peurr