我有一个包含三个表的mysql数据库:
每天任务列表都会发生变化。所以我将在phpmyadmin中手动更改此任务列表。我想要的是将每个任务分配给每个用户。我可以看到这可以在phpmyadmin中手动实现,但对于多个用户手动执行此操作并不可行。
我真的很难在我的代码中看到我做错了什么。我是php的新手。当我用postman发布正确的url时(我正在使用slim做api)它说没有错误但是当我检查我的mysql数据库时,用户任务表仍然是空的。
这是我的index.php中的代码:
$app->post('/tasks', function() use ($app) {
$headers = apache_request_headers();
$response = array();
if (isset($headers['Authorization'])){
$db = new DbHandler();
$api_key = $headers['Authorization'];
if ($api_key == '12345'){
$task_id = $db->createUserTask();
}else{
$response["error"] = true;
$response["message"] = "Invalid Api key";
echoRespnse(400, $response);
$app->stop();
}
}else{
$response["error"] = true;
$response["message"] = "Invalid Api Key";
echoRespnse(400, $response);
$app->stop();
}
});
以下是我的createUserTask函数的代码,它是DbHandler的一部分:
public function createUserTask() {
$no_users = $this->conn->prepare("SELECT MAX (id) FROM users");
$no_tasks = $this->conn->prepare("SELECT MAX (id) FROM tasks");
if ($no_users >= 0 && $no_tasks >=0){
for($i = 1; $i == $no_users; $i++){
for ($u = 1; $u == $no_tasks; $u++){
$stmt = $this->conn->prepare("INSERT INTO user_tasks(user_id, task_id) values(i, u)");
$result = $stmt->execute();
if (false === $result) {
die('execute() failed: ' . htmlspecialchars($stmt->error));
}
$stmt->close();
}
}
}
}
你能看出我做错了吗?
答案 0 :(得分:0)
我认为问题在于以下3行:
$no_users = $this->conn->prepare("SELECT MAX (id) FROM users");
$no_tasks = $this->conn->prepare("SELECT MAX (id) FROM tasks");
if ($no_users >= 0 && $no_tasks >=0){
prepare()准备要执行的语句,但不执行它,因此if()将始终求值为false。您必须执行()这些语句并从中读取返回的值。
但是,您可以在单个sql语句中完成所有操作:
insert into user_tasks(user_id, task_id)
select users.id, tasks.id from users, tasks
不需要复杂的嵌套循环。插入的选择部分产生用户和任务ID的carthesian连接。