【问题标题】:Mysqli Procedural Insert Into Table not workingMysqli程序插入表不起作用
【发布时间】:2023-04-07 08:17:01
【问题描述】:

我正在尝试使用 Procedural 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]:类型定义字符串中的元素数与 /home/bryantrx/public_html/ec/add_user.php 中的绑定变量数不匹配第 19 行

需要绑定的变量只有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;
        }

【问题讨论】:

  • 你没有要求它有任何错误,所以它没有给你任何错误......原因与你的last post 相同。不要直接将 POST 值注入到查询字符串中,这很危险
  • 我可以说明你在这个查询中做错了什么,但真正的解决方案是使用准备好的查询,它会更好地解决问题。
  • 你能告诉我我在这里做错了什么吗?我在另一个页面上声明了 $link,我将其包含在其上方的一行中。
  • 您没有引用 VALUES 子句中的值。
  • 如果您使用准备好的查询,则无需担心引用。

标签: php insert mysqli


【解决方案1】:

要获取错误消息,您需要致电mysqli_error

$error = mysqli_error($link);

如果您使用prepareparameters 构建查询,您也会让自己的生活更轻松(也更安全):

$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 个字符串,您可以像这样放置 5 个“s”:

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

【讨论】:

  • 我确实注意到了这一点。我确实需要做一个准备但忘记了“sssss”。谢谢。
猜你喜欢
  • 2017-10-20
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多