[英]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.