我是一种新的PHP,我试图建立一个应用程序的REST API。出于某种原因,我被困在一些应该是微不足道的。我想要做的是能够插入一个新的行到计分表,它是这样定义的:
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_INSERTED_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;
}
我真的很感谢任何反馈,这让我发疯了!Thanks in advance
编辑:这是$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
)
和execute后的
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);
。当我提交时,一切都如我所料!感谢您的评论