$f3->set()
команды. Подключение к базе данных SQLite было бы:$f3->get('DB')->exec('…');
.abc.htm
который имеет как минимум следующее:result
массива в своем шаблоне. Как бы то ни было, Fat-Free не помешает вам проникнуть в его внутренние части SQL-обработчика. На самом деле DB\SQL
класс F3 происходит непосредственно от PDO
класса PHP, поэтому у вас все еще есть доступ к базовым компонентам PDO и примитивам, участвующим в каждом процессе, если вам нужен какой-то низкоуровневый контроль.$db->exec()
команде, вы также можете передать массив SQL-операторов:POST
переменная userID
не проходит через какой-либо процесс очистки данных, злоумышленник может передать следующую строку и необратимо повредить вашу базу данных:users
таблицей в нашей базе данных. За сценой F3 извлекает структуру users
таблицы и определяет, какие поля определяются как первичные ключи. На данный момент объект mapper еще не содержит никаких данных (он называется "сухое состояние"), а $user
var - это в основном не более чем структурированный объект, но он содержит методы, необходимые для выполнения основных операций CRUD, плюс некоторые дополнительные функции, как вы увидите позже. Теперь, чтобы извлечь запись из нашей users
таблицы, например, с полемuserID
, содержащим строковое значение tarzan
, мы используем load()
метод. Этот процесс называется "автогидратацией" объекта Data mapper.varchar
поле в вашей таблице MySQL не требует ни одного изменения в коде вашего приложения. В соответствии с MVC и "разделением проблем" администратор базы данных имеет такой же контроль над данными и структурами, как дизайнер шаблонов над шаблонами HTML/XML.visits
в нашей таблице со свойством Data mapper во время создания экземпляра объекта, $user=new DB\SQL\Mapper($db,'users');
т. е. Как только объект будет создан, $user->password
он $user->userID
будет сопоставлен с полями password
и userID
в нашей таблице соответственно.A-Z0-9
и символом подчеркивания (_
). Имена столбцов, содержащие пробелы (или специальные символы) и заключенные в кавычки в определении данных, несовместимы с ORM. Они не могут быть представлены должным образом как свойства объекта PHP.users
таблице, мы можем добавить следующий код:save()
метод. Но как F3 узнает, когда запись должна быть вставлена или обновлена? В тот момент, когда объект картографа данных автоматически гидратируется извлечением записи, фреймворк отслеживает первичные ключи записи (или _id
, в случае MongoDB и Jig) - так что он знает, какая запись должна быть обновлена или удалена-даже при изменении значений первичных ключей. Программный гидратированный картограф данных, значения которого не были извлечены из базы данных, но заполнены приложением, не будет иметь памяти предыдущих значений в своих первичных ключах. То же самое относится к MongoDB и Jig, но с использованием объекта _id
в качестве ссылки. Итак, когда мы создали экземпляр $user
объект выше и заполнил его свойства значениями из нашей программы - вообще не извлекая запись из пользовательской таблицы, F3 знает, что он должен вставить эту запись.save()
. Если вы хотите добавить новую запись в свою базу данных, вы должны сначала очистить картограф с помощью этого reset
метода:save()
во второй раз без вызова reset()
просто обновит запись, на которую в данный момент указывает картограф.erase()
метод на автогидратированном картографе данных. Например:dry
метод:copyFrom()
Метод увлажняет объект mapper элементами из переменной фреймворка массива, ключи массива которого должны иметь имена, идентичные свойствам объекта mapper, которые, в свою очередь, соответствуют именам полей записи. Таким образом, при отправке веб-формы (при условии, что атрибут HTML name установлен в userID
значение) содержимое этого поля ввода передается$_POST['userID']
, дублируется F3 в его POST.userID
переменной и сохраняется в сопоставленном поле $user->userID
в базе данных. Процесс становится очень простым, если все они имеют одинаковые имена элементов. Согласованность в ключах массива, т. е. именах шаблонных маркеров, именах переменных фреймворка и именах полей является ключевой :)Опасность: по умолчанию copyfrom
используется весь предоставленный массив. Это может привести к утечке данных безопасности, если пользователь разместит больше полей, чем вы ожидаете. Используйте 2-й параметр для настройки функции обратного вызова фильтра, чтобы избавиться от нежелательных полей для копирования.save()
,update()
, copyFrom()
Data mapper и параметризованные варианты load()
and erase()
безопасны от SQL-инъекции.load()
метод сопоставления данных извлекает только первую запись, соответствующую заданным критериям. Если у вас есть несколько записей, удовлетворяющих тому же условию, что и первая загруженная запись, вы можете использовать этот skip()
метод для навигации:$user->next()
в качестве замены$user->skip()
, и $user->prev()
если вы думаете, что это дает больше смысла$user->skip(-1)
.dry()
метод, чтобы проверить, не вышли ли вы за пределы результирующего набора. dry()
вернет TRUE, если вы попробуете skip(-1)
на первой записи. Он также вернет TRUE, если вы skip(1)
на последней записи, которая соответствует критериям извлечения.load()
Метод принимает второй аргумент: массив опций, содержащий пары ключ-значение, такие как:'visits>3'
. Затем он ограничит результаты 5 записями (на страницу), начиная со смещения страницы 2 (на основе 0). Фреймворк вернет массив состоящий из следующих элементов:paginate()
является отрицательным числом или превышает число найденных подмножеств.totalprice
Поля не существует, поэтому мы можем сказать фреймворку, чтобы он запросил у компонента database engine арифметическое произведение этих двух полей:totalprice
, которое вычисляется путем умножения unitprice
на число quantity
. SQL mapper сохраняет это правило / формулу, поэтому, когда приходит время извлекать запись из базы данных, мы можем использовать виртуальное поле как обычное отображенное поле.load()
внимание, что метод не определяет никаких критериев, поэтому все записи в таблице будут обработаны). Конечно, виртуальное поле mostNumber
все равно даст вам правильную цифру, если вы хотите ограничить выражение определенной группой записей, соответствующих заданным критериям.supplerID
in the products
table с supplierID
in the suppliers
table.unset($item->totalPrice);
. isset($item->totalPrice)
Выражение возвращает TRUE, если totalPrice
виртуальное поле было определено, или FALSE, если нет.find()
Метод ищет в users
таблице записи, соответствующие критериям, сортирует результат по userID
ним и возвращает результат в виде массива объектов mapper. find('visits>3')
отличается от load('visits>3')
него . Последнее относится к текущему $user
объекту. find()
не оказывает на него никакого влияния skip()
.Важно:
Объявление пустого условия, NULL или строки нулевой длины в качестве первого аргумента find()
or load()
приведет к извлечению всех записей. Убедитесь, что вы знаете, что делаете - вы можете превысить "memory_limit" PHP на больших таблицах или коллекцияхfind()
метод имеет следующий синтаксис:cast()
метод:count()
метод.select()
метод, который аналогиченfind()
, но обеспечивает более мелкозернистый контроль над возвращаемыми полями. Он имеет SQL-подобный синтаксис:find()
и метод, select()
он не изменяет содержимое объекта mapper. Он служит только в качестве удобного метода для запроса сопоставленной таблицы. Возвращаемое значение обоих методов представляет собой массив объектов mapper. Использование dry()
для определения того, была ли запись найдена одним из этих методов, неуместно. Если ни одна запись не соответствует критерию find()
илиselect()
, возвращаемое значение является пустым массивом.Имейте в виду:
load()
гидратирует текущий объект mapper, findone
возвращает новый гидратированный объект mapper и find
возвращает массив гидратированных объектов mapper.Опасность: массив $options for не использует параметризованные значения полей и не очищается от входных данных пользователя. Если вы просто помещаете значения GET или POST в группу, ордер, лимит или смещение, не проверяя их заранее, вы открываете проблему безопасности, и могут произойти плохие вещи.