我有一个表格,可以返回以下所有数据
$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);
值部分有很多标点符号和拼写错误的许多可能性。如果我的变量名称与字段列相同,是否有更简单/更短的方法来执行此操作?
答案 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列组成的表:col0
,col1
,col2
。
如果要插入表中存在的所有字段并且顺序相同,则可以省略在查询中列出列名称。而不是
INSERT INTO `table` (`col0`, `col1`, `col2`) VALUES ("{$val0}", "{$val1}", "{$val2}",);
试
INSERT INTO `table` VALUES ("{$val0}", "{$val1}", "{$val2}");
PS:在查询中使用它们之前,PLease会对变量值进行清理。