2017-01-04 3 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, а также должны использоваться в разделе «count case». Количество ключевых слов в $ keywords Array является переменной. Любые советы, как я могу построить count(case.. в удобном и хорошем стиле программирования?

+1

Спорный стиль ... как вы хотите избежать ценностей таким образом? Вам нужно будет добавить обработку вызова array_walk, которая будет содержать массив '$ keywords'. Но как всегда лучше использовать привязку параметров здесь ... – arkascha

ответ

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); дает:

строка (301) «SELECT count (случай, когда shorturl = 'foo', затем 1 конец) foo, count (случай, когда shorturl = 'bar', затем 1 end) bar, count (case when shorturl = 'baz' then 1 end) baz, FROM your_logs ГДЕ ДАТА (click_time) МЕЖДУ '20170102' AND '20170104' AND SHORTURL IN ('Foo', 'бар', 'БАЗ') Group By Datum»

Привет стиль программирования - вы должны определенно искать в prepared statements.

+0

Thousand Спасибо! Это очень помогает. – swapfile

+0

Один маленький вопрос относительно пункта счета. Внутри счетчика «$ sql. =» (Случай, когда shorturl = '". $ Key."' Then 1 end) ". $ Key.", ";" У меня всегда есть "," в последней строке. Когда после этого больше нет столбца, я получаю сообщение об ошибке. Должен ли я решить это с подстрокой в ​​$ sql. или есть лучший способ? – swapfile

+1

Конечно - должно было это сделать в первую очередь. Я добавил строку в образец: '$ sql = rtrim ($ sql,", ")." ";' HTH –

Смежные вопросы