我是PHP的新手,我正在尝试为应用构建REST API。出于某种原因,我陷入了一些应该是微不足道的事情。 我想要做的是能够在Score-table中插入一个新行,该表定义如下:
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")
正确执行。我不会尝试插入重复的行。
问题是我在Score-table中没有获得新行。但是,奇怪的是,即使没有出现新行,每次尝试插入新行时,主键都会自动递增!
我可以通过手动在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-variable的值:
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
)
答案 0 :(得分:1)
但是我已经调试了足够的代码,以便看到以下功能之外的所有功能都有效。
这次我不得不吃自己的话。事实证明我应该发布全班,因为我忘记了我设置了$this->db->autocommit(FALSE);
。当我提交一切按预期工作时!
感谢您的所有意见