2013-06-24 34 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:请在查询中使用前消毒的变量值。