Вместо того, чтобы вставлять значение непосредственно в запрос, используйте подготовленные операторы и параметры, которые не уязвимы для SQL-инъекций .
$query = $db->prepare('SELECT name,location FROM events WHERE date >= ?');
$query->execute(array($startDate));
$insertContact = $db->prepare('INSERT INTO companies (company_name, country, ...) VALUES (?, ?, ...)');
$insertContact->execute(array('SMERSH', 'USSR', ...));
Создать объект PDO (который также подключается к БД и, следовательно, является аналогом mysql_connect
) просто:
$db = new PDO('mysql:host=localhost;dbname=db', 'user', 'passwd');
Вы не должны разбрасывать это в каждом скрипте, где вы хотите соединение с БД. Во-первых, это скорее риск для безопасности. С другой стороны, ваш код будет более подвержен опечаткам. Решение решает обе проблемы: создайте функцию или метод, который устанавливает соединение с БД. Например:
function localDBconnect($dbName='...') {
static $db = array();
if (is_null($db[$dbName])) {
$db[$dbName] = new PDO("mysql:host=localhost;dbname=$dbName", 'user', 'passwd');
$db[$dbName]->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return $db[$dbName];
}
Если вы работаете с массивом из более чем двух или трех элементов, вам следует использовать циклы или функции массива, а не длинную последовательность похожих операторов, как это делается в примере кода. Например, большая часть вашего образца может быть заменена на:
$array = array();
foreach ($_POST as $key => $val) {
$array[$key] = "'" . mysql_real_escape_string(stripslashes($val)) . "'";
}
Вот более полный пример создания запроса на вставку. Это далеко от производства готов, но это иллюстрирует основы.
$db = localDBconnect();
// map input fields to table fields
$fields = array(
'company' => 'company_name',
'country' => 'country',
'lang' => 'chat_language',
'fname' => 'contact_firstname',
'lname' => 'contact_lastname',
'email' => 'email',
'land' => 'tel_fix',
'mobile' => 'tel_mob',
'addr' => 'address',
'rating' => 'rating',
);
if ($missing = array_diff_key($fields, $_POST)) {
// Form is missing some fields, or request doesn't come from the form.
...
} else {
$registration = array_intersect_key($_POST, $fields);
$stmt = 'INSERT INTO `dbname`.`Companies` (`'
. implode('`, `', $fields) . '`) VALUES ('
. implode(', ', array_fill(0, count($registration), '?')) . ')';
try {
$query = $db->prepare($stmt);
$query->execute(array_values($registration));
} catch (PDOException $exc) {
// log an
error_log($exc);
echo "An error occurred. It's been logged, and we'll look into it.";
}
}
Чтобы сделать его готовым к работе, код должен быть преобразован в функции или классы, которые скрывают всю базу данных, связанную с остальной частью кода; это называется " уровень доступа к данным ". Использование $fields
показывает один из способов написания кода, который будет работать для произвольных структур таблиц. Посмотрите архитектуры " Model-View-Controller " для получения дополнительной информации. Кроме того, проверка должна быть выполнена.