Web Мастерская»Блог

Сообщество Web Мастеров. Тут собрано всё, чтобы написать свой первый сайт, запустить его в Интернет и поддерживать его в течении всей его работы.

Как разделить строку по символам, при первом его появлении

PHP
При помощи функции explode() мы можем разбить строку в массив, по указанному символу. В моём случае указанный символ (Разделитель) - это двоеточие (:):
$part = explode(':', $param);

И я получаю из строки: user:1 массив из двух элементов. Тут всё просто. Но когда мне приходит строка такого вида: origin:https://danfa.net, сценарий отрабатывает неправильно. Потому что PHP видит в строке два разделителя, первый, где и должен быть, второй в URL и разбивает строку в массив из трех элементов, вместо двух.

Чтобы функция разбивала строку в массив, только на первом разделители, следует использовать третий параметр функции explode(), что называется лимит. Делаем так:
$part = explode(':', $param, 2);

Готово....

Поиск ошибок в PHP | Дебаг

При написании php скрипта легко допустить ошибку, из-за которой скрипт работать будет неправильно, либо вообще работать не будет. Страница пустая (белая) и ошибку очень сложно найти среди десятка тысяч символов... Для того что бы быстро найти ошибку, можно в ваш файл, после <?php добавить следующий код:
ini_set('display_errors', 'On');
error_reporting(E_ALL);

после этого должно появится сообщения с номером строки, в которой находится ошибка (правда этот вариант не всегда помогает).

Еще как вариант: добавить в файл .htaccess строку:
php_flag display_errors 1


Возможно, будет интересно:
...

Uncaught mysqli_sql_exception: Data too long for column

Получил ошибку: Uncaught mysqli_sql_exception: Data too long for column. Из текста ошибки ясно, что машина получила слишком длинные данные.

Я не стал менять тип поля, чтобы увеличить её ёмкость, я просто сделал проверку на длину строки, перед сохранением данных в Базу Данных (По аналогии: Тема: Слишком большое имя (failed to open stream: File name too long)).

Делаю так:
$insert['search_query'] = (mb_strlen($search) > 250) ? mb_substr($search, 0, 250) : $search;

Готово. Ошибка исчезла.

Строка нужна для одногоразового поиска, и длиннее чем 250 символов, она ни к чему. Поэтому, в моём случае, удаление части строки допустимо. Если это не Ваш случай, рассмотрите вариант с увеличением ёмкости поля, куда сохраняется запись, либо замену типа столбца....

Магический метод __call(): Вызов при недоступных методов

PHP
Магический метод __call() запускается при попытке обращения к несуществующему/недоступному методу:
	public function __call($name, $arguments)
	{
		echo 'Метод: ' . $name . ' не найден.';
	}

Мои два метода (installation и update) были похоже друг с другом, за исключением деталей, я решил их объединить, в один, при этом обращение к методам должно было остаться прежним:
$class->installation();
$class->update();

С решением этой задачи мне помог магический метод __call():
	// Установка | Обновление
	public function __call(string $name, array $arguments)
	{
		// Проверка: Если вызываемый метод не: installation, или не: update, то функция вернёт null 
		if (!in_array($name, ['installation', 'update']))
		{
			return null;
		}

		// Код функции
	} // End: Установка | Обновление
...

PHP: Цикл в две колонки | В два столбика

Работая над одним приложением, потребовалось перечислить элементы массива в две колонки (Столбика):



Для решения этой задачи, у меня было два варианта. Первый:
		<?php foreach ($characteristics as $characteristic): ?>
		<div class="feature">
			<?php echo $this->lang()->phrase($characteristic['name']); ?>: <strong><?php echo $characteristic['info']; ?></strong>
		</div>
		<?php endforeach; ?>

И CSS к шаблону:
.feature {
	display: inline-block;
	width: 48%;
}

И второй:
		<?php foreach ($characteristics as $key => $characteristic): ?>
		<?php if ($key % 2): ?>
		<div style="float: right;">
		<?php else: ?>
		<div style="float: left;">
		<?php endif; ?>
			<?php echo $this->lang()->phrase($characteristic['name']); ?>: <strong><?php echo $characteristic['info']; ?></strong>
		</div>
		<?php endforeach; ?>

Я выбрал первый вариант. Он мне показался лучшем, чем второй....