2013-06-24 74 views
0

我有一個返回所有的數據如下將表單數據插入數據庫的較短方式?

$name = $_POST['name']; 
$description = $_POST['description']; 
$type = $_POST['type']; 
$env1 = $_POST['environment[com1]']; 
$env2 = $_POST['environment[com2]']; 
$env3 = $_POST['environment[com3]']; 
$hltCode = $_POST['hlType[code]']; 
$hltDB = $_POST['hlType[db]']; 
$hltWCF = $_POST['hlType[wcf]']; 
$tfsID = $_POST['tfsID']; 
$release = $_POST['release']; 
$createdBy = 'mhopkins'; 
$updatedBy = 'mhopkins'; 

這當然會導致一個很長的查詢像下面

$insertQuery = "INSERT INTO patches (name, description, type, com1, com2, bofa, code, db, wcf, tfsID, release, createdBy, updatedBy) VALUES ('".$name."','".$description."''".$type."','".$envCom1."','".$envCom2."','".$envBofA."','".$hltCode."','".$hltDB."','".$hltWCF."','".$tfsID."','".$release."','".$createdBy."','".$updatedBy."'") 
$insertResult = $link->query($insertQuery); 

值部分的形狀具有標點符號和許多可能性的LOT爲錯別字。如果我的變量名稱與字段列相同,是否有更簡單/更短的方法來執行此操作?

+0

準備好的語句和:命名參數。 – mario

+0

如果「更容易」是指「避免調查入侵者在被黑客入侵後入侵的方式」,則是:清理輸入/參數化查詢以防止SQL注入。 ;-)(幽默意圖,不要嘲笑,嚴肅地說,要小心。) – Wiseguy

回答

1

你的代碼有sql注入漏洞,我甚至不會從一個可信任的源代碼運行該代碼。

您可以嘗試使用像Idiorm的ORM,它要管理的列名和逃避變量您https://idiorm.readthedocs.org/en/latest/models.html?highlight=inserthttps://github.com/j4mie/idiorm/

require_once 'idiorm.php'; 

ORM::configure(array(
    'connection_string' => 'mysql:host=localhost;dbname=my_database', 
    'username' => 'database_user', 
    'password' => 'top_secret' 
)); 

$patch = ORM::for_table('patches')->create($_POST); 
$patch->createdBy = 'mhopkins'; 
$patch->updatedBy = 'mhopkins'; 
$patch->save(); 
1

您可以嘗試使用變量從$ _POST中獲取數據並在SQL字符串中重新使用它們。

像:

<?php 
$descriptionFieldName = "description"; 
$description = $_POST[$descriptionFieldName]; 
$sql = "INSERT INTO patches ($descriptionFieldName) VALUES ($description); 
?> 

不是要短得多,那麼,甚至更長的時間。儘管如此,您只需輸入一次表單輸入名稱和SQL列名稱即可。

1

您也可以嘗試映射數組來爲你做的工作,是這樣的:

$dbColumnsToValues = array(
    'column_1' => $_POST['column1'], 
    'column_2' => $_POST['column2'], 
); 
$columns = "'" . implode("',", array_keys($dbColumnsToValues)) . "'"; 
$values = "'" . implode("',", array_map(array($link, 'escape'), array_values($dbColumnsToValues))) . "'"; 
$sql = "INSERT INTO `some_table` (".$columns.") VALUES(".$values.")"; 

雖然沒有測試,但你應該明白。
此外,假設您的$link對象有一個escape方法,它將確保您的輸入不會觸發sql注入。

1

讓我們假設您有一張由3列組成的表格:col0,col1,col2。 如果您要插入表中存在的所有字段並且順序相同,則可以省略列出查詢中的列名稱。而不是

INSERT INTO `table` (`col0`, `col1`, `col2`) VALUES ("{$val0}", "{$val1}", "{$val2}",); 

喜歡嘗試

INSERT INTO `table` VALUES ("{$val0}", "{$val1}", "{$val2}"); 

PS:請在查詢中使用前消毒的變量值。