通过MySqli使用预准备语句插入无法正确插入所有数据

时间:2014-04-12 11:41:35

标签: php mysqli insert prepare

我正在使用MySqli将一段页面内容插入到表content中的数据库中,其中包含以下列:idnamecontentparentorder其中内容的类型为TEXT。但问题是,在执行insert语句时,它会在表中插入一个新条目,但不会插入contentparent值,同时正确插入nameorder值。$this->Content我检查了所有准备函数的返回值,并且都返回了true或没有给出错误,所以我对发生的事情感到非常困惑。

类属性($this->Parentedit)已填充并包含正确的数据。此外,函数的更新/ $type部分工作得很好(因为这些部分的准备功能完全相同,这是一个奇怪的错误)。

这是执行查询的代码。 edit变量可以采用两个值:newnew,当public function Save($type) { if($type == "edit") { $query = "UPDATE `content` SET `name` = ?, `content` = ?, `parent` = ? WHERE `id` = ?"; $stmt = $this->sql->prepare($query); $stmt->bind_param("ssii", $this->Name, $this->Content, $this->Parent, $this->ID); } else if ($type == "new") { $query = "INSERT INTO `content`(`name`, `parent`, `content`, `order`) VALUES(?, ?, ?, 999)"; $stmt = $this->sql->prepare($query); $stmt->bind_param("ssi", $this->Name, $this->Content, $this->Parent); } if(!$stmt->Execute()) echo "Failed saving content-object with ID $this->ID" . mysqli_error($this->sql); $stmt->close(); } 变量无法正常运行时。

edit

我不知道为什么new部分完全正常,但bind_param部分却没有。查询确实插入了具有正确名称和顺序值的新行,因此我猜它与0函数有关。数据库中的行始终以contentparent的值{{1}}生成。

2 个答案:

答案 0 :(得分:1)

你以错误的方式绑定了;

您的值类型必须为sis,并且值顺序错误。请参阅下面的更新;

...
else if ($type == "new")
{
    $query = "INSERT INTO `content`(`name`, `parent`, `content`, `order`) VALUES(?, ?, ?, 999)";
    $stmt = $this->sql->prepare($query);
    $stmt->bind_param("sis", $this->Name, $this->Parent, $this->Content);
}
....

答案 1 :(得分:-1)

我不确定问题是什么,我不喜欢if / else逻辑。我更喜欢自己使用开关。

public function Save($type)
{
    switch($type) {

        case 'edit': 

        $query = "UPDATE `content` SET `name` = ?, `content` = ?, `parent` = ? WHERE `id` = ?";
        $stmt = $this->sql->prepare($query);
        $stmt->bind_param("ssii", $this->Name, $this->Content, $this->Parent, $this->ID);

        if(!$stmt->Execute()) {
            echo "Failed saving content-object with ID $this->ID" . mysqli_error($this->sql);
                    $stmt->close();
        }else{
                    $stmt->close();
            }
        break;

        case 'new':

        $query = "INSERT INTO `content`(`name`, `parent`, `content`, `order`) VALUES(?, ?, ?, 999)";
        $stmt = $this->sql->prepare($query);
        $stmt->bind_param("ssi", $this->Name, $this->Content, $this->Parent);

        if(!$stmt->Execute()) {
            echo "Failed saving content-object with ID $this->ID" . mysqli_error($this->sql);
                    $stmt->close();
        }else{
                     $stmt->close();
            }
        break;

        default: die;

    }
}

我注意到的另一件事:您连接到您的数据库并以非常不正统的方式执行您的查询。只需在所有页面上需要的配置文件中创建数据库连接并将其全局转换,然后通过函数内部的全局数组访问它,如global $database。那么你可以更轻松地执行你的东西,如$stmt = $database->prepare("INSERT INTO ....");

另外,不要在php中使用双引号,除非你要在其中留一个变量,比如echo "welcome to my website, $username";

当你在php中使用双引号时,php正在其中搜索变量,因此尽可能使用单引号来提高脚本的性能并节省服务器资源。