PHP - in_array,循环和if语句

时间:2017-06-16 17:23:00

标签: php mysql arrays if-statement

我有一个用于安排现场技术人员的数据库。每个现场技术都有自己独特的登录ID,只能看到自己的特定工作。我最近添加了将多个技术添加到单个故障单的功能。我目前正在运行以下循环。每个技术人员目前都能看到他独自分配的每项工作。当我开始分配多个技术时,它变得棘手。假设我总共有3个技术人员:米奇,达斯汀和迈克尔。

如果我为迈克尔和达斯汀分配一份工作作为一项多技术工作,那么在两个技术名单中都显得很好。如果我再为米奇和达斯汀分配另一份工作。我之前为Dustin分配的多项技术工作从他的名单中消失,但仍然在Michaels上展示。

我假设有些东西被卷入了循环,但我无法搞清楚。我是一个菜鸟。需要帮助。

$gettechresult = mysql_query("SELECT tech_id2, tech_id FROM jobs WHERE ((status = '2')) ORDER by $listsort;",$link);

while ($p_row =mysql_fetch_array ($gettechresult) ) {
    $tech_id2 = $p_row[tech_id2];
    $tech_id = $p_row[tech_id];
    $fids = explode(",",$tech_id2);
    $fids2 = explode(",",$tech_id);

    if (in_array($l_tech_id, $fids)) 
    {
        $techteam = 'TRUE';
    }
    else{
        $techteam = 'False';
    }
    /// Used to make sure the query is not returning False Values        
    echo "$techteam,";

    if ($grp_all == "1")
    { 
        $jobresult = mysql_query("SELECT * FROM jobs WHERE ((status = '2')) ORDER by $listsort;",$link); 
    }
    elseif ((in_array($l_tech_id, $fids))) 
    { 
        $jobresult = mysql_query("SELECT * FROM jobs WHERE ((tech_id2 ='$l_tech_id' AND status = '2' || tech_id2 IN ('".$fids."') AND status = '2')) ORDER by $listsort;",$link); 
    }
}

以下是我当前结果This is an image of the scheduled jobs currently in the database

的图片

Image of Field tech Dustin's Scheduled List - $l_tech_id = 16

唯一没有正确报告的工作是Mickey和Dustin是Multiple Techs。达斯汀是唯一没有报告一份工作的人。 $ tech_id2是将此信息捕获为数组的字段。

1 个答案:

答案 0 :(得分:0)

只要where具有2个或更多值的组合,并且测试值不是列表中的第一个,SQL tech_id2 ='$l_tech_id'条件tech_id2将为false。

相反,我建议使用MySql find_in_set函数:

where find_in_set(?, tech_id2) and status = 2

完成设置后,可以从PHP中删除相应的处理逻辑。

如果你选择这个tech_id2解决方案,那么就放弃使用tech_id,否则每个引用的真正意义就会变得一团糟。

注意:我故意在提议的SQL中添加?,因为您确实应该使用prepared statements来避免SQL injection?代表$l_tech_id值。

另外,请考虑moving away from mysql_ functions,因为它们已被弃用多年,并且在PHP 7.x中不再受支持。