Home

7 Практикум по програмуванню на PHP

Функція printf

    <?php
      printf("В вашей корзине находится %d покупки", 3);
    ?>
  
Специфікатори пертворень, які використовуються в функції printf
Специфікатор Перетворення, здійснені з аргументом arg Приклад (для arg, що має значення 123)
% Відображення символа %(аргументи не потрібні) %
b Відображення arg у вигляді двоїчного цілого числа 1111011
c Відображення ASCII-символа з кодом, який є в arg {
d Відображення arg у вигляді цілого десятичного числа з знаком 123
e Відображення arg з використанням наукової форми запису 1.23000e+2
f Відображення arg у вигляді числа з плаваючою крапкою 123.000000
o Відображення arg у вигляді вісьмиричного цілого числа 173
s Відображення arg у вигляді рядка 123
u Відображення arg у вигляді беззнакового десятичного числа 123
x Відображення arg у вигляді шіснадцятирічного числа з символами у нижньому регістрі 7b
X Відображення arg у вигляді шіснадцятирічного числа з символами у верхньому регістрі 7B

приклади

    <?php
    printf("Меня зовут %s. Мне %d года, то есть %X в шестнадцатеричном" .
    "представлении", 'Симон', 33, 33);
    printf("<span color='#%X%X%X'>Привет</span>", 65, 127, 245);

    ?>
  

Обычно представляется удобным в качестве аргументов printf использовать переменные или выражения. Например, если значения для цветового решения хранятся в трех переменных — $r, $g и $b, то более темный оттенок можно получить с помощью выражения:

printf("<span color='#%X%X%X'>Привет</span>", $r-20, $g-20, $b-20);

  <?php printf("Результат: $%.2f", 123.42 / 12); ?>
  

Результат виконання коду:

Результат: $10.29

Пример 7.1. Настройка преставления данных точности

    <?php
      echo "<pre>"; // Тег, позволяющий отображать все пустые пространства

      // Дополнение пробелами до 15 знако-мест
      printf("Результат равен $%15f\n", 123.42 / 12);

      // Дополнение нулями до 15 знако-мест
      printf("Результат равен $%015f\n", 123.42 / 12);

      // Дополнение пробелами до 15 знако-мест и
      //вывод с точностью до двух десятичных знаков
      printf("Результат равен $%15.2f\n", 123.42 / 12);

      // Дополнение нулями до 15 знако-мест и
      //вывод с точностью до двух десятичных знаков
      printf("Результат равен $%015.2f\n", 123.42 / 12);

      // Дополнение символами # до 15 знако-мест и
      //вывод с точностью до двух десятичных знаков
      printf("Результат равен $%'#15.2f\n", 123.42 / 12);
    ?>
  

Результат виконання коду:

Результат равен $ 10.285000
51Результат равен $00000010.285000
Результат равен $ 10.29
Результат равен $000000000010.29
Результат равен $##########10.29

Пример 7.2. Дополнение строк

    <?php
      echo "
"; // Тег, позволяющий отображать все пустые пространства
        $h = 'Rasmus';

        printf("[%s]\n", $h); // Стандартный вывод строки
        printf("[%12s]\n", $h); // Выравнивание пробелами по правому
         краю до ширины 12
        printf("[%-12s]\n", $h); // Выравнивание пробелами
         по левому краю
        printf("[%012s]\n", $h); // Дополнение нулями
        printf("[%'#12s]\n\n", $h); // Использование специально
         выбранного символа дополнения '#'

        $d = 'Rasmus Lerdorf';
        printf("[%12.8s]\n", $d); // Выравнивание по правому краю
         с усечением до 8 символов
        printf("[%-12.12s]\n", $d); // Выравнивание по левому краю
        с усечением до 12 символов
        printf("[%-'@12.10s]\n", $d); // Выравнивание по левому краю,
         дополнение символом '@', усечение до 10 символов
    ?>
  

Результат виконання коду:

[Rasmus] [ Rasmus] [Rasmus ] [000000Rasmus] [######Rasmus] [ Rasmus L] [Rasmus Lerdo] [Rasmus Ler@@]

Функция sprintf

Зачастую результат преобразования нужно не выводить на экран, а использовать в самом коде программы. Для этого предназначена функция sprintf. Она позволяет не отправлять выходную информацию браузеру, а присваивать ее какой-нибудь переменной

    $hexstring = sprintf("%X%X%X", 65, 127, 245);
  

Или же она может пригодиться для сохранения выходной информации, которую нужно будет вывести на экран чуть позже:

      $out = sprintf("Результат: $%.2f", 123.42 / 12);
      echo $out;
    

Функции даты и времени

    <?php
      echo time();
    ?>
  

Функция checkdate

Пример 7.3. Проверка допустимости даты

    <?php
      $month = 9; // Сентябрь (в котором только 30 дней)
      $day = 31; // 31-е
      $year = 2018; // 2018
      if (checkdate($month, $day, $year)) echo "Допустимая дата";
      else echo "Недопустимая дата";
    ?>
  

Результат виконання коду:

Недопустимая дата

Проверка существования файла

    <?php
      if (file_exists("testfile.txt")) echo "Файл существует";
    ?>
  

Результат виконання коду:

Пример 7.4. Создание простого текстового файла

    <?php // testfile.php
    $fh = fopen("testfile.txt", 'w')
     or die("Создать файл не удалось");
    $text = <<<_END
    Строка 1
    Строка 2
    Строка 3
    _END;

    fwrite($fh, $text)
      or die("Сбой записи файла");
    fclose($fh);

    echo "Файл 'testfile.txt' записан успешно ";
    ?>
  

    У цьому простому прикладі показана послідовність роботи з усіма файлами.
  1. Все починається з відкриття файлу за допомогою виклику функції fopen.
  2. Після цього можна викликати інші функції. В даному випадку в файл йшов запис (fwrite), але можна також читати дані з уже існуючого файлу (fread або fgets) і здійснювати з ним інші дії.
  3. Робота завершується закриттям файлу (fclose). Хоча програма перед завершенням своєї роботи робить це за вас, але все ж ви повинні упевнитися в тому, що після закінчення роботи з файлом він буде закритий

Таблица 7.5. Режимы работы, поддерживаемые функцией fopen

Режим Дія Опис
'r' читання з початку файла Відкриття файлу тільки для читання; установка покажчикафайлу на його початок. Повернення FALSE, якщо файлу не існує
'r+' Читання з початку файла з можливістю запису Відкриття файлу для читання і запису; установка покажчика файлу на його початок. Повернення FALSE, якщо файлу не існує
'w' Запис з початку файлуз урізанням його розміру Відкриття файлу тільки для запису; установка покажчика файлу на його початок і скорочення розміру файлу до нуля. Якщо файлу не існує, спроба його створення
'w+' Запис з пачатку файла з урізанням його розміру і можливістю читання Відкриття файлу для читання і запису; установка покажчика файлу на його початок і скорочення його розміру до нуля. Якщо файлу не існує, спроба його створення
'a' Дописування в кінець файла Відкриття файлу тільки для запису; установка покажчика файлу на його кінець. Якщо файлу не існує, спроба його створення
'a+' Дописування в кінець файла з можливістю читання Відкриття файлу для читання і запису; установка покажчика файлу на його кінець. Якщо файлу не існує, спроба його створення

Читання з файлів

Простіше за все прочитати файл, видобуваючи з нього весь рядок(строку) цілком

Приклад 7.5. Читання файла за допомогою функції fgets(остання буква s в назві функції означає string - рядок(строка))

    <?php
      $fh = fopen("testfile.txt", 'r')
       or die("Файл не існує або ви не маєте прав на його відкриття");

      $line = fgets($fh);
      fclose($fh);

      echo $line;
    ?>
  

Результат виконання коду:

Строка 1

Можна також отримати з файлу відразу кілька рядків або фрагменти рядків,скориставшись функцією fread, як показано в прикладі 7.6

    <?php
      $text = fread($fh, 3);
      fclose($fh);

      echo $text;
      ?>
  

Приклад 7.7. Копіювання файла

    <?php
      copy('testfile.txt', 'tesfile2.txt')
        or die("Копіювання неможливе");

        echo "Файл вдачно скопійовано в 'testfile2.txt'";
    ?>
  

Результат виконання коду:

Файл вдачно скопійовано в 'testfile2.txt'

Приклад 7.8. Алтернативний синтаксис для копіювання файла

    <?php
      if (!copy('testfile.txt', 'testfile2.txt'))
        echo "Копіювання неможливе";
        else echo "Файл вдачно скопійовано в 'testfile2.txt'";
    ?>
  

Для переміщення файлу його необхідно перейменувати, як показано в прикладі 7.9

    <?php
      if (!rename('etstfile2.txt', 'tetfile2.new'))
        echo "Rename is not possible";
      else echo "File successfully renamed in 'testfile2.new'";
    ?>
  

Функцію перейменування можна застосовувати і до каталогів. Щоб уникнути попереджень при відсутності вихідних файлів, спочатку для перевірки факту їх існування можна викликати функцію file_exists

Example 7.10 Delete a file

    <?php
      if (!inlink('testfile2.new'))
        echo "Delete is imposible ";

      else echo "Файл 'testfile2.new' видалено вдачно";
    ?>
  

Результат виконання коду:

Пример 7.11. Обновление файла

    <?php
      $fh = fopen("testfile.txt", 'r+')
        or die("Збій відкриття файла");
      $text = fgets($fh);

      fseek($fh, 0, SEEK_END);
      fwrite($fh, "$text")
        or die("Збій запису в файл");
      fclose($fh);

      echo "Файл 'testfile.txt' вдачно оновлено";
    ?>
  

  • fopen відкриває файл testfile.txt для читання та запису 'r+'
  • далі використовується функція fgets(де считується перший рядок, який присвоюється змінній $text)
  • після, використовується функція fseek, щоб перемістити вказівник файла в самий кінець
  • fwrite записує "text" в файл $fh

В даному прикладі функції fseek, крім описателя файлу $fh, були передані ще два параметри - 0 і SEEK_END. Параметр SEEK_END наказує функції перемістити покажчик файлу в його кінець, а параметр 0 показує, на скільки позицій потрібно повернутися назад з цієї позиції

З функцією fseek можна задіяти ще два режими установки покажчика: SEEK_SET і SEEK_CUR.

Пример 7.12. Обновление файла с использованием блокировки

    <?php
    $fh = fopen("testfile.txt", 'r+') or die("Сбой открытия файла");
    $text = fgets($fh);
    if (flock($fh, LOCK_EX))
    {
    fseek($fh, 0, SEEK_END);
    fwrite($fh, "$text") or die("Сбой записи в файл");
    flock($fh, LOCK_UN);
    }
    fclose($fh);
    echo "Файл 'testfile.txt' успешно обновлен";
    ?>
  

Результат виконання коду:

Чтение всего файла целиком

Пример 7.13. Использование функции file_get_contents

    <?php
    echo "<pre>"; // Тег, позволяющий отображать переводы строк
    echo file_get_contents("testfile.txt");
    echo "</pre>"; // Прекращение действия тега pre
    ?>
  

Результат виконання коду:

              Строка 1
              Строка 2
              Строка 34              Строка 1
              Строка 2
              Строка 3
              kjh

С ее помощью можно извлечь файл с сервера через Интернет

Пример 7.14. Захват главной страницы сайта O'Reilly

      <?php
        echo file_get_contents
        ("http://oreilly.com");
      ?>
    

Завантаження файлів на веб-сервер

    <?php // upload.php
    echo <<<_END
    <html>
      <head>
        <title>PHP-форма для загрузки файлов на сервер</title>
      </head>
      <body>
    <form method='post' action='7practicum_r_nixon.php'
     enctype='multipart/form-data'>

    Выберите файл: <input type='file' name='filename' size='10'>
    <input type='submit' value='Загрузить'>
    </form>
_END;

    if ($_FILES) {
      $name = $_FILES['filename']['name'];
      move_uploaded_file($_FILES['filename']['tmp_name'], $name);

      echo "Загружаемое изображение '$name'<br><img src='$name'>";
    }

    echo "</body></html>";
    ?>
  
  • if ($_FILES) - чи є файл
  • $_FILES['filename']['name']
    • 'filename' - шлях до завантажувального файлу
    • 'name' - оригінальне ім'я файлу
  • move_uploaded_file - перемістити завантажувальний файл
    • $_FILES['filename']['tmp_name'] - звідки
    • $name - куди

Результат виконання коду:

Використання масива $_FILES

Під час завантаження файлу на сервер в масиві $ _FILES зберігаються п'ять елементів, показаних в табл. 7.6 (де використовується файл завантаження, ім'я якого надається відправляємою серверу формою).

Елемент масиву Вміст
$_FILES['file']['name'] Ім'я завантаженого файла(напр. smiley.jpg)
$_FILES['file']['type'] Тип вмісту файла(напр. image/jpeg)
$_FILES['file']['size'] Розмір файлу в бітах
$_FILES['file']['tmp-name'] Ім'я тимчасового файла, збереженого на сервері
$_FILES['file']['error'] <Код помилки, що отримується після завантаження файла

Результат виконання коду:

Поточна версія PHP: 8.2.29

Таблиця 7.7. Деякі найбільш розповсюдженні типи інформації, які використовуються в інтернеті

application/pdf image/gif multipart/form-data text/xml
application/zip image/jpeg text/css video/mpeg
audio/mpeg image/png test/html video/mp4
audio/x-wav image/tiff text/plain video/quicktime

Більш безпечніша версія завантаження файлів на веб-сервер

Приклад 7.16

    <?php
      echo <<<_END
        <html>
          <head>
            <title>PHP-форма для завантаження файлів на сервер</title>
          </head>
          <body>
            <form method='post' action='upload2.php'
             enctype='multipart/form-data'>

              Виберіть файл з розширенням JPG, GIF,
               PNG або TIF:
              <input  type='file' name='filename' size='10'>
              <input type='submit' value='Заантажити'>
            </form>
_END;

      if ($_FILES) {
        $name = $_FILES['filename']['name'];

        switch($_FILES['filename']['tyoe']) {
          case 'image/jpeg': $ext = 'jpg'; break;
          case 'image/gif': $ext = 'gif'; break;
          case 'image/png': $ext = 'png'; break;
          case 'image/tiff': $ext = 'tif'; break;
          default:  $ext = '';  break;
        }
        if ($ext) {
          $n = "image.$ext";
          move_uploaded_file($_FILES['filename']['tmp_name'], $n);
          echo "Завантожено зображення '$name' під ім'ям '$n':<br>";
          echo "<img src='$n'>";
        } else echo "'$name' - неприйнятний файл забраження";
      } else echo "Завантажити забраження не вдалося";

      echo "<body></html>"
    ?>
  

Результат виконання коду:

PHP-форма для завантаження файлів на сервер
Виберіть файл з розширенням JPG, GIF, PNG або TIF:
Завантажити забраження не вдалося

Системні виклики

    <?php
      $cmd = "ls"; //Linux, Unix & Mac
      // $cmd = "dir"; //Windows
      exec(escapeshellcmd($cmd), $output, $status);

      if ($status)
        echo "Команда exes не виконана";
        else {
          echo "список файлів і директорій";
          echo  "<pre>";
          foreach($output as $line)
            echo htmlspecialchars("$line\n");
          echo "</pre>";
        }
    ?>
  

Результат виконання коду:

список файлів і директорій
11_obrabotka_form_nixon.php
7practicum_r_nixon.php
8mysql_sklar.php
array_r_nixon.php
examples
flex_css.php
footer.php
function.php
functions.php
header.php
home.php
html.php
imena
index.php
javascript_notice.php
learn_mysql
mysql_notice.php
mysql_php_nixon.php
mysql_php_nixon_2.php
mysql_r_nixon.php
new_html5_nixon.php
object_d_sklar.php
object_r_nixon.php
oop-php-notice.php
php_notice.php
pr2_1
scripts
semantic_elements.gif
shablon.php
start.html
start.php
style_flex.css
table_7.1.html
tesfile2.txt
testfile.txt
variable.php
web_forms.php
zadanie_1
zadanie_1.zip

Функція htmlspecialchars викликається з метою перетворення будь-яких спеціальних символів, що повертаються системою, в символи, які можуть бути сприйняті і правильно відображені як код HTML, впорядковуючи тим самим висновок.

    Функція exec сприймає три аргумента.
  • Cаму команду(в попередньому випадку це $cmd)
  • Масив, в який система всавить інформацію що отримає в результаті виконання команди (в попердньому випадку це $output)
  • Змінну для зберігання статусу виклику що повертається (в попередньому випадку це $status)