简体   繁体   中英

Mysqli Procedural Insert Into Table not working

I am trying to insert into a table with Procedural Mysqli. It is not posting any errors nor is it posting the information to the database. Here is my code:

$query = "INSERT INTO Accounts (FirstName, LastName, Username, Password, Access) VALUES ({$_POST['FirstNameTbx']}, {$_POST['LastNameTbx']}, {$_POST['UsernameTbx']}, {$_POST['PasswordTbx']}, {$_POST['AccessDDL']})";
        mysqli_query($link, $query);
        mysqli_close($link);
        $Error .= "$query";

Update: I changed to prepared statement, now I am getting:

Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of elements in type definition string doesn't match number of bind variables in /home/bryantrx/public_html/ec/add_user.php on line 19

There are only 5 variables that need to be bound, and the UserID auto increments, so it doesn't need to be bound or referenced in the statement..

if ($stmt = $link->prepare("INSERT INTO Accounts (FirstName, LastName, Username, Password, Access) VALUES (?, ?, ?, ?, ?)")){
            $stmt->bind_param($_POST['FirstNameTbx'], $_POST['LastNameTbx'], $_POST['UsernameTbx'], $_POST['PasswordTbx'], $_POST['AccessDDL']);
            $stmt->execute();   
            $Error .= "success";
            $stmt->close();
        } else {
            echo $link->error;
        }

To get an error message you need to call mysqli_error :

$error = mysqli_error($link);

You would also make life easier (and more secure) for yourself if you built your queries using prepare and parameters :

$query = "INSERT INTO Accounts (FirstName, LastName, Username, Password, Access) 
            VALUES ( ?, ?, ?, ?, ?)";

if ($stmt = mysqli_stmt_prepare($link, $query)) {

    mysqli_stmt_bind_param($stmt, "sssss", 
                $_POST['FirstNameTbx'], 
                $_POST['LastNameTbx'], 
                $_POST['UsernameTbx'], 
                $_POST['PasswordTbx'], 
                $_POST['AccessDDL']);

    if (!mysqli_stmt_execute($stmt)) {
        $error = mysqli_stmt_error($stmt);
    }

    mysqli_stmt_close($stmt);

} else {
    $error = mysqli_error($link);
}

mysqli_close($link);

UPDATE - ok, you've swapped to OO which is fine. When using bind_param the first parameter describes the data you are binding. In this case if it is five strings, you would put 5 "s" like so:

$stmt->bind_param("sssss", 
           $_POST['FirstNameTbx'], 
           $_POST['LastNameTbx'], 
           $_POST['UsernameTbx'], 
           $_POST['PasswordTbx'], 
           $_POST['AccessDDL']);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM