带有数组元素 PHP 的 SQL 注释


SQL comment with array element PHP

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

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

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");

这将采取一些投资者的所有项目