PHP. Изучение языков и web-технологий PHP. Изучение языков и web-технологий

Конспект изучения языков и web-технологий : PHP

 
Озарение души
Сборник стихов Татьяны Катушонок
Осознание красоты спасет мир
Web technologies and programming languages
Web технологии и языки
XML - XSLT
Изучаем XML
Преобразования
HTML
Изучаем HTML
Теги
Javascript и AJAX
Три кита
Листенеры
Каталог
Список литературы
Основы языка
Publishing MySQL Data on the Web
Структурное программирование
Простая CMS
Особенности коннекта к Oracle
Cookies, Sessions, Access Control, Binaty Data

Список литературы
воскресенье
Просто рабочий конспект
Литературы на тему PHP, конечно, очень много.
Мне нравятся вот эти книги по стилю и содержанию.

 1.  Build Your Own Database Driven Web Site Using PHP & MySQL by Kevin Yank. Fourth Edition: July 2009.

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


2. Davey Shafik - The PHP Anthology. 101 Essential Tips, Tricks & Hacks, 2nd Edition - 2007


На эту книгу ссылается Kevin Yank.


3. М.Кузнецов-PHP5. Практика разработки web-сайтов.

Тоже полезная книга.

Ярлыки:

Подпишись на новости PHP по e-mail
posted by Sergey @ 3:38   0 comments
Cookies, Sessions, Access Control, Binaty Data
четверг
Просто рабочий конспект
Куки - набор пар имя-значение, хранящиеся на клиенте в привязке к конкретному сайту.

 
setcookie(name[, value[, expiryTime[, path[, domain[, secure[,httpOnly]]]]]])
 

Должна использоваться до отправки актуального контента (аналогично header()) !
Разные браузеры могут вводить ограничения на количество куков.

Чтобы обойти возможные ограничения браузеров, используются сессии.

Если куки хранятся на клиенте, то сессии - на web-сервере.
В качестве куки в этом случае хранится тоько id сессии юзера.
Разрешение на сессии прописывается в файле php.ini.
До передачи контента вызывается функция:

 
session_start();
$_SESSION['password'] = 'mypassword';
unset($_SESSION['password']);
$_SESSION = array();
session_destroy();
 

Браузер передаёт id сессии каждый раз при  запросе страницы.

Для работы с файлами используются функции:

$html = file_get_contents($srcurl);
$result=file_put_contents($tempfilename, $html);
file_exists($tempfilename);
unlink($tempfilename);
copy($tempfilename, $targetfilename);

Что интересно, если в функции file_get_contents($srcurl) в значении $srcurl стоит url, например, "http://prostophp.blogspot.com/2010/10/cookies-sessions-and-access-control.html", то результатом будет не содержание файла, а результат обработки файла браузером, т.е.html - контент!

Всё, что нужно для  upload - выгрузки файла с клиента на сервер:
 
<form action="index.php" method="post" enctype="multipart/form-data">
   <div><label id="my_files">Select file to upload:
               <input type="file" id="upload" name="upload"/></label>
   </div>
   <div><input type="hidden" name="action" value="upload"/>
            <input type="submit" value="Submit"/>
   </div>
</form>
 

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'] нет смысла, т.к. файл уже загружен на сервер.

Создание уникального имени файла, например:
 
$filename = 'C:/uploads/' . time() . $_SERVER['REMOTE_ADDR'] . $ext;
 

Безопасное копирование файла:
 
if (!is_uploaded_file($_FILES['upload']['tmp_name']) or
  !copy($_FILES['upload']['tmp_name'], $filename))
{ обработка ошибки ...}
 

Очень важная функция - is_uploaded_file().
Проверяет, действительно ли этот файл был загружен в результате сабмита формы.

Просмотр загруженных файлов.

Размер файла передаётся в заголовке:
header('Content-length: ' . strlen($filedata));


Тип файла:
 
header("Content-type: $mimetype");
 

Имя файла:
 
header("Content-disposition: inline; filename=$filename");
 

Извлекаем файл из базы:

 
$sql = "SELECT filename, mimetype, filedata FROM filestore WHERE id = '$id'";
...
$file = mysqli_fetch_array($result);
$filename = $file['filename'];
$mimetype = $file['mimetype'];
$filedata = $file['filedata'];
$disposition = 'inline';    // просмотр на месте
if ($_GET['action'] == 'download')
{
$mimetype = 'application/x-download';
$disposition = 'attachment';
}

header("Content-type: $mimetype");
header("Content-disposition: $disposition; filename=$filename");
header('Content-length: ' . strlen($filedata));
echo $filedata;

Ярлыки: , , ,

Подпишись на новости PHP по e-mail
posted by Sergey @ 2:50   0 comments
Особенности коннекта к Oracle
вторник
Просто рабочий конспект
1. Примеры  коннекта:

 
putenv("NLS_LNAG=AMERICAN_CIS.CL8MSWIN1251");
$link = oci_connect( "user" , "password" , "//192.168.1.10:1521/orcl" );
if (!$link)
{
    $err = oci_error ();
    $error = 'Ошибка подключения: ' . $err ['message'];
    include 'error.html.php';
    exit();
}
 

Если без IP - через файл tnsnames.ora:

 
$link = oci_connect( "user" , "password" , "testdb" );
 

testdb должна быть прописана в файле tnsnames.ora

2. SQL - запросы.

Сначала - подготовка - 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 возвращает имена полей - в верхнем регистре!

 
while ($row = oci_fetch_assoc($stid))
{
    $users[] = array('dt' => $row['DT'], 'id' => $row['ID'], 'name' => $row['NAME']);
}
 

4. Обработка ошибок:

 
  if (!$result)   {
    $e = oci_error($stid);
    $error = 'Error : ' . htmlentities($e['message']) . ' : ' . htmlentities($e['sqltext']);
    include 'error.html.php';
   exit();
  }
 

Именно $stid а не $link . Т.е переменная, возвращаемая oci_parse().

Ярлыки:

Подпишись на новости PHP по e-mail
posted by Sergey @ 2:32   0 comments
Простая CMS
четверг
Просто рабочий конспект
Чтобы перейти от простой html-странички, отображающей данные, хранящиеся в базе, необходима CMS - content management system. Такая система состоит из ряда web-страниц, доступ к которым ограничен авторизованным юзерам. Интерфейс должен позволять просматривать и изменять хранящуюся в базе информацию, не заботясь о деталях SQL-запросов.
Функционал можно разместить в отдельных в папках.
В каждой папке находится свой index.php, фактически, свой контроллер.
 
<ul>
      <li><a href="jokes/">Manage Jokes</a></li>
      <li><a href="authors/">Manage Authors</a></li>
      <li><a href="categories/">Manage Joke Categories</a></li>
</ul>
 
Дальше всё по обычной схеме - формы с возвратом в контроллер, где происходит исполнение действий.



Аналогично для любой функциональности.
Если обработка выполняется в основном контроллере, то возврат выполняется с помощью функции:

 
header('Location: .');
exit();
 

Если обработка во внешнем модуле/форме, то возврат  задаётся параметром action="" формы.
Значение может быть пустым, либо , например, action="delete".

В списке отображаемых данных в конце каждой строки (как вариант) добавляется кнопка с определённой функцией или группой функций (delete/edit/...).
В этом случае, каждая строка данных - как форма.
Для связи с основным контроллером передаваемые данные оформляются через скрытые кнопки:
 
<ul>
   <?php foreach ($authors as $author): ?>
     <li>
     <form action="" method="post">
     <div>
        <?php htmlout($author['name']); ?>
        <input type="hidden" name="id" value="<?php echo $author['id']; ?>"/>
        <input type="submit" name="action" value="Edit"/>
        <input type="submit" name="action" value="Delete"/>
     </div>
     </form>
     </li>
  <?php endforeach; ?>
</ul>

 Если использовать checkbox, то достаточно по одной кнопке действий на всю таблицу.
Формирование отмеченного списка строк несколько хитрее:

 
 <?php if (isset($users)): ?>
     <table>
       <tr><th>Отметить</th><th>Юзер</th><th>DBSESSIONID</th><th>Дата входа</th></tr>
       <form action="?" method="post">
            <?php foreach ($users as $user): ?>
                <tr valign="top">
                 <td><input type="checkbox" name="kill[]" id="dbsession<?php $user['id']?>" value="<?php htmlout($user['id']); ?>" /> </td>
                  <td><?php htmlout($user['name']); ?></td>
                  <td><input type="text" name="id[]" value="<?php htmlout($user['id']); ?>" disabled /></td>
                  <td><?php htmlout($user['dt']); ?></td>
                </tr>
                <?php endforeach; ?>
            </table>
       <input type="submit" name="askme" value="Подтвердить удаление"/>
       <input type="hidden" name="action" value="delete"/>
    </form>
 <?php endif; ?>



Поскольку количество строк таблицы с данными заранее неизвестно, в качестве значения атрибута 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']);?>">
             <input type="checkbox" name="categories[]" id="category<?php htmlout($category['id']); ?>"
                       value="<?php htmlout($category['id']); ?>"
                        <?php if ($category['selected']) echo ' checked="checked"'; ?>/>
            <?php htmlout($category['name']); ?></label></div>
<?php endforeach; ?>
 

Гибко и просто!

Ярлыки: ,

Подпишись на новости PHP по e-mail
posted by Sergey @ 6:53   0 comments
Структурное программирование
вторник
Просто рабочий конспект
Части кода 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

Ярлыки:

Подпишись на новости PHP по e-mail
posted by Sergey @ 2:50   0 comments
Publishing MySQL Data on the Web
четверг
Просто рабочий конспект
Коннект к MySQL:


$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 foreach ($jokes as $joke): ?>
<p>
<?php echo htmlspecialchars($joke, ENT_QUOTES, 'UTF-8'); ?>
</p>
<?php endforeach; ?>
 

Если запрос возвращает несколько полей:
 
$result = mysqli_query($link, 'SELECT id, joketext FROM joke');
...
while ($row = mysqli_fetch_array($result))
{
$jokes[] = array('id' => $row['id'], 'text' => $row['joketext']);
}
..
include 'jokes.html.php';
 

Вся обработка действий юзера ведётся в одном контроллере index.php, из которого вызываются нужные блоки кода .

Возврат в контроллер:
 
header('Location: .');
exit();
 

Для удаления записей - кнопка "delete" в форме :


 
<?php foreach ($jokes as $joke): ?>
   <form action="?deletejoke" method="post">
       <p>
        <?php echo htmlspecialchars($joke['text'], ENT_QUOTES,'UTF-8'); ?>
          <input type="hidden" name="id" value="<?php echo $joke['id']; ?>"/>
           <input type="submit" value="Delete"/>
          </p>
      </form>
 <?php endforeach; ?>
 

Интересный вариант - через линк:

 
<a href="?deletejoke&amp;id=<?php echo $joke['id']; ?>">Delete</a>
 

Проблема с линком в том, что при обновлении страницы будут повторяться действия, т.е. можно удалить все записи из таблицы.

Ярлыки:

Подпишись на новости PHP по e-mail
posted by Sergey @ 0:12   0 comments
Основы языка
понедельник
Просто рабочий конспект
PHP - серверно-ориентированный язык. Код выполняется на стороне сервера.

Простой пример:

<?php
  echo "Simple text";
?>

Переменные:


$var1 = 1;
$testvariable = 'Three';
$testvariable = 'Hi ' . 'there!'; // конкатенация
$var1 = 'PHP'; // Assigns a value of 'PHP' to $var1

Интерполяция. В одинарных кавычках значение переменной НЕ подставляется.


echo "$var1 rules!"; // выводит 'PHP rules!'
echo '$var1 rules!'; // выводит '$var1 rules!' 


Массив:

$myarray = array('one', 2, '3');
echo $myarray[0]; // Outputs 'one'
echo $myarray[1]; // Outputs '2'
echo $myarray[2]; // Outputs '3'

Добавление элемента:

$myarray[] = 'the fifth element';
echo $myarray[4]; // Outputs 'the fifth element'

Ассоциативный массив:

$birthdays['Kevin'] = '1978-04-12';
$birthdays['Stephanie'] = '1980-05-16';
$birthdays['David'] = '1983-09-09';

Или через функцию:

$birthdays = array('Kevin' => '1978-04-12', 'Stephanie' => '1980-05-16', 'David' => '1983-09-09');
echo 'My birthday is: ' . $birthdays['Kevin'];

PHP используется для генерации динамического контента html-страниц.
Код PHP активируется , когда запрос посылается к серверу.

Ключом в создании интерактивности на PHP является понимание того, как можно вместе с запросом к серверу на генерацию новой страницы отправить информацию о том, что сделал юзер на странице.

Самый простой способ передачи параметров серверу - это в строке URL:
В тексте html- странички пишем:


 <a href="welcome1.php?name=Max&amp;lastname=Petrovich">Hi, I&rsquo;m Max!</a>

Вот что в файле на сервере welcome1.php:

<?php
$name = $_GET['name'];
$lastname = $_GET['lastname'];
echo 'Welcome to our web site, ' . $name . $lastname '!';
?>

Ответ сервера замещает весь контент страницы. Т.е., сервер возвращает новую страницу.
PHP автоматически создаёт массив $_GET[], при получении запроса от браузера.
Однако, здесь налицо дыра в безопасности!  В тексте параметра можно передать коды html и сервер обработает их. Например:

welcome1.php?name=<a href='http://localhost'>Newlink</a>
Всё, что угодно...
Дыра закрывается функцией htmlspecialchars($name, ENT_QUOTES, 'UTF-8')
Html-теги преобразуются в специальные символы. (&lt; &gt; ....)

Другой способ передачи параметров php - скрипту - с помощью метода POST через форму:

<form action="welcome5.php" method="post">
    <div><label for="firstname">First name:
                 <input type="text" name="firstname" id="firstname"/></label>
    </div>
    <div><label for="lastname">Last name:
                  <input type="text" name="lastname" id="lastname"/></label></div>
   <div><input type="submit" value="GO"/></div>
</form>


Скрипт сервера:

<?php
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
echo 'Welcome to our web site, ' .
htmlspecialchars($firstname, ENT_QUOTES, 'UTF-8') . ' ' .
htmlspecialchars($lastname, ENT_QUOTES, 'UTF-8') . '!';
?>

Вместо массивов $_GET[] или  $_POST[] можно использовать $_REQUEST[]. Тогда на сервере можно не задумываться, каким методом передаются параметры.


Управляющие структуры.

if(condition){...}else{...}

while (condition) {...}

for (declare counter; condition; increment counter) {...}


Один  контроллер - несколько шаблонов.

Примерная схема построения :
контроллер - в модуле index.php
В контроллере выполняется обработка условий, при которых генерится разный контент, возвращаемый браузеру.

С помощью include подключаются разные фрагменты php-кода.
Подпишись на новости PHP по e-mail
posted by Sergey @ 11:00   0 comments
Обо мне

Name: Sergey
Home:
About Me:
Обо мне подробно
Подпишись на новости Javascript и AJAX письмом:

Напишите ваш e-mail :

Delivered by FeedBurner

Предыдущий пост
Архив
Линки
Статистика

Subscribe in a reader

Powered by FeedBurner

BLOGGER

© PHP. Изучение языков и web-технологий