mysql连接表

时间:2016-03-04 12:31:47

标签: php mysql sql

我有一个包含三个表的mysql数据库:

  1. 用户列表
  2. 项目清单
  3. 任务列表,说明哪些用户将执行哪项任务(联接表)
  4. 每天任务列表都会发生变化。所以我将在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();
                        }
                }
        }
    }
    

    你能看出我做错了吗?

1 个答案:

答案 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连接。