2014-06-06 101 views
0

您必須在WordPress中看到過這種情況,您如何將參數傳遞給函數並根據傳遞的參數查詢數據庫。如果參數沒有通過。它將在航向上回退到默認參數。在我的自定義函數中,我想在這裏完成同樣的事情。根據數組值查詢數據庫Where Where子句

function get_module($args = NULL){ 
    $defaults = array(
     "module_id" => NULL, 
     "module_slug" => NULL, 
     "module_parent" => NULL, 
     "module_status" => "publish" 
    ); 
    global $db; 
    global $table_prefix; 
    $sql = "SELECT * FROM $table_prefix" . "modules"; 
    $query = $db->SELECT($sql); 
    return $db->FETCH_OBJECT(); 
} 
+0

而你的問題是怎麼做到的?那麼,你研究了什麼? – kero

+0

Google for「group_concat sql-server」 – Andomar

+0

我不知道要搜索什麼。我所嘗試的不是高效的代碼,它有太多的條件標籤。我不想讓任何人給我寫整個代碼,只是解釋我的下一步可能是什麼。我能自己做。 –

回答

0

好吧,讓我們一步一步來做。

如果參數沒有通過。它將航海回落到默認參數

你已經有一個$defaults陣列,現在的問題是如何與$args得到它的「合」 - 解決方案是使用array_merge()。如果您合併$args$defaults,則需要注意$args的元素覆蓋$defaults--而不是相反。 (fiddle

$options = array_merge($defaults, $args) // good 
$options = array_merge($args, $defaults) // bad 

現在的問題是:您想查詢其中值是NULL條目的數據庫?我不這麼認爲,array_filter()現在派上用場來刪除那些不需要的元素。這個小片段應該已經做的伎倆:

function notNull($value) { 
    return $value !== NULL; 
} 
$options = array_filter($options, "notNull"); 

現在你有一個數組$options應在查詢中使用。爲此,您需要遍歷數組,因爲您需要每個項目的鍵和值。在做這件事時,你已經可以製作你的WHERE部件。

$where = ""; 
if (count($options) > 0) { 
    foreach ($options as $key=>$value) { 
     if (!empty($where)) 
      $where .= " AND "; 
     else 
      $where = " WHERE "; 

     $where .= sprintf("`%s` = `%s`", $key, $value); 
    } 
} 

這將值自動轉換爲字符串由於sprintf(),你可以添加額外的檢查(數值不應在MySQL中被引用我相信)。


你也可以使用一個預先準備好的語句,它將在循環中創建,然後設置值。

+1

非常好解釋。謝謝,效果很好,我也學習了。 –