为什么这个PHP脚本实际上没有向数据库添加行?

时间:2014-04-11 20:57:07

标签: php mysql

<?php 
    session_start(); 

    //Obtain data from register page
    $email = $_POST['email'];
    $password = $_POST['password'];

    //Check to see user has input 
    if ($username !=''  || $password !='' || $confirmpassword !='' || $email !='') {

        if ($password1 == $password2) {

            // connect to database
            $db = new mysqli('removed', 'removed','removed' ,'removed');

            // Check to see if connection was successful    
            if ($db->connect_errorno) {
                die ('Sorry, we are having some issues with our database. We should be back online soon.');
        }

            // Prepare statement
            $query = "INSERT INTO  `database`.`users` (
`id` ,
`minecraftusername` ,
`email` ,
`password` ,
`joined` ,
`rank`
)
VALUES (
NULL ,  ?,  ?,  ?, NOW( ) ,  '1'
);";
            $stmt=$db->prepare($query);
            $stmt->bind_param('sss', $username, $email, $password);
            //Execute query
            $stmt->execute();
            // header("Location: ../default.php"); 
            echo 'You have successfully registered an account!';
        } else {
            // header("Location: ../default.php"); 
            echo 'Passwords do not match.';
        }
    } else {
        // header("Location: ../default.php"); 
        echo 'Please fill out all the fields';

    }
?>  

当您尝试注册时,它会回显已注册的成功消息,但是当我转到phpmyadmin时,行数没有改变。

我真的不确定我犯了什么错误。

真的很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

$password = $_POST['password'];

这里只设置$password,但是你希望其他变量存在,

if ($username !=''  || $password !='' || $confirmpassword !='' || $email !='') {
    if ($password1 == $password2) {
永远不会设置

$confirmpassword$password1以及$password2。在@RobP和@Ali的评论中注明。

仅在$password1 == $password2时才连接到数据库,并且该块中只有die()。因此,您可以轻松跳过整个块,而不是die(),并继续尝试在未连接到数据库的情况下运行INSERT。来自@Erico的评论中注明。

if ($db->connect_errorno) {

它是connect_errno,而不是&#34; connect_errorno&#34;。如果运行了该代码块,它将生成通知:PHP Notice: Undefined property: mysqli::$connect_errorno。因此,这证明您连接到数据库的代码从未运行过。

$stmt=$db->prepare($query);
$stmt->bind_param('sss', $username, $email, $password);
$stmt->execute();

您应该始终检查prepare()execute()的返回值。如果语句有任何问题,则返回 false 。就像你有语法错误,或违反了一个独特的约束或什么。现在你的INSERT可能会失败,但你永远不会知道。在@sanketh的评论中也有提及。

否则,如果出现错误,您可以设置mysqli_report(MYSQLI_REPORT_STRICT)以引发例外情况。然后,您不需要编写代码来检查返回值,因为如果有任何mysqli错误,您的脚本将会死亡。您必须在连接到数据库之前设置此报告模式

此外,您从未为$username设置值。