带有数组元素PHP的SQL注释

带有数组元素PHP的SQL注释,php,sql,Php,Sql,这是我在这个网站上的第一个问题,希望有人能在这里帮助我 我有一个包含一些字段的investor表和一个包含一些文件的project表 Project table --------------------- project_investor_id 1,26,29,30,39,48 存储为独立值的数据 所以,在我的投资者管理区,我想展示一个特定的项目,以便在投资者中登录 我正在使用这个函数 public function list_all_projects_by_userid ($uid)

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

我有一个包含一些字段的investor表和一个包含一些文件的project表

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;
    }
但该项目不涉及多个投资者。 请告诉我如何重新编码


谢谢

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

如果您想使您的方法起作用,您应该如下更改sql请求:

 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%$uid%'  ORDER BY project_id DESC"); 
 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%".mysql_real_escape_string($uid) . "%'  ORDER BY project_id DESC"); 
请参见
%
$uid
前后添加的符号。它应该可以很好地工作

另外,请记住sql注入!你必须逃避你的输入。有了mysql,您可以这样做:

 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%$uid%'  ORDER BY project_id DESC"); 
 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%".mysql_real_escape_string($uid) . "%'  ORDER BY project_id DESC"); 
要转义的函数:。另外,请仔细阅读链接页面警告部分中显示的内容

不过,你还是应该把项目投资者的名单放在另一张表上。应该是这样的:

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

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

通常,您应该有另一个此类项目的映射表。并使用联接进行搜索

如果您想使您的方法起作用,您应该如下更改sql请求:

 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%$uid%'  ORDER BY project_id DESC"); 
 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%".mysql_real_escape_string($uid) . "%'  ORDER BY project_id DESC"); 
请参见
%
$uid
前后添加的符号。它应该可以很好地工作

另外,请记住sql注入!你必须逃避你的输入。有了mysql,您可以这样做:

 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%$uid%'  ORDER BY project_id DESC"); 
 $rs = mysql_query("select * from  project_table WHERE project_investor_id LIKE '%".mysql_real_escape_string($uid) . "%'  ORDER BY project_id DESC"); 
要转义的函数:。另外,请仔细阅读链接页面警告部分中显示的内容

不过,你还是应该把项目投资者的名单放在另一张表上。应该是这样的:

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

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

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

您不应该将多个投资者以逗号分隔保存,相反,您应该在项目与投资者之间建立n:m关系(如果投资者可以投资多个项目,并且许多项目可以有多个投资者)(使用“联接表”)。那样的话,这样的查询就很容易了

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


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

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

您不应该将多个投资者以逗号分隔保存,相反,您应该在项目与投资者之间建立n:m关系(如果投资者可以投资多个项目,并且许多项目可以有多个投资者)(使用“联接表”)。那样的话,这样的查询就很容易了

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



此外,还可以查看有关sql注入的文章(如果您不能绝对确定$uid是一个数字)

只是一个提示,您可以将所有代码压缩到:
$result[]=$row$i++。哦,这是非常容易受到SQL注入攻击的。在
$uid
中传递的是什么?另外,你不应该在新代码中使用
mysql.*
函数,而应该尝试PDO或MySQLiI。我正在传递我当前的日志用户ID。只要一个提示,你就可以将所有代码压缩到:
$result[]=$row$i++。哦,这是非常容易受到SQL注入攻击的,
$uid
中传递了什么?另外,你不应该在新代码中使用
mysql\u*
函数,而应该尝试PDO或MySQLiI。我正在传递我当前的日志用户。你确定这种方法有效吗?假设$uid是“1,30”,因为这两个uid用于查找所有项目。你的方法不会选择问题中的第一行,是吗?编辑刚刚发现$uid只能是一个ID,没有这样理解-抱歉:-)我理解你的问题。这将在他的情况下(当前登录的用户ID)工作,但当然有多个值的问题。您好,请参阅$uid一次只有一个ID。它给出了当前登录的用户id。@FAngel这是一个类的函数。所以我认为这并不容易venerable@FAngel是的,我有另一个表供投资者使用,我正在使用此字段连接该项目的投资者。这种方法有效。非常感谢。你确定这条路行得通吗?假设$uid是“1,30”,因为这两个uid用于查找所有项目。你的方法不会选择问题中的第一行,是吗?编辑刚刚发现$uid只能是一个ID,没有这样理解-抱歉:-)我理解你的问题。这将在他的情况下(当前登录的用户ID)工作,但当然有多个值的问题。您好,请参阅$uid一次只有一个ID。它给出了当前登录的用户id。@FAngel这是一个类的函数。所以我认为这并不容易venerable@FAngel是的,我有另一个表供投资者使用,我正在使用此字段连接该项目的投资者。这种方法有效。非常感谢。谢谢。我将对此做更多的研究;)谢谢你,我会做更多的研究;)