2012-07-04 111 views
-1

我有這個SQL查詢,我需要添加一個時間戳到一個名爲'創建'的字段在以前的函數更新。我加了$sqlMod = sprintf("UPDATE %s SET last_modified=now(), %s WHERE id='%s'", $table, $implodeArray, $_POST['id']);,它工作得很好。然而,我似乎無法得到正確的插入功能,它正常工作的語法。我嘗試過(created, %s) VALUES ("now(), %s") ...並且它不起作用。在php中插入時間戳

$sql = sprintf('INSERT INTO %s (%s) VALUES ("%s")', $table, implode(', ', array_map('mysql_escape_string', array_keys($values))), implode('", "',array_map('mysql_escape_string', $values))); 

目前:INSERT INTO projects (created, project_name, project_bold, project_content, id) VALUES ("now(), something", "something", "something", "46919705")

+0

不要使用'mysql_escape_string()'。改用更全面的'mysql_real_escape_string()'代替。從長遠來看,考慮切換到支持MySQLi或PDO等預處理語句的API,但您仍然需要在表名中爲動態SQL(如此)進行連接。 –

+0

'implode(',',array_map('mysql_escape_string',array_keys($ values)))'是錯誤的。 –

+0

INSERT INTO項目(創建,project_name,project_bold,project_content,id)VALUES(「now(),something」,「something」,「something」,「46919705」) – Alex

回答

1

NOW()的調用不應在引號內,但應引用後面的參數。

(created, %s) VALUES (now(), "%s") 

請勿使用mysql_escape_string()。改爲使用更全面的mysql_real_escape_string()。從長遠來看,考慮切換到支持MySQLi或PDO等預準備語句的API,儘管您仍然需要在表名中連接動態SQL,例如您正在執行的操作。

儘管MySQL支持雙引號,但字符串值的單引號更標準一些。 SWAP你的字符串和implode()通話的報價,因此最終產品的樣子:

$sql = sprintf("INSERT INTO %s (created, %s) VALUES (NOW(), '%s')", $table, implode(', ', array_map('mysql_real_escape_string', array_keys($values))), implode("', '",array_map('mysql_real_escape_string', $values))); 

以保安最後一點爲你,爲未來的讀者,我們看不到的$table起源,但如果它源自任何類型的用戶輸入,建議檢查其值與可接受表名的白名單,因爲它不能被mysql_real_escape_string()充分保護。

+0

完美!感謝的人;)是的,我必須考慮sqli。我的意思是它基本上是一樣的東西,只是功能我最後...?還是我可怕的錯誤。我知道他們已經改變了安全功能。並且沒有該表是由以前的函數定義的btw – Alex

+0

@Alex用一組動態的列和值構造一個像這樣的語句對於預處理語句可能會很棘手,但它們對於插入循環來說更快,並且您不必擔心轉義輸入值(但您仍然需要小心表格變量) –

0

你似乎是把所有的參數爲一個字符串 - 這是行不通的,因爲每個參數必須是一個獨立的實體。

您可以改用TIMESTAMP DEFAULT CURRENT_TIMESTAMP,讓數據庫爲您創建時間。

+0

插入腳本工作正常。我只是試圖添加創建的字段,並且不會使用外部腳本而不是在phpMyadmin中從我的經驗 – Alex

0

從您的$values數組中刪除created,並將其硬編碼到您的SQL字符串中。

$sql = sprintf('INSERT INTO %s (%s, created) VALUES ("%s", now())', $table, implode(', ', array_map('mysql_escape_string', array_keys($values))), implode('", "',array_map('mysql_escape_string', $values)));