将表单数据插入数据库的方法较短?

时间:2013-06-24 21:33:49

标签: php mysql forms

我有一个表格,可以返回以下所有数据

$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);

值部分有很多标点符号和拼写错误的许多可能性。如果我的变量名称与字段列相同,是否有更简单/更短的方法来执行此操作?

4 个答案:

答案 0 :(得分:1)

您可以尝试使用变量从$ _POST中获取数据,并在SQL字符串中重用它们。

像:

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

不短,好,甚至更长。通过这种方式,您只需键入一次表单输入名称和SQL列名称。

答案 1 :(得分:1)

您的代码存在SQL注入漏洞,我甚至不会从受信任的来源运行该代码。

您可以尝试使用像Idiorm这样的ORM,它会为您管理列名和转义变量https://idiorm.readthedocs.org/en/latest/models.html?highlight=insert https://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();

答案 2 :(得分: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注入。

答案 3 :(得分:1)

让我们假设您有一个由3列组成的表:col0col1col2。 如果要插入表中存在的所有字段并且顺序相同,则可以省略在查询中列出列名称。而不是

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

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

PS:在查询中使用它们之前,PLease会对变量值进行清理。