这是我在这个网站上的第一个问题,希望有人能在这里帮助我。
我有一个包含一些字段的投资者表和一个包含一些文件的项目表
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;
}
但它不与有多个投资者的项目合作。请让我知道如何重新编码?
谢谢
如果我理解正确,你的主要问题是你的数据库设计。
您不应该保存多个投资者的逗号分隔,相反,您应该建立一个从项目到投资者(带有"连接表")的n:m关系(如果投资者可以投资许多项目并且许多项目可以有很多投资者)。这样,这样的查询将很容易完成。
查看引用"数据库规范化"的文章,以了解有关良好数据库设计的更多信息。之后,联接和子查询将帮助您找到执行此操作的正确方法。
此外,请查看有关sql注入的文章(如果您不能绝对确定$uid是一个数字)
通常,您应该为此类内容提供另一个映射表。并使用联接进行搜索。
如果你想让你的方法工作,你应该像这样改变你的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");
这将采取一些投资者的所有项目