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

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

4

4 回答 4

1

您的代码存在 sql 注入漏洞,即使来自受信任的来源,我也不会运行该代码。

您可以尝试使用 Idiorm 之类的 ORM,它会为您管理列名和转义变量https://idiorm.readthedocs.org/en/latest/models.html?highlight=insert https://github.com/j4mie /成语/

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();
于 2013-06-24T21:42:21.160 回答
1

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

喜欢:

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

不会更短,嗯,甚至更长。虽然这种方式您只需键入一次表单输入名称和 SQL 列名称。

于 2013-06-24T21:39:56.990 回答
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 注入。

于 2013-06-24T21:50:35.057 回答
1

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

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

尝试

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

PS:请在查询中使用变量值之前对其进行清理。

于 2013-06-24T21:57:33.193 回答