Как хранить и сохранять данные в веб-приложении? - PullRequest
0 голосов
/ 26 ноября 2010

Я ищу более формально правильное и независимое решение для хранения моих данных в моих базах данных и веб-приложениях.Я слышал много мнений за несколько месяцев, но я не уверен, что ведьма верна.Планируя сделать мое веб-приложение более масштабируемым, я думаю, что удобнее хранить реальные и неэкранированные данные в базе данных, вы согласны с этим?

Теперь я использую это решение, пример с PHP5, XHTMLи псевдокод MySQLi.Я использую везде UTF-8 и no magic_quotes .

Обработка данных:

<?php
// catching data from a simple input form
$id_profile         = $_POST['id_profile'];
$details['name']        = $_POST['name'];
$details['text']            = $_POST['text'];

// filter $details
foreach($details as &$item) {   $item = trim($item); /* some stuff and other filters but no addslashes() */ }

// Preparing and doing the query
$stmt = $mysqli->prepare("
    UPDATE      profiles
    SET         name = ?, text = ?
    WHERE       id_profile = ?  ");
$stmt->bind_param('ssi', $details['name'], $details['text'], $id_profile);
$stmt->execute();
// [...]

Так что в моей базе данных есть реальнаявведенные данные без обратной косой черты.Затем, когда мне нужно вывести свой текст в точку моей страницы (включая формы, таблицы, кнопки, поля ввода, поля пароля и все атрибуты DOM), я использую эту маленькую функцию для экранирования:

<?php

//a little escape function
function e($s) { return htmlentities($s, ENT_QUOTES, 'UTF-8'); }

// Preparing and doing the query
$stmt = $mysqli->prepare("
        SELECT      name, text
        FROM        profiles
        WHERE       id_profile = ?  ");
$stmt->bind_param('i', $_POST['id_profile']);
$stmt->execute();
$stmt->bind_result($name, $text);

?>

<input type="text" id="name" value="<?=e($name) ?>"> <br />
<input type="text" id="text" value="<?=e($text) ?>"> <br />

<table>
<tr>
  <td><?=e($name) ?></td>
  <td><?=e($text) ?></td>
<td>

Этоправильно, полно и безопасно?Некоторые предложения?

1 Ответ

1 голос
/ 26 ноября 2010

Я использую расширение PDO в PHP. Это позволяет мне обернуть входные параметры в методе PDO quote():

$first_name = $this->pdo->quote($_POST['first_name']);
$sql = "INSERT INTO contacts (first_name) VALUES ('$first_name');
$res = $this->pdo->exec($sql);
...

Или использовать подстановку параметров с подготовленными операторами ...

$sql = "INSERT INTO contacts (first_name, last_name, email) VALUES (?,?,?)";
$smt = $this->pdo->prepare(array(
    $_POST['first_name'],
    $_POST['last_name'],
    $_POST['email']
));

Когда я выбираю записи базы данных, я проверяю, что строки заключены в htmlspecialchars(), а целые числа - в intval(), хотя это, вероятно, не масштабируется. Вы хотели бы создать функцию или метод, который выбирает ваши строки из базы данных и автоматически применяет любые преобразования для вас. Быстрый и грязный пример:

/**
 * @param string $table name
 * @param integer $id of record
 * @return array of returned objects
 * @abstract
 */
function select_from_db() {
    global $pdo;
    $id = intval($id);
    $row = array();
    $sql = "SELECT * FROM $table WHERE id = '$id'";
    $res = $pdo->query($sql);
    while ($row = $res->fetchObject()) {
        foreach ($row as $field => $value) {
            $row[$field] = htmlspecialchars($value);
        }
    }
    return $row;
}

// example usage:
$res = select_from_db('contacts', 1);
...