Архіви категорій: Вивчення PHP

cURL – перегляд інтернету програмно

Поширте інформацію:

Буває, виникає необхідність програмно опрацювати вміст якоїсь веб-сторінки.
Сторінку можна завантажити функцією file_get_contents().
Але ця функція стара, не підтримується всіма хостингами, і не дає стільки можливостей як чудова потужна бібліотека cURL
Читати далі

PHP-глюк: mysqli_stmt::bind_result не розуміє поля типу LONGTEXT

Поширте інформацію:

Недавно зіткнувся з дивним глюком.

Є база MySQL, в базі таблиця, в таблиці поле типу LONGTEXT.

З даними виконуються маніпуляції за допомогою скрипта на PHP.

Поки використовував функції mysql процедурного стилю, працювало нормально. Потім перейшов на бібліотеку mysqli.

Запити виду
$mysqli->query("select `somefield` from `table` where `field`='value'");
також виконуються нормально.

Але задля убезпечення від SQL-ін’єкцій краще використовувати техніку наперед заготовлених виразів (prepared statements). Використовується ця техніка таким чином.

$sql = "select `somefield` from `table` where `field`=?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', 'value');
$stmt->execute();
$stmt->bind_result($somevar);
while ($stmt->fetch()) {
 echo nl2br("$somevar\n");
}

Так от, поле таблиці типу LONGTEXT чомусь не передається у змінну $somevar таким скриптом.

Змінив тип поля на TEXT, тоді запрацювало гарно. Розміру тексту в 64 КБайти поки вистачає :)

Українська зникла з phpMyAdmin

Поширте інформацію:

Десь з місяць тому хостери провели поновлення phpMyAdmin на своїх серверах до версії 3.4.4

Я був дуже розчарований, коли виявив, що українського інтерфейсу цей головний інструмент для роботи з базами даних MySQL тепер не має :( (у попередніх версіях був)

Соромно, тому що, наприклад, узбецьких локалізацій є аж дві – кирилицею і латинкою.

Тут вказано, що на українську перекладено 27%

Постараюся знайти час, щоб приєднатися до перекладу.

Закликаю тих, хто має змогу, також приєднатися.

UPD. У версії 3.4.10.1 українська є !!!

Дещо про мову регулярних виразів RegEx

Поширте інформацію:

В мові RegEx кожен вираз складається з одної або більше керівних команд. Деякі з них можна групувати (як групуються інструкції в програмі за допомогою операторних дужок), тоді вони вважаються однією командою.
Всі керівні команди поділяються на три класи:

  • прості символи, а також спеціальні символи, що заміняють їх
  • керівні конструкції (квантифікатори повторів, оператор альтернативи, групувальні дужки тощо)
  • так звані уявні символи – в рядку їх немає, однак вони позначають яку-небудь частину рядка. наприклад, його кінець)

Прості символи
Клас простих символів, справді, найпростіший. А саме, будь-який символ в рядку на RegEx позначає сам себе, якщо не належить до спеціальних символів.

До спеціальних символів належать такі:

. * ? + [ ] { } | $ ^

Наприклад, регулярний вираз “abcd” буде вибирати рядки, в яких зустрічається послідовність символів “abcd”.

Скасування дії спецсимволів

Якщо потрібно вставити у вираз один із спеціальних символів, але так, щоб він не позначав своєї спеціальної дії, поставте перед ним зворотній слеш. Наприклад, якщо ми шукаємо рядок, який містить фрагмент “a*b”, то маємо записати регулярний вираз “a\*b”.

Але в PHP цей вираз потрібно записати як “a\\*b”.

Групи символів

Звичайно ж,  RegEx дозволяє задавати не лише безпосередні частини шуканих рядків, як показано вище. Існують деякі спецсимволи, що позначають відразу групу простих символів. Ця можливість – один із наріжних каменів, основ регулярних виразів.

Найважливіший з таких знаків – крапка “.” – вона позначає будь-який один символ. Наприклад, вираз “a.b” відповідає рядкам “azb” або “aqb“, але не відповідає рядкам “aqwb” чи “ab“. Пізніше ми розглянемо, як заставити крапку позначати, скажімо,  рівно 5 будь-яких символів.

Може бути, що потрібно знайти не будь-який символ, а один з кількох конкретних. Для цього ті конкретні символи потрібно взяти у квадратні дужки. Наприклад, вираз “a[xXyY]c” відповідає рядкам, в яких є фрагменти по 3 символи,  які (фрагменти)  починаються з букви a, далі містять одну з таких букв: x,X,y,Y, і закінчуються буквою c. Якщо потрібно вставити поміж квадратних дужок сам символ  [ чи  ], то треба поставити перед ним зворотний слеш (в PHP – два слеші), щоб скасувати його спеціальну дію.

Якщо букв-альтернатив багато, і вони йдуть підряд, то не обов’язково перераховувати в квадратних дужках їх всі – можна вказати першу, поставити дефіс і вказати останню.  Такі групи можуть повторюватися. Наприклад, вираз “[a-z]” визначає будь-яку букву від a до z включно, а вираз “[a-zA-Z0-9_]” визначає будь-який алфавітно-цифровий символ.

Існує ще інший, іноді зручніший спосіб задавання великих груп символів. В мові RegEx в квадратних дужках можуть вказуватися не лише одиничні символи, але й спеціальні вирази. Ось їх повний список:

  • [:alpha:] – буква;
  • [:digit:] – цифра;
  • [:alnum:] – буква або цифра;
  • [:space:] – пропуск;
  • [:blank:] – пропуск або символи з кодами 0 і 255;
  • [:cntrl:] – спеціальний символ;
  • [:graph:] – символ псевдографіки

(Стаття не завершена.

Краще використовувати мову регулярних виразів PCRE, а не RegEx)

include vs require

Поширте інформацію:

Інструкції PHP include та require дають можливість розділити текст програми на кілька файлів.

Формат інструкції include:

include назва_файла;

Зустрівши в сценарії таку інструкцію, інтеррпретатор PHP під час виконання сценарію підставить замість неї вміст файла назва_файла.

Формат інструкції require:

require назва_файла;

Зустрівши в сценарії таку інструкцію, інтеррпретатор PHP під час запуску сценарію  (саме запуску, а не виконання) підставить замість неї вміст файла назва_файла.

Яке має значення – під час запуску, чи під час виконання?

Розглянемо приклад. Нехай маємо 10 текстових файлів з іменами file0.php, file1.php,…,file9.php Кожен файл містить десяткову цифру 0,1,…,9 (по одній цифрі в кожному файлі). Тоді код

for ($i = 0; $i < 10; $i++) {
include "file$i.php";
}

виведе в браузер 10 цифр: “0123456789”.

А код

for ($i = 0; $i < 10; $i++) {
require "file$i.php";
}

виведе в браузер 10 нулів: “0000000000”.

Зауваження. Під час виконання інструкції include інтерпретатор PHP призупиняє виконання основної програми до того часу, поки не буде відтрансльований вміст файла, що включається. Це може негативно вплинути на швидкодію програми. Тому бажано використовувати всюди, де можна, використовувати require замість include.

Інструкції одноразового включення

Обидві інструкції мають “одноразові” аналоги:

include_once назва_файла;
require_once назва_файла;

відповідно. Особливість їх роботи полягає в тому, що вказані в цих інструкціях файли включаються в програму лише раз. Тобто, якщо програмі повторно зустрінеться “одноразова” інструкція включення того самого файлу, то ця, повторна, інструкція не виконає нічого.  Це може бути використано для запобігання ситуації, коли якась бібліотека підключається до програми спочатку напряму, а тоді ще один раз  (зайвий) з якоїсь іншої бібліотеки.

Рядки в одинарних і подвійних апострофах

Поширте інформацію:

Рядок, обрамлений одинарними апострофами (наприклад, ‘сало’), трактується точно так, як записаний, за винятком двох спеціальних послідовностей символів:

  • послідовність \’ трактується як апостроф і призначена для вставки апострофа в рядок, обрамлений апострофами
  • послідовність \\ трактується як один зворотний слеш і дозволяє вставляти слеші в рядок

Решта символів позначають самі себе, зокрема символ $ не має ніякого спеціального значення, отже, змінні всередині рядка, обрамленого апострофами, не інтерполюються (їх значення не підставляється).

Рядок же, обрамлений лапками (“подвійними апострофами”), має значно багатший набір спеціальних мета-символів. Деякі з них:

  • \n позначає символ нового рядка
  • \r позначає символ повернення каретки
  • \t позначає символ табуляції
  • \$ позначає символ $, щоб, текст, який іде за ним, випадково не інтерполювався, як змінна
  • \” позначає лапки
  • \\ позначає зворотний слеш
  • \xNN позначає символ, шістнадцятковий код якого дорівнює NN

Змінні в рядках, обрамлених лапками, інтерполюються. Наприклад:

$a = "Hello";
echo "$a World!";

Цей код виведе Hello world!, тобто змінна $a в рядку була інтерпольована (замінена на своє значення).

Ще приклад:

$a = "Hell"; // слово Hello без букви o
echo "$ao world!";

Як ви думаєте, буде виведено той самий рядок? А як PHP дізнається, мали ми на увазі змінну $a, чи змінну $ao ? Очевидно, ніяк. Цей код генерує повідомлення про те, що змінна $ao не визначена. Як вирішити проблему? Є аж три способи:

$a = "Hell"; // слово Hello без букви o
echo $a."o world!"; // перший спосіб
echo "{$a}o world!"; // другий спосіб
echo "${a}o world"; // третій спосіб

Як бачимо, фігурні дужки в деяких контекстах також можуть трактуватися як спецсиволи.