这是我在这个网站上的第一个问题,希望有人能在这里帮助我。
我有一个包含一些字段的投资者表和一个包含一些文件的项目表
Project table
---------------------
project_investor_id 1,26,29,30,39,48
数据存储为,分隔值 因此,在我的投资者管理区域,我希望显示针对logedin投资者的特定项目 我正在使用这个功能。
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;
}
但它不与项目合作有多个投资者。 请让我知道如何重新编码?
谢谢
答案 0 :(得分:2)
如果我理解你,你的主要问题是你的数据库设计。
你不应该以逗号分隔多个投资者,而应该建立一个:m-relation(如果投资者可以投资许多项目,许多项目可以有很多投资者)从项目到投资者(带有“联合表”) )。这样,这样的查询就很容易了。
查看引用“数据库规范化”的文章,了解有关良好数据库设计的更多信息。之后,联接和子查询将帮助您找到正确的方法。
另外,查看有关sql注入的文章(如果你不能绝对确定$ uid是一个数字)
答案 1 :(得分:-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");
将采取一些投资者的所有项目