1

这是我在这个网站上的第一个问题,希望有人能在这里帮助我。

我有一个包含一些字段的投资者表和一个包含一些文件的项目表

Project table
---------------------
project_investor_id     1,26,29,30,39,48

数据存储为,分隔值因此,在我的投资者管理区域中,我想为登录的投资者显示特定项目,我正在使用此功能。

public function list_all_projects_by_userid ($uid){


    $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '$uid'  ORDER BY project_id DESC");    
    $i = 0;
    while ($row = mysql_fetch_assoc($rs)) {    
    $result[$i]['project_id'] = $row['project_id'];
    $result[$i]['project_investor_id'] = $row['project_investor_id'];
    $result[$i]['project_name'] = $row['project_name'];
    $result[$i]['project_location'] = $row['project_location'];
    $result[$i]['project_location'] = $row['project_location'];
    $result[$i]['project_phase'] = $row['project_phase'];
    $result[$i]['project_capital'] = $row['project_capital'];
    $result[$i]['project_notes'] = $row['project_notes'];
    $result[$i]['project_file'] = $row['project_file'];
    $i++;
    }
    return $result;
    }

但它不与项目合作有多个投资者。请让我知道如何重新编码?

谢谢你

4

2 回答 2

2

如果我理解正确,您的主要问题是您的数据库设计。

您不应该以逗号分隔保存多个投资者,而是应该建立从项目到投资者(使用“连接表”)的:m 关系(如果投资者可以投资许多项目并且许多项目可以有许多投资者)。这样,这样的查询将很容易完成。

查看引用“数据库规范化”的文章以了解有关良好数据库设计的更多信息。之后,连接和子查询将帮助您找到正确的方法。

此外,请查看有关 sql-injections 的文章(如果您不能绝对确定 $uid 是一个数字)

于 2013-09-10T12:04:19.290 回答
-1

通常,您应该有另一个映射表来处理此类事情。并使用连接进行搜索。

如果你想让你的方法起作用,你应该像这样改变你的 sql 请求:

 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%$uid%'  ORDER BY project_id DESC"); 

请参阅%在 之前和之后添加的符号$uid。它应该可以正常工作。

另外,请记住 sql 注入!您必须转义您的输入。使用 mysql_* 你可以这样做:

 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%".mysql_real_escape_string($uid) . "%'  ORDER BY project_id DESC"); 

转义函数:mysql_real_escape_string。此外,请仔细阅读链接页面的警告部分中显示的内容。

但是,您最好将项目投资者列表放入不同的表中。应该是这样的:

Project table
-------------
pr_id    pr_name


project investors map table
----------------------------
pr_id         investor_id
 1              1
 1              26
 1              29

然后,您的请求将如下所示:

$rs = mysql_query("select * from  project_table as pt join project_investor_map  as pi on pi.pr_id = pi.investor_id WHERE pi.investor_id = ".mysql_real_escape_string($uid) . "  ORDER BY project_id DESC");

这将占用一些投资者的所有项目

于 2013-09-10T12:02:35.770 回答