2013-06-24 3 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); 

Значение секция имеет много знаков препинания и много возможностей для опечаток. Если у меня есть имена переменных, то они будут такими же, как столбцы полей, есть ли более простой/более короткий способ сделать это?

+0

Подготовленные операторы и: именованные параметры. – mario

+0

Если «проще» вы имеете в виду «избегать необходимости исследовать, как злоумышленник попал после взлома», тогда да: дезинфицируйте свои входы/параметризуйте свои запросы для защиты от SQL-инъекции. ;-) (Юмор предназначен, а не snark. При всей серьезности, будьте осторожны.) – Wiseguy

ответ

1

У вашего кода есть уязвимости в sql injection, я бы не запускал этот код даже из надежного источника.

Вы можете попробовать использовать ОРМ как Idiorm, он будет управлять имена столбцов и избежать переменных для вас 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: Пожалуйста дезинфицировать значения переменных перед их использованием в запросе.