簡體   English   中英

基於數組中的數據創建SQL查詢

[英]Creating an SQL Query based on data from an Array

我正在嘗試找到一種方法來簡化與我們的數據庫通信的現有功能。 該函數當前有幾個參數(最多15個),並且每次添加或更新記錄時,都需要所有參數。

我有以下PHP函數(簡體):

function addSomethingToDB($var1, $var2, $var3, $var4...) {

    # Do SQL Injection checks
    ...

    $query = 'INSERT INTO `table` (`var1`,`var2`,`var3`,`var4`) VALUES ($var1, $var2, $var3, $var4)';

    # OR

    $stmt = $db->prepare('INSERT INTO `table` (`var1`,`var2`,`var3`,`var4`) VALUES (?,?,?,?)');
    $stmt->bind_param('ssss', $var1, $var2, $var3, $var4);

}

如果您有多個變量,以上代碼顯然會變得很混亂。 如果不是所有變量都需要,則很難處理。 因此,我嘗試了第二種情況,即我有一個main / required參數,后跟一個數組,或者我只是有一個數組作為參數。

function addSomethingToDB($var1, array $attributes) {}

這里的目標是允許數組具有更靈活的方法,以防將來需要擴展SQL查詢或基於可選值構建SQL查詢。

例如:

如果未提供Var2和Var4,則數組如下所示:

{
    'var1': 'Var1_Value',
    'var3': 'Var3_Value'
}

和SQL將是:

$query = 'INSERT INTO `table` (`var1`,`var3`) VALUES ($var1, $var3);

如您所見,在上述情況下,查詢僅針對必要的值進行了調整。

我想要嘗試實現的是基於提供的值構建SQL查詢。 我首先假設要使用IF ELSE語句或SWITCH。 這給了我一些奇怪的東西,如下所示:

function getlogs($type, $id='') {

    $types = array('client_log', 'system_log', 'user_log', 'api_log', 'project_log', 'lead_log');

    if (in_array($type, $types)) {

        if ('client_log' == $type) {
            if (!empty($id)) {
                $query = 'SELECT * FROM `logs` WHERE `client_id` = ' . $id . ' AND `type` = "client_log"';
            } else {
                $query = 'SELECT * FROM `logs` WHERE `type` = "client_log"';
            }
        } elseif ('project_log' == $type) {
            if (!empty($id)) {
                $query = 'SELECT * FROM `logs` WHERE `project_id` = ' . $id . ' AND `type` = "project_log"';
            } else {
                $query = 'SELECT * FROM `logs` WHERE `type` = "project_log"';
            }
        } elseif ('user_log' == $type) {
            if (!empty($id)) {
                $query = 'SELECT * FROM `logs` WHERE `staff_id` = ' . $id . ' AND `type` = "staff_log"';
            } else {
                $query = 'SELECT * FROM `logs` WHERE `type` = "staff_log"';
            }
        } elseif ('lead_log' == $type) {
            if (!empty($id)) {
                $query = 'SELECT * FROM `logs` WHERE `client_id` = ' . $id . ' AND `type` = "lead_log"';
            } else {
                $query = 'SELECT * FROM `logs` WHERE `type` = "lead_log"';
            }
        } else {
            $query = 'SELECT * FROM `logs` WHERE `type` = ' . $type;
        }

        $logs = Config::$db->query($query);
        return $logs->fetch_all(MYSQLI_ASSOC);


    } else {
        return 'invalid log type';
    }

    $stmt->close();

}

上面的代碼並不是我想要編寫的,它是一個類似的示例,其中調用了與日志類型相關的查詢。 但這是一堆令人不悅的混亂局面。 另外,以上代碼未使用數組,這是我希望使用的數組。

最后,我希望編寫的代碼主要與更新現有記錄有關。 因此,假設我們有一個用戶。 用戶具有電子郵件以及密碼和地址。 根據上面的代碼(第一個),每次用戶更新其字段中的任何一個字段時,我們都會更新電子郵件,密碼和地址。 我想避免這種情況。

我的假設是我必須做這樣的事情:

# 1. Loop Array using maybe For or Foreach
# 2. Have a whitelisted array of allowed values.
# 3. Append to query if an Array value exists.
# 4. Run query.

我擔心我的問題出在第3點。我似乎無法弄清楚如何構建查詢,而不必經過很多凌亂的IF ELSE語句。

現在,到這一點為止,我當然已經在SO周圍搜索了類似的問題,但是,與SQL和數組相關的搜索幾乎完全與在單個SQL查詢中添加“多行”或類似內容相關。

您可以通過使用數組來實現此目的,其中的鍵是列名並包含值

$columns = [
      'field1' => 'value1', 
      'field2' => 'value2', 
      'field3' => 'value3', 
      'field4' => 'value4'
];
addSomethingToDB($columns);
function addSomethingToDB($cols){

    # Do SQL Injection checks

    $query = "INSER INTO `tablename` ( ".implode(",",array_keys($cols))." )  VALUES ( '".implode("','",array_values($cols))."' )";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM