У меня были проблемы с открытым ResultSets в Oracle, даже при том, что соединение было закрыто. Ошибка, которую я получил, была
"ORA-01000: maximum open cursors exceeded"
Так: Всегда закрывайте свой ResultSet!
Отфильтруйте как можно скорее. Вы должны убедиться, что весь текстовый ввод соответствует UTF-8, чтобы ваши функции обработки текста работали предсказуемо.
Но не пытайтесь отфильтровать «опасные» персонажи или фрагменты! Это не работает. Только исправляйте или отклоняйте неверные данные при вводе. Нет ничего неправильного в символах <
или '
.
Выйдите из как можно позже. Добавьте экранирование SQL в свою функцию запроса SQL (или лучше - используйте подготовленные операторы). HTML-escape в ваших HTML-шаблонах. Quoted-Printable-escape в ваших функциях генерации электронной почты, экранирование оболочки при выполнении команд CLI и т. Д.
Не позволяйте экранированным данным распространяться по всему вашему приложению, потому что чем дольше сохраняются экранированные данные, тем больше у вас шансов » Я перепутаю его с неэкранированными данными или прерву экранирование во время обработки.
Это не ' Это полное решение, но одна чрезвычайно полезная вещь в такой ситуации - это нотация в венгерском стиле. Постоянно используемая венгерская нотация меня просто раздражает, но это то место, где такие метаданные в имени переменной очень ценны. Хорошая практика - называть переменные с префиксом, который говорит, чего от них ожидать ... например, $ rawUserInput, $ escapedUserInput и т. Д.
Это не решает полностью проблему, но это хорошая практика кодирования.
Есть дюжина способов сделать это. Вот некоторые из них:
Что касается подробного описания PHP в шаблоне, ну ... он может не предлагать кратчайшие обозначения, но опять же, он предоставляет обозначение и не требует дополнительных затрат. Даже для авторов шаблонов, не относящихся к PHP, должно быть проще выучить несколько вызовов методов в PHP, чем (часто странный) язык шаблонов, который по сути заново изобретает подмножество того, что PHP может делать из коробки.
Вы также можете использовать Альтернативный синтаксис PHP и NowDoc или HereDoc в ваших шаблонах, чтобы избавиться от вызовов Php
и echo
, чтобы вы могли закончить с чем-то вроде
<?php
// get some partial block done first
foreach($this->books as $book):
$loopdata = << LOOPDATA
<li> {$book->title} - {$book->author} - {$book->publisher}</li>
LOOPDATA;
endforeach;
// render entire template
echo << HTML
<h1>{$this->title}</h1>
<ul>{$loopdata}</ul>
HTML;
Лично я не считаю это слишком привлекательным, но, как вы можете видеть, есть много способов написать свои шаблоны с помощью PHP. Просто выберите один.
Но опять же, это не похоже на хорошую практику MVC.
Полностью согласен, Модель - неподходящее место для таких представлений и хранит как HTML, так и необработанную версию каждого переменная упростит для них рассинхронизацию. Забудьте о решении 2.
Это оставляет вам альтернативные механизмы создания шаблонов или придерживаться PHP и учиться постоянно нести нагрузку вызова htmlspecialchars. Я открыт для идеи альтернативных записей шаблонов, но те, которые я пробовал до сих пор, мне не очень понравились.
(Многие отказываются от синтаксиса PHP и реализуют свои собственные ограниченные языки выражений, что означает, что вы теряете преимущество языка, который вы уже знаете и придерживаетесь нудного языка, что делает невозможным более сложную логику представления, так что вы в конечном итоге делаете это сами на PHP со строками, полными HTML, что абсолютно не победа.)
Итак, на данный момент я бы предложил Решение 0a , чтобы добавить его в кучу: define глобальная функция с коротким именем, чтобы избавиться от проблем с экранированием HTML:
<?php
function h($s) {
echo(htmlspecialchars($s, ENT_QUOTES));
}
?>
...
My lovely variable is <?php h($this->myVariable); ?>.
Я понятия не имею, почему PHP не определяет для этого ярлык, который, как вы говорите, является наиболее распространенным вариантом использования. Теперь они сбросили короткие теги для тегов в стиле XML-PI, почему нет одного с другим именем, чтобы делать правильные вещи, например, скажем Phph
?
Phph
? Определите для этого ярлык, который, как вы говорите, является наиболее распространенным вариантом использования. Теперь они сбросили короткие теги для тегов в стиле XML-PI, почему нет одного с другим именем, чтобы делать правильные вещи, например, скажем Phph
?