Литературы на тему PHP, конечно, очень много.
Мне нравятся вот эти книги по стилю и содержанию.
1. Build Your Own Database Driven Web Site Using PHP & MySQL by Kevin Yank. Fourth Edition: July 2009.
Я брал, как обычно, примеры из этой книги и проверял их работу с небольшими вариантами изменений. Здесь же хороший справочник команд MySQL и функций PHP для доступа к MySQL.
Должна использоваться до отправки актуального контента (аналогично header()) !
Разные браузеры могут вводить ограничения на количество куков.
Чтобы обойти возможные ограничения браузеров, используются сессии.
Если куки хранятся на клиенте, то сессии - на web-сервере.
В качестве куки в этом случае хранится тоько id сессии юзера.
Разрешение на сессии прописывается в файле php.ini.
До передачи контента вызывается функция:
session_start();
$_SESSION['password'] = 'mypassword';
unset($_SESSION['password']);
$_SESSION = array();
session_destroy();
Браузер передаёт id сессии каждый раз при запросе страницы.
PHP - скрипт index.php обрабатывает просабмиченную форму.
Информация о файле хранится в глобальном массиве $_FILES['my_files']. $_FILES[ ]['tmp_name'] - имя загруженного на web-сервер файла во временный каталог (параметр upload_tmp_dir в php.ini) $_FILES[ ]['name'] - имя исходного файла на клиенте до сабмита $_FILES[ ]['size'] - размер файла в байтах $_FILES[ ]['type'] - MIME type файла (text/plain, image/gif,image/jpeg,image/png,..)
Ограничение макс. размера файла - через параметр upload_max_filesize в php.ini.
Проверять через параметр $_FILES[ ]['size'] нет смысла, т.к. файл уже загружен на сервер.
Сначала - подготовка - oci_parse() затем исполнение oci_execute():
$sql = 'select TO_CHAR(to_oradate(start_date),' . "'MM.DD.YYYY'" .') as dt,t1.dbsessionid as id,novellname as name
from sys#locks t1,x$activeusers t2 where t1.dbsessionid =t2.dbsessionid order by novellname';
$stid = oci_parse($link, $sql); // не проверяем результат - опция не работает
$result = oci_execute($stid, OCI_DEFAULT);
3. Oracle возвращает имена полей - в верхнем регистре!
Чтобы перейти от простой html-странички, отображающей данные, хранящиеся в базе, необходима CMS - content management system. Такая система состоит из ряда web-страниц, доступ к которым ограничен авторизованным юзерам. Интерфейс должен позволять просматривать и изменять хранящуюся в базе информацию, не заботясь о деталях SQL-запросов.
Функционал можно разместить в отдельных в папках.
В каждой папке находится свой index.php, фактически, свой контроллер.
Дальше всё по обычной схеме - формы с возвратом в контроллер, где происходит исполнение действий.
Аналогично для любой функциональности.
Если обработка выполняется в основном контроллере, то возврат выполняется с помощью функции:
header('Location: .');
exit();
Если обработка во внешнем модуле/форме, то возврат задаётся параметром action="" формы.
Значение может быть пустым, либо , например, action="delete".
В списке отображаемых данных в конце каждой строки (как вариант) добавляется кнопка с определённой функцией или группой функций (delete/edit/...).
В этом случае, каждая строка данных - как форма.
Для связи с основным контроллером передаваемые данные оформляются через скрытые кнопки:
Поскольку количество строк таблицы с данными заранее неизвестно, в качестве значения атрибута name тега <input type="checkbox" ... > задаётся массив, например, kill[] .
В основном контроллере список обрабатывается:
if (isset($_POST['action']) and $_POST['action'] == 'delete' and isset($_POST['kill']) )
{
$list = "'" . join("','", $_POST['kill']) . "'";
$sql = 'delete from sys#locks where dbsessionid in ( ' . $list . ')' ;
$stid = oci_parse($link, $sql);
$result = oci_execute($stid, OCI_DEFAULT);
include 'ctrl_sql_err.php';
oci_commit($link);
header('Location: .');
exit();
}
Последний пример - коннект к Oracle.
Формирование переменного pop-up списка (<id>,<имя автора>) c установкой default -значения.
<?php foreach ($authors as $author): ?>
<option value="<?php htmlout($author['id']); ?>"
<?php if ($author['id'] == $authorid) echo ' selected="selected"';?>>
<?php htmlout($author['name']); ?>
</option>
<?php endforeach; ?>
Где id - скрытое поле. В pop-up листе только name.
Аналогично, для checkbox:
<?php foreach ($categories as $category): ?>
<div><label for="category<?php htmlout($category['id']);?>">
Части кода PHP подключаются с помощью include '...'
include
require
include_once
require_once
<?php include $_SERVER['DOCUMENT_ROOT'] . '/includes/db.inc.php'; ?>
Область видимости переменных.
Доступ к глобальным переменным внутри функции:
global $link; или $GLOBALS['link'];
Чтобы в html-страничке использовать переменные, надо использовать идею контроллера PHP.
Т. е. все вызовы html-страниц происходят из одного контроллера PHP (index.php). В контроллере происходит обработка логики операций и переменным присваиваются определённые значения.
Тогда в коде html просто вставляется, например:
<h1><?php htmlout($pagetitle); ?></h1>
где переменная $pagetitele получает значение в контроллере index.php
$link = mysqli_connect('localhost', 'root', 'password'); // база на локальном компьютере
mysqli_set_charset($link, 'utf8'); // установка кодировки
mysqli_select_db($link, 'ijdb'); // выбираем базу jdb
Когда скрипт завершён, PHP will automatically close any open database connections.
SQL-запрос:
mysqli_query(link, query);
Создаём таблицу:
$sql = 'CREATE TABLE joke (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
joketext TEXT,jokedate DATE NOT NULL) DEFAULT CHARACTER SET utf8';
if (!mysqli_query($link, $sql)) {
$output = 'Error creating joke table: ' . mysqli_error($link);
include 'output.html.php';
exit();
}
Функция mysqli_error($link) выводит подробную расшифровку ошибки.
Функция mysqli_query возвращает true в случае успеха или false.
Для DELETE, INSERT, и UPDATE запросов MySQL also keeps track of the number of table rows (entries) that were affected by the query.
Для этого используется mysqli_affected_rows($link).
Обработка результатов SQL-запроса. Массив полученных данных обрабатывается в цикле while или чаще с помощью foreach :
PHP используется для генерации динамического контента html-страниц.
Код PHP активируется , когда запрос посылается к серверу.
Ключом в создании интерактивности на PHP является понимание того,как можно вместе с запросом к серверу на генерацию новой страницы отправить информацию о том, что сделал юзер на странице.
Самый простой способ передачи параметров серверу - это в строке URL:
В тексте html- странички пишем:
echo 'Welcome to our web site, ' . $name . $lastname '!';
?>
Ответ сервера замещает весь контент страницы. Т.е., сервер возвращает новую страницу.
PHP автоматически создаёт массив $_GET[], при получении запроса от браузера.
Однако, здесь налицо дыра в безопасности! В тексте параметра можно передать коды html и сервер обработает их. Например:
Вместо массивов $_GET[] или $_POST[] можно использовать $_REQUEST[]. Тогда на сервере можно не задумываться, каким методом передаются параметры.
Управляющие структуры.
if(condition){...}else{...}
while (condition) {...}
for (declare counter; condition; increment counter) {...}
Один контроллер - несколько шаблонов.
Примерная схема построения : контроллер - в модуле index.php
В контроллере выполняется обработка условий, при которых генерится разный контент, возвращаемый браузеру.