【问题标题】:Adjust query according to drop down selection根据下拉选择调整查询
【发布时间】:2014-09-04 16:08:05
【问题描述】:

我想要得到的是:

我的 php 文件中有以下变量:

$tech= $_GET['Combobox10'];
$shopfloor = $_GET['Combobox8'];

我想要做的是,例如,如果从 HTML 表单中选择变量 $tech(这是一个下拉菜单)为“全部”,则必须运行以下查询以显示表中的所有技术 - 就好像不存在与 sql 查询的技术相关的部分。 $shopfloor 也是如此 - 如果选择的下拉菜单是“全部”,我希望查询忽略 $shopfloor 的部分并显示全部。当然,如果选择了特定的车间或技术,则必须强制执行查询的“拥有”部分。

$result = mysql_query ("SELECT * FROM dbo_shopfloorcells INNER JOIN (dbo_noted_by INNER JOIN (dbo_leader_name INNER JOIN (dbo_Station INNER JOIN (dbo_Shop_Floor INNER JOIN (dbo_Fault_Desc INNER JOIN 
(dbo_Machine INNER JOIN (dbo_Line_Cell_Binding INNER JOIN (dbo_Tech_Name INNER JOIN (dbo_Maint_Category INNER JOIN dbo_newprevlog2 ON dbo_Maint_Category.ID = dbo_newprevlog2.ID_Maint_Cat) 
ON dbo_Tech_Name.ID = dbo_newprevlog2.ID_Tech_Name) ON dbo_Line_Cell_Binding.PKID = dbo_newprevlog2.ID_Line_Desc) ON dbo_Machine.PKID = dbo_newprevlog2.ID_Mach_Desc) 
ON dbo_Fault_Desc.ID = dbo_newprevlog2.ID_Fault_Desc) ON dbo_Shop_Floor.ID = dbo_newprevlog2.ID_Shop_Floor) ON dbo_Station.PKID = dbo_newprevlog2.ID_Station_No) 
ON dbo_leader_name.ID = dbo_newprevlog2.ID_Leader_Name) ON dbo_noted_by.ID = dbo_newprevlog2.ID_Noted_By) ON (dbo_shopfloorcells.PKID = dbo_Line_Cell_Binding.ID_Cell_Shop_Floor) 
AND (dbo_shopfloorcells.ID_Shop_Floor = dbo_Shop_Floor.ID)
GROUP BY dbo_newprevlog2.ID, dbo_newprevlog2.Status, dbo_Shop_Floor.Shopfloor, dbo_shopfloorcells.Cell, dbo_Line_Cell_Binding.Line_Name, 
dbo_Machine.Machine_Section, dbo_Station.Station_, dbo_Tech_Name.Technician_Name, dbo_Maint_Category.Maintenance_Category, dbo_Fault_Desc.Fault_Description, 
dbo_newprevlog2.Intervention, dbo_newprevlog2.Remarks, dbo_newprevlog2.ComponentsParts, dbo_newprevlog2.StartDate1, dbo_newprevlog2.EndDate1, dbo_newprevlog2.StartTime1, 
dbo_newprevlog2.EndTime1, dbo_newprevlog2.DurationTime, dbo_newprevlog2.ID_Shop_Floor, dbo_Line_Cell_Binding.ID_Cell_Shop_Floor
having (dbo_newprevlog2.ID_Shop_Floor = $shopfloor) AND ((dbo_newprevlog2.ID_Tech_Name = $tech));");

我不知道该怎么做。例如,我尝试将 $tech 更改为此(感谢此论坛的用户 @Déjà vu):

$tech = ($_GET['Combobox10'] != "all") ? $_GET['Combobox10'] : '';

但这并没有给我这个场合所需的结果。

【问题讨论】:

  • 上次分配后 $tech 的价值是多少?

标签: php mysql drop-down-menu


【解决方案1】:

方法一

试试下面的

$tech = ($_GET['Combobox10'] != "all") ? $_GET['Combobox10'] : "dbo_newprevlog2.ID_Tech_Name";

$shopfloor = ($_GET['Combobox8'] != "all") ? $_GET['Combobox8'] : "dbo_newprevlog2.ID_Shop_Floor";

$tech = ($_GET['Combobox10'] != "all") ? $_GET['Combobox10'] : true;

$shopfloor = ($_GET['Combobox8'] != "all") ? $_GET['Combobox8'] : true;

我们的想法是跳过 mysql_query 最后一行中的检查 (having),并使其始终为真。


方法二(推荐)

虽然更好的解决方案是完全更改您的 mysql_query,跳过这些检查。

更改您的 sql 查询 (在您的评论后修改以满足您的需要)

请注意,$check 部分实际上决定将应用哪些 SQL 查询参数,具体取决于组合框中的一个或两个被选择为“全部”。

$check = "";
    if ($tech != "all" or $shopfloor != "all") $check .= "having ";
    if ($tech != "all") $check .= "(dbo_newprevlog2.ID_Tech_Name = ".$tech.")";
    if ($tech != "all" and $shopfloor != "all") $check .= " AND ";
    if ($shopfloor != "all") $check .= "(dbo_newprevlog2.ID_Shop_Floor = ".$shopfloor.")";
    
    $result = mysql_query ("SELECT * FROM dbo_shopfloorcells INNER JOIN (dbo_noted_by INNER JOIN (dbo_leader_name INNER JOIN (dbo_Station INNER JOIN (dbo_Shop_Floor INNER JOIN (dbo_Fault_Desc INNER JOIN 
    (dbo_Machine INNER JOIN (dbo_Line_Cell_Binding INNER JOIN (dbo_Tech_Name INNER JOIN (dbo_Maint_Category INNER JOIN dbo_newprevlog2 ON dbo_Maint_Category.ID = dbo_newprevlog2.ID_Maint_Cat) 
    ON dbo_Tech_Name.ID = dbo_newprevlog2.ID_Tech_Name) ON dbo_Line_Cell_Binding.PKID = dbo_newprevlog2.ID_Line_Desc) ON dbo_Machine.PKID = dbo_newprevlog2.ID_Mach_Desc) 
    ON dbo_Fault_Desc.ID = dbo_newprevlog2.ID_Fault_Desc) ON dbo_Shop_Floor.ID = dbo_newprevlog2.ID_Shop_Floor) ON dbo_Station.PKID = dbo_newprevlog2.ID_Station_No) 
    ON dbo_leader_name.ID = dbo_newprevlog2.ID_Leader_Name) ON dbo_noted_by.ID = dbo_newprevlog2.ID_Noted_By) ON (dbo_shopfloorcells.PKID = dbo_Line_Cell_Binding.ID_Cell_Shop_Floor) 
    AND (dbo_shopfloorcells.ID_Shop_Floor = dbo_Shop_Floor.ID)
    GROUP BY dbo_newprevlog2.ID, dbo_newprevlog2.Status, dbo_Shop_Floor.Shopfloor, dbo_shopfloorcells.Cell, dbo_Line_Cell_Binding.Line_Name, 
    dbo_Machine.Machine_Section, dbo_Station.Station_, dbo_Tech_Name.Technician_Name, dbo_Maint_Category.Maintenance_Category, dbo_Fault_Desc.Fault_Description, 
    dbo_newprevlog2.Intervention, dbo_newprevlog2.Remarks, dbo_newprevlog2.ComponentsParts, dbo_newprevlog2.StartDate1, dbo_newprevlog2.EndDate1, dbo_newprevlog2.StartTime1, 
    dbo_newprevlog2.EndTime1, dbo_newprevlog2.DurationTime, dbo_newprevlog2.ID_Shop_Floor, dbo_Line_Cell_Binding.ID_Cell_Shop_Floor".$check.";");

并且不需要对此进行任何更改

$tech= $_GET['Combobox10'];
$shopfloor = $_GET['Combobox8'];

【讨论】:

  • 是的,我可以按照您的最后一个解决方案(更改 SQL 查询)但是我怎样才能让它与同一查询中的其他变量一起使用?因此,我还需要绕过 AND,如 HAVING .... AND...?
  • @elstiv 再次查看,我根据您的评论更新了代码,并在代码上方添加了它的工作方式。告诉我它是否适合您的需求。
猜你喜欢
  • 2019-11-28
  • 2016-05-10
  • 1970-01-01
  • 2023-04-07
  • 2019-02-28
  • 1970-01-01
  • 2015-05-19
  • 2021-04-14
  • 1970-01-01
相关资源
最近更新 更多