2015-10-09 75 views
0

我想創建一個自定義MVC框架,我有一個函數,它需要在數組中並觸發插入查詢。使用PHP檢查字段的值是否是一個mysql函數

function insertFromArray($array, $table) { 

    foreach ($array as $key => $value) { 
     $fields[] = "`" . $key . "`"; 
     $values[] = "'" . $value . "'"; 
    } 
    $sql = "INSERT INTO `$table` (" . implode(",", $fields) . ") VALUES (" . implode(",", $values) . ")"; 

    mysql_query($sql); 
    return (mysql_error()) ? mysql_error() : mysql_insert_id(); 
} 

但是,當我得到一些MySQL的功能,而不是字符串或整我的功能不起作用說對已備案的名稱「日期時間」我在這種情況下獲得價值= NOW()我的查詢是

INSERT INTO `$table` (`field1`, `field2`, `dateTime`) VALUES ('value1','value2','NOW()') 

這將拋出錯誤我想要一些通用的解決方案,以便我的查詢可以在任何情況下運行,如果它是一個字符串,數字或者它是任何mysql函數。

我試着創建一個所有函數的數組,並開始比較,如果$ value的開始與mysql函數數組中的任何函數匹配,但我認爲這不是一個好辦法,那麼任何更好的方法來做到這一點

+2

請!停止使用已棄用的mysql_ *函數!他們已被棄用,並在下一個PHP版本中刪除。使用mysqli_ *或更好地使用PDO –

+1

應該有一種方法來知道它們是SQL函數而不是常規值。例如:文本框旁邊的下拉菜單,用於描述您所期望的輸入類型。在SQL函數的情況下,可能試着將它們封裝在元數據字符串中,例如:[SQL_FUNCTION = NOW()],然後在創建插入查詢之前解析它。 – Lysender

回答

0

您可以使用數組來存儲您的SQL關鍵字/函數名稱。然後在您的查詢字符串中,測試當前值是否爲SQL字。如果是,不要引用它,否則,引用它。

下面是一個例子:

function is_sql_term($term) 
{ 
    $sql_terms = array('NOW()', 'DATE()', ...); 
    return in_array($term, $sql_terms) || preg_match("/\(.*\)/", $term); 
} 

然後你測試如下:

$values[] = is_sql_term($value) ? $value : "'" . $value . "'"; 
+0

嗯,我實際上嘗試過類似的東西,但是這個邏輯失敗時,有參數在這些函數中傳遞,所以在這種情況下,我開始檢查,如果我的腳本開始匹配任何SQL函數說有一個函數DAYOFMONTH(' 11-00'),所以我開始匹配,如果我的值開始於類似「DAYOFMONTH(」,但我不相信這種方法 – Arpita

+0

「當有參數在這些函數中傳遞」),您可以簡單地使用正則表達式測試 – NaijaProgrammer

+0

用正則表達式更新了我的答案 – NaijaProgrammer

1
$values[] = "'" . $value . "'"; 

上述行將所有值視爲字符串,這會導致問題。不要將所有值視爲字符串,並用單引號括起來。

你甚至可以用2個元素使數值本身成爲一個數組本身:一個用於值,另一個用於值的類型(字符串,數字,函數等),並且在創建插入語句。

而且請使用mysql或PDO代替php的舊mysql擴展。

相關問題