【问题标题】:Building dynamic sql statement in PHP在 PHP 中构建动态 sql 语句
【发布时间】:2017-05-18 21:28:20
【问题描述】:

我有那部分代码并想构建一个动态 SQL 语句:

//Build IN Clause
$sql_IN="'".implode("','", $keywords)."'";

//Build COUNT Clause
//tbd

//Get Clicks from YOURLS LOG
$sql_get_clicks="
                    SELECT 
                        count(case when shorturl ='u0lg' then 1 end) u0lg, 
                        count(case when shorturl ='3a8h' then 1 end) 3a8h,  
                        count(case when shorturl ='abcd' then 1 end) abcd,  
                        DATE_FORMAT((click_time),'%d.%m.%Y') Datum
                    FROM 
                        `yourls_log` 
                    WHERE  
                         DATE(click_time) BETWEEN '20170102' AND '20170104' AND
                         shorturl IN (".$sql_IN.")
                    Group By Datum";

变量$keywords 是一个带有关键字的数组。关键字在 IN 子句中使用,也必须在“count case 部分”中使用。 $keywords 数组中的关键字数量是可变的。有什么技巧可以让我以简单而良好的编程风格构建count(case..

【问题讨论】:

  • 一种有问题的风格......你想如何以这种方式逃避价值观?您需要添加一个 array_walk 调用处理 $keywords 数组。但与往常一样,这里也最好使用参数绑定...

标签: php mysql yourls


【解决方案1】:

您可以迭代$keywords 数组并将每个值放入您附加在SELECT 之后和FROM 等之前的子句中。

$keywords = array("foo", "bar", "baz");
$inClause = "'".implode("','", $keywords)."'";
$sql = "SELECT ";
foreach($keywords as $key) {
  $sql.="count(case when shorturl = '".$key."' then 1 end) ".$key.", ";    
}
$sql=rtrim($sql, ", ")." ";
$sql.= "FROM `your_logs` 
  WHERE 
    DATE(click_time) BETWEEN '20170102' AND '20170104' AND
    shorturl IN (".$inClause.")
    Group By Datum";

var_dump($sql); 给出的地方:

string(301) "SELECT count(case when shorturl = 'foo' then 1 end) foo, count(case when shorturl = 'bar' then 1 end) bar, count(case when shorturl = 'baz' then 1结束)baz,来自your_logs 在哪里 DATE(click_time) BETWEEN '20170102' AND '20170104' AND 短网址输入('foo','bar','baz') 按基准分组”

关于编程风格 - 你绝对应该关注prepared statements

【讨论】:

  • 万分感谢!这很有帮助。
  • 关于计数条款的一个小问题。在 " $sql.="count(case when shorturl = '".$key."' then 1 end) ".$key.", "; " 我总是在最后一行有一个 ","。当之后没有更多的列时,我得到一个错误。我应该用 $sql 中的子字符串解决这个问题吗?还是有更好的方法?
  • 当然 - 一开始就应该这样做。我在示例中添加了一行:$sql=rtrim($sql, ", ")." ";HTH
猜你喜欢
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多