2017-01-04 4 views
1

에 내가 코드의 일부를 가지고 동적 SQL 문을 구축하려는 :건물 동적 SQL 문은 PHP

//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 절에서 사용되며 "카운트 케이스 부분"내에서 사용해야합니다. $ keywords 배열 내의 키워드의 양은 가변적입니다. 모든 팁을 내가 어떻게 쉽고 좋은 프로그래밍 스타일로 count(case..을 만들 수 있을까요?

+1

의심스러운 스타일 ... 어떻게 이런 식으로 값을 벗어나고 싶습니까? '$ keywords' 배열을 처리하는 array_walk 호출을 추가해야합니다. 그러나 항상 그렇듯이 여기서 매개 변수 바인딩을 사용하는 것이 더 좋습니다 ... – arkascha

답변

1

당신은 $keywords 배열을 반복하고 SELECT 후 추가 조항에 각 값을 넣어 수 var_dump($sql);가 제공하는 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"; 

전에 :

문자열 (301) "select count (shorturl = 'foo'일 경우 1 끝) foo, count (shorturl = 'bar'일 때 1 끝) bar, count (shorturl = 'baz'일 때 1 end) baz, FROM your_logs WHERE DATE '20170102'BETWEEN (click_time) AND '20170104'AND ('foo는', '바', '바즈') 그룹으로 데이텀 "

감사 프로그래밍 스타일 SHORTURL - 당신은 가장 확실히 보일 것입니다 prepared statements.

+0

천만의 감사! 그것은 많은 도움이됩니다. – swapfile

+0

카운트 조항에 관한 하나의 작은 질문. "$ sql. ="개수 (shorturl = ' ". $ key."'then 1 end) ". $ key.", ";"나는 항상 마지막 행에 ","가 있습니다. 그 후 더 이상 열이 없으면 오류가 발생합니다. $ SQL 내에서 부분 문자열을 사용하여이를 해결해야합니까? 또는 더 좋은 방법이 있습니까? – swapfile

+1

처음부터 그렇게 했어야합니다. 샘플에 행을 추가했습니다 :'$ sql = rtrim ($ sql, ","). "";'HTH –