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

配列をマッピングして、次のようにジョブを実行することもできます。

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

ただし、テストされていませんが、要点を理解する必要があります。また、入力がSQLインジェクションをトリガーしないことを確認するメソッドがオブジェクトにある
と仮定します。$linkescape

于 2013-06-24T21:50:35.057 に答える