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

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 @ 02: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 @ 02: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 @ 06: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 @ 02:50   0 comments
Близкая даль
Подпишись на новости Javascript и AJAX письмом:

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

Delivered by FeedBurner

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

Subscribe in a reader

Powered by FeedBurner

BLOGGER

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