Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在mysql表中插入一行。它没有';不行?_Php_Mysql - Fatal编程技术网

Php 在mysql表中插入一行。它没有';不行?

Php 在mysql表中插入一行。它没有';不行?,php,mysql,Php,Mysql,我对PHP有点陌生,我正在尝试为一个应用程序构建一个RESTAPI。出于某种原因,我被一些本该微不足道的事情缠住了我想做的是能够在分数表中插入新行,定义如下: CREATE TABLE Scores( score_id INT AUTO_INCREMENT, user_id INT NOT NULL, item_id INT, score DOUBLE UNSIGNED, PRIMARY KEY (score_id)

我对PHP有点陌生,我正在尝试为一个应用程序构建一个RESTAPI。出于某种原因,我被一些本该微不足道的事情缠住了我想做的是能够在分数表中插入新行,定义如下:

CREATE TABLE Scores(
        score_id INT AUTO_INCREMENT,
        user_id INT NOT NULL,
        item_id INT,
        score DOUBLE UNSIGNED,
        PRIMARY KEY (score_id),
        FOREIGN KEY (item_id) REFERENCES Items(internal_id),
        FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE
        );
下面是我使用的PHP代码。函数
setScore
是一个类中的成员,该类还包含您将看到的
db
response
-成员。但是我已经调试了足够多的代码,以确保除了下面的函数之外的所有功能都能正常工作

POST变量的值正确,
sendResponse(200,“SCORE\u INSERTED\u SUCCESSFULLY”)
正确执行。我不会尝试插入重复的行

问题是,我没有在分数表中获得新行。然而,奇怪的是,每次我尝试插入新行时,主键都会自动递增,即使没有新行出现

我可以通过在mysql中手动运行完全相同的查询来手动插入行。例如,如果我在mysql中手动运行它,这会起作用:

INSERT INTO Scores (user_id, item_id, score) VALUES (1,2,6.0);
那么,为什么下面的方法不起作用呢

function setScore() {       
        if (isset($_POST["user_id"]) && isset($_POST["item_id"]) && isset($_POST["score"]))
            {
                $user = $_POST["user_id"];
                $item = $_POST["item_id"];                
                $score = $_POST["score"];

                $query = 'INSERT INTO Scores (user_id, item_id, score) VALUES (?,?,?)';
                $stmt = $this->db->prepare($query) or trigger_error($this->db->error."[$query]");
                $stmt->bind_param("iid", $user, $item, $score);
                $stmt->execute();
                $stmt->close();                
                $this->response->sendResponse(200, "SCORE_INSERTED_SUCCESSFULLY");
                return true;
            }
        $this->response->sendResponse(400, "Invalid request");
        return false;
    }
我真的很感激任何反馈,这让我发疯

提前谢谢

编辑:

这是执行前$stmt变量的值:

mysqli_stmt Object
(
    [affected_rows] => 0
    [insert_id] => 0
    [num_rows] => 0
    [param_count] => 3
    [field_count] => 0
    [errno] => 0
    [error] => 
    [error_list] => Array
        (
        )

    [sqlstate] => 00000
    [id] => 1
)
执行后:

mysqli_stmt Object
(
    [affected_rows] => 1
    [insert_id] => 30
    [num_rows] => 0
    [param_count] => 3
    [field_count] => 0
    [errno] => 0
    [error] => 
    [error_list] => Array
        (
        )
    [sqlstate] => 00000
    [id] => 1
)
但是我已经调试了足够多的代码,以确保除了下面的函数之外的所有功能都能正常工作

这次我不得不收回我自己的话。原来我应该发布整个类,因为我忘了我设置了
$this->db->autocommit(FALSE)。当我做出承诺时,一切都如期进行


感谢您的所有评论

您遇到了什么错误?为什么总是发送HTTP 400?尝试回显$query变量,并将其复制粘贴到MySQL中,以查看执行此操作时是否出现任何错误。除非启用了异常,否则您只是假设查询成功。您从不检查实际
execute()
上的返回值。外键故障仍可能在此时终止查询。感谢您花时间@Fred ii您是否有机会在
mysqli
连接中将
mysqli::autocommit
设置为false?尝试添加
$this->db->autocommit(true)创建数据库连接后