Mysqli 程序插入到表中不起作用


Mysqli Procedural Insert Into Table not working

我正在尝试使用程序Mysqli插入到表中。它不会发布任何错误,也不会将信息发布到数据库。这是我的代码:

$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";

更新:我改为准备好的声明,现在我得到:

警告:mysqli_stmt::bind_param() [mysqli-stmt.bind-param]:类型定义字符串中的元素数与第 19 行/home/bryantrx/public_html/ec/add_user.php 中的绑定变量数不匹配

只有 5 个变量需要绑定,并且 UserID 会自动递增,因此不需要在语句中绑定或引用。

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;
        }

要获取错误消息,您需要调用mysqli_error:

$error = mysqli_error($link);

如果您使用 prepare 和参数构建查询,您还将使自己的生活更轻松(更安全):

$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);

更新 - 好的,你已经换成了OO,这很好。使用bind_param时,第一个参数描述要绑定的数据。在这种情况下,如果是五个字符串,你可以像这样输入 5 个"s":

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