Php MySQL查询多个ID

Php MySQL查询多个ID,php,mysql,mysqli,Php,Mysql,Mysqli,我已经构建了一个成员资格应用程序,允许用户组装项目,其内容包含在两个表“projects”和“notes”中。每个成员都可以创建、更新或删除任意数量的项目 很好,到目前为止 我希望成员能够与他们选择的其他成员共享他们的项目。此时,我已经构建了一个功能,允许成员a键入电子邮件地址,以便与成员B共享项目。如果该电子邮件存在于DB中,则它将更新第三个表“共享”,其中包含项目所有者ID成员a,与成员ID成员B和项目ID共享的_。也许我在错误的方向上固执了 问题是:如何查询DB以向成员B显示他们自己的所有

我已经构建了一个成员资格应用程序,允许用户组装项目,其内容包含在两个表“projects”和“notes”中。每个成员都可以创建、更新或删除任意数量的项目

很好,到目前为止

我希望成员能够与他们选择的其他成员共享他们的项目。此时,我已经构建了一个功能,允许成员a键入电子邮件地址,以便与成员B共享项目。如果该电子邮件存在于DB中,则它将更新第三个表“共享”,其中包含项目所有者ID成员a,与成员ID成员B和项目ID共享的_。也许我在错误的方向上固执了

问题是:如何查询DB以向成员B显示他们自己的所有项目+与他们共享的任何项目?下面的查询说明了我一直以来的方向,但这一方向毫无用处。我想说的是,从user_id=me的项目中选择所有项目,并在“shared_with”列下的“sharing”表中选择我的id所在的所有相应项目。。。哦,是的,抓住那个项目的id,以便知道你在做哪个项目

我的脑子乱七八糟。如有任何指示,我们将不胜感激

function find_all_projects($id) {
  global $db;

  $sql = "
  SELECT * 
    FROM projects 
    LEFT 
    JOIN sharing 
      on projects.id = sharing.project_id 
   WHERE user_id = '" . db_escape($db, $id) . "' 
      OR sharing.shared_with = '" . db_escape($db, $id) . "' 
   ORDER 
      BY project_name
 ";

  $result = mysqli_query($db, $sql);
  confirm_result_set($result);  
  return $result;  
}

您可以将成员和项目之间的另一种关系与如下表一起使用:

CREATE TABLE `project_members` (
  `project_id` INT NOT NULL,
  `member_id` INT NOT NULL,
  `is_owner` TINYINT NOT NULL DEFAULT 0,
  PRIMARY KEY (`project_id`, `member_id`));
此表允许您将多个成员链接到多个项目。 列is_owner是一个布尔值,可以轻松查看该成员是所有者还是项目已共享给他。 另外,最好将外键添加到项目id和成员id。

当前表结构 根据您的问题,我相信您当前的表格结构如下所示:

TABLE: user                 TABLE: project                                  TABLE: shared

id | email              | | id | user_id | content                      | | id | user_id | project_id
---+--------------------    ---+---------+------------------------------    ---+---------+------------
1  | james@website.com  | | 1  | 1       | Project for James            | | 9  | 1       | 5
2  | hannah@website.com | | 2  | 1       | Some other project for James | | 10 | 3       | 5
3  | lucy@website.com   | | 3  | 2       | Project for Hannah           | | 11 | 1       | 8
   |                    | | 4  | 2       | A new project for hannah     | | 12 | 2       | 8
   |                    | | 5  | 2       | Hannah's pride and Joy       | |
   |                    | | 6  | 3       | Lucy cracking down           | |
   |                    | | 7  | 3       | Lucy's second project        | |
   |                    | | 8  | 3       | Lucy's public stuff          | |
SQL 例如:

交替表结构 我建议更新表结构,以便有效地拥有三个表:用户、项目和项目用户。然后,project_用户表充当两个实体用户和项目之间的管道。在这种情况下,存储两个对象之间的关系,即所有者与共享者之间的关系

TABLE: user                 TABLE: project                                  TABLE: project_user

id | email              | | id | content                      | | id | user_id | project_id | role
---+--------------------    ---+------------------------------    ---+---------+------------+-----
1  | james@website.com  | | 1  | Project for James            | | 1  | 1       | 1          | 1
2  | hannah@website.com | | 2  | Some other project for James | | 2  | 1       | 2          | 1
3  | lucy@website.com   | | 3  | Project for Hannah           | | 3  | 2       | 3          | 1
   |                    | | 4  | A new project for hannah     | | 4  | 2       | 4          | 1
   |                    | | 5  | Hannah's pride and Joy       | | 5  | 2       | 5          | 1
   |                    | | 6  | Lucy cracking down           | | 6  | 3       | 6          | 1
   |                    | | 7  | Lucy's second project        | | 7  | 3       | 7          | 1
   |                    | | 8  | Lucy's public stuff          | | 8  | 3       | 8          | 1
   |                    | |    |                              | | 9  | 1       | 5          | 2
   |                    | |    |                              | | 10 | 3       | 5          | 2
   |                    | |    |                              | | 11 | 1       | 8          | 2
   |                    | |    |                              | | 12 | 2       | 8          | 2
SQL 例如:

PHP
您应该考虑使用参数化,而不是手动转义用户数据并将其注入查询中。我认为表必须不仅共享,而且完全可用。该项目与任何人(包括业主和用户)之间的关系将在其中提及。在这种方案中,项目的选择过程非常简单。项目表中的“根据”列检测到所有者。如果是我,我现在已经忘记了所有非sql的东西,而是专注于queryI,开始时的路径与之类似,但由于多个用户与多个用户共享多个项目,我遇到了螺旋式的复杂情况。@LyleCrumbstorm使用这样的联接表往往不复杂;你遇到了什么麻烦事?我想我还没有完全意识到这个建议。它与您的相同,只是没有扩展的解释,对吗?@LyleCrumbstorm是的,这只是根据我的回答实现联接表。@LyleCrumbstorm您必须执行两个查询。一个用于获取所有所有者的项目,另一个用于获取与这些项目相关的所有用户:选择pm.project\u id,member.*从member m加入project\u members pm ON pm.member\u id=m.id,其中pm.project\u id位于所有者项目id的列表中,is\u owner=0用准备好的语句替换所有者项目id的列表。另外,如果您使用PDO而不是mysqli,您可以拥有一个非常好的数组:,数组的每个键都可以保存项目的id,每个值都是与项目相关的所有用户
AND project.user_id <> ?
$sql   = "
    SELECT project.id, project.user_id AS owner_id, shared.user_id AS shared_id, project.content
    FROM project
        LEFT JOIN shared
            ON project.id = shared.project_id
                AND project.user_id <> ?
    WHERE project.user_id = ?
        OR shared.user_id = ?
";
$query = $mysqli->prepare($sql);
$query->bind_param("iii", $user_id, $user_id, $user_id);
$query->execute();
TABLE: user                 TABLE: project                                  TABLE: project_user

id | email              | | id | content                      | | id | user_id | project_id | role
---+--------------------    ---+------------------------------    ---+---------+------------+-----
1  | james@website.com  | | 1  | Project for James            | | 1  | 1       | 1          | 1
2  | hannah@website.com | | 2  | Some other project for James | | 2  | 1       | 2          | 1
3  | lucy@website.com   | | 3  | Project for Hannah           | | 3  | 2       | 3          | 1
   |                    | | 4  | A new project for hannah     | | 4  | 2       | 4          | 1
   |                    | | 5  | Hannah's pride and Joy       | | 5  | 2       | 5          | 1
   |                    | | 6  | Lucy cracking down           | | 6  | 3       | 6          | 1
   |                    | | 7  | Lucy's second project        | | 7  | 3       | 7          | 1
   |                    | | 8  | Lucy's public stuff          | | 8  | 3       | 8          | 1
   |                    | |    |                              | | 9  | 1       | 5          | 2
   |                    | |    |                              | | 10 | 3       | 5          | 2
   |                    | |    |                              | | 11 | 1       | 8          | 2
   |                    | |    |                              | | 12 | 2       | 8          | 2
SELECT project.id, project_user.user_id, project_user.role, project.content
FROM project
    JOIN project_user
        ON project_user.project_id = project.id
WHERE project_user.user_id = ?;
$sql   = "
    SELECT project.id, project_user.user_id, project_user.role, project.content
    FROM project
        JOIN project_user
            ON project_user.project_id = project.id
    WHERE project_user.user_id = ?
";
$query = $mysqli->prepare($sql);
$query->bind_param("i", $user_id);
$query->execute();