Двойные кавычки при использовании sqlite_escape_string - PullRequest
0 голосов
/ 02 октября 2011

Я экранирую сообщения в блоге с помощью sqlite_escape_string () и подключаюсь к базе данных, используя старый объектно-ориентированный способ.

(Да, я знаю, я должен использовать PDO, я вернусь к этому позже; преобразование этого скрипта займет довольно много времени.)

Когда у меня есть такие данные как: It's raining cats and dogs!, он сохраняет это в базу данных: It''s raining cats and dogs!.Проблема в том, что он выходит из базы данных таким образом, и stripslashes () не отменяет его.Магические кавычки отключены.

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

Вот сокращенный код отправки:

        # Grab the data from form and escape the text
        $title = sqlite_escape_string(strip_tags($_POST['title']));
        $text = sqlite_escape_string($_POST['text']);
        # Query for previous data
        $result = @$dbh->query("SELECT * FROM posts WHERE id=".$id);
        # Fetch previous data
        while($past = $result->fetchObject()) {
            $ptitle = $past->title;
            $ptext = $past->post;
        }
        # Set a base query to modify
        $base = "UPDATE posts SET ";
        # Run through scenarios
            if(stripslashes($ptitle) !== $title) { $base .= "title='".sqlite_escape_string($title)."', "; }
            if(stripslashes($ptext) !== $text) { $base .= "text='".sqlite_escape_string($text)."', "; }
            }
        # Remove last comma & space
        $base = substr($base, 0, -2);
        $base .= " WHERE id=".(int)$id;
        # Execute modified query
        @$dbh->query($base);

А вот код, который считывает данные обратно:

# Sanitize and set variables
$start = (int)$start;
$limit = (int)$limit;
$start = ($start - 1) * $limit;
$dbh = $this->dbh;
$this->limit = $limit;

# Query the database for post data
$this->result = $dbh->query("SELECT * FROM posts ORDER BY id desc LIMIT ".$start.", ".$limit);

public function loop() {
    # Do we have any posts?
    if(!empty($this->result)) {
        # Convert query results into something usable
        $this->cur_result = $this->result->fetchObject();
        # This while loop will remain true until we run out of posts
        while($post = $this->cur_result) {
            return true;
        }
        # At which point it turns false, ending the loop in the template file
        return false;
    }
    # We don't have any posts :(
    else {
        return false;
    }
}

public function content($excerpt = '') {
    # We didn't screw up and keep an empty query, did we?
    if(!empty($this->cur_result)) {
        echo stripslashes($this->cur_result->post);
    }
}

Ответы [ 2 ]

0 голосов
/ 02 октября 2011

Похоже, вы дважды экранировали данные.

В начале вашего кода у вас есть:

$title = sqlite_escape_string(strip_tags($_POST['title']));
$text = sqlite_escape_string($_POST['text']);

И тогда во вставке у вас есть:

if(stripslashes($ptitle) !== $title) { $base .= "title='".sqlite_escape_string($title)."', "; }
if(stripslashes($ptext) !== $text) { $base .= "text='".sqlite_escape_string($text)."', "; }

Удалите sqlite_escape_string из операторов if, и я думаю, что результат теперь будет корректным.

0 голосов
/ 02 октября 2011

Я подозреваю, что у вас есть magic_quotes_sybase . Опубликовать значения:

echo ini_get('magic_quotes_sybase');
echo get_magic_quotes_gpc() // Probably not relevant, but may as well be thorough.

Оба должны быть 0.

РЕДАКТИРОВАТЬ: Вы явно двойной экранирование $text и $title:

    $title = sqlite_escape_string(strip_tags($_POST['title']));
    $text = sqlite_escape_string($_POST['text']);
...
            if(stripslashes($ptitle) !== $title) { $base .= "title='".sqlite_escape_string($title)."', "; }
            if(stripslashes($ptext) !== $text) { $base .= "text='".sqlite_escape_string($text)."', "; }

Как вы знаете, подготовленные заявления являются лучшим решением. Но если вы собираетесь использовать экранирование, экранируйте каждую переменную в последний момент. Это прямо перед вызовом DB, не , когда вы читаете ввод.

Если вы используете правильно экранированные или подготовленные операторы, вам никогда не придется вызывать полоски или удалять лишние кавычки при чтении из БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...