【问题标题】:Need SQL Shorthand - PHP PDO需要 SQL 速记 - PHP PDO
【发布时间】:2017-04-11 00:11:22
【问题描述】:

好吧,我的眼睛受伤了 :) 有人建议用更短的方法来完成相同的代码吗?

以下变量的有效值可能是: $ryg 可以是:“all”、“r”、“y”或“g” $region 可以是:“all”、“na”、“emea”、“latam”或“apac”

我需要缩短/优化它,但是在漫长的一天编码之后我的眼睛受伤了(难怪)

if(($region=="all")&&($ryg=="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0));
} else if(($region=="all")&&($ryg!="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND data1_summary.overall_ryg=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,$ryg));
} else if(($region=="na")&&($ryg=="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,"na"));
} else if(($region=="na")&&($ryg!="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? AND data1_summary.overall_ryg=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,"na",$ryg));
} else if(($region=="emea")&&($ryg=="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,"emea"));
} else if(($region=="emea")&&($ryg!="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? AND data1_summary.overall_ryg=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,"emea",$ryg));
} else if(($region=="latam")&&($ryg=="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,"latam"));
} else if(($region=="latam")&&($ryg!="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? AND data1_summary.overall_ryg=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,"latam",$ryg));
} else if(($region=="apac")&&($ryg=="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,"apac"));
} else if(($region=="apac")&&($ryg!="all")) {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? AND data1_summary.overall_ryg=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,"apac",$ryg));
} else {
  $sql_main= "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? ORDER BY data1_summary.projected_margin ASC";
  $stmt = $pdo->prepare($sql_main);
  $stmt->execute(array('y',0,$region));
}

我已经厌倦了只是剪切和粘贴所有这些......

关于重写这个的最短方法的想法?

提前致谢!!

【问题讨论】:

  • 这不是编程。这是混乱。你真的需要阅读循环。 Like right now. 当您看到重复时,这表明您需要将其折叠成某种循环结构。为可能的值创建一个array 并对其进行迭代。
  • :) 谢谢。我和你在一起。
  • 这里的策略是找出哪些部分发生了变化,哪些部分是固定的,然后制作某种查找表,根据特定的区域/ryg 对定义要进行哪些修改。
  • 谢谢塔德曼。这些是我正在寻找的想法,我会想办法解决的。感谢您的反馈。
  • 当你得到它时,如果没有其他人参与,我鼓励你发布一个自我回答。这将有助于演示如何将这个怪物变成简单且可维护的东西。祝你好运!

标签: php mysql mysqli pdo


【解决方案1】:

这是减少代码的一种方法:

if ($region == "all" && $ryg == "all") {
    $sql_main = "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? ORDER BY data1_summary.projected_margin ASC";
    $stmt = $pdo->prepare($sql_main);
    $stmt->execute(array('y', 0));
} elseif ($region != "all" && $ryg != "all") {
    $sql_main = "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? AND data1_summary.overall_ryg=? ORDER BY data1_summary.projected_margin ASC";
    $stmt = $pdo->prepare($sql_main);
    $stmt->execute(array('y', 0, $region, $ryg));
} elseif ($region != "all" && $ryg == "all") {
    $sql_main = "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND project.region=? ORDER BY data1_summary.projected_margin ASC";
    $stmt = $pdo->prepare($sql_main);
    $stmt->execute(array('y', 0, $region));
} elseif ($region == "all" && $ryg != "all") {
    $sql_main = "SELECT * FROM project INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project WHERE project.active=? AND project.account_key=? AND data1_summary.overall_ryg=? ORDER BY data1_summary.projected_margin ASC";
    $stmt = $pdo->prepare($sql_main);
    $stmt->execute(array('y', 0, $ryg));
}

虽然您仍然可以对此进行优化,但您不必再为每个区域或 ryg 添加条件。

【讨论】:

  • 谢谢。实际上,我刚刚做到了这一点,但效果很好。我将继续努力使其尽可能简短和可维护。
【解决方案2】:
$sql_main = "SELECT * FROM project 
    INNER JOIN data1_summary ON project.p_key = data1_summary.p_key_project 
    WHERE project.active = ? AND project.account_key = ? "
    .(($region != "all" ? "AND project.region = ? " : null) ?: 
    ($ryg != "all" ? "AND data1_summary.overall_ryg = ? " : null)).
    " ORDER BY data1_summary.projected_margin ASC";
$stmt = $pdo->prepare($sql_main);
$stmt->execute(array('y',
    (($region != "all" ? "0,$region" : 0) ? 
        ($ryg != "all" ? "0,$ryg" : 0) : 
        (($region && $ryg) != "all") ? "0,$region,$ryg" : 0)
));

未经测试,但这应该也可以。

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 2016-09-27
    • 2019-10-02
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多