Рассмотрим на примере, когда необходимо добавить в архив содержимое всей папки:

// Get real path for our folder
$rootPath = realpath('путь до папки');

//инициализируем объект
$zip = new ZipArchive();
$zip->open('resultFile.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
//пропускаем директории (они будут добавлены автоматически)
if (!$file->isDir())
{
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);

//Добавляем текущий файлв архив
$zip->addFile($filePath, $relativePath);
}
}

$zip->close();

Источник

Как можно узнать в чем ошибка, если PHP функция simplexml_load_string возвращает false?

Рассмотрим на примере: 

libxml_use_internal_errors(true);
$result = simplexml_load_string("<?xml version='1.0'><root><xml></test>");
if (!$result) {
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}

Что делать, если результат cURL выводится на страницу или в консоль, а необходимо это предотвратить? 

Все просто, достаточно добавить в параметры запуска CURLOPT_RETURNTRANSFER

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

Если вы столкнулись с ошибкой  "Start tag expected, '<' not found"  при использовании функции simplexml_load_string, то необходимо проверить следующее: 

  1. Проверить строку, которая подается в функцию simplexml_load_string - начинается ли она действительно ли нужный символ  '<'. Нет ли никаких скрытых символов в начале строки.
  2. Возможно, до того как использовать эту функцию был какой-то вывод в консоль или на страницу.

Если вы встретились с ошибкой “Array and string offset access syntax with curly braces is no longer supported”, то скорее всего перешли в старом проекте на более новую версию PHP. 

Хорошая новость в том, что исправить данную ошибку достаточно просто.

Дело в том, что в PHP теперь не поддерживается обращение к элементам массива через фигурные скобки, поэтому их надо заменить на квадратные.

Пример: 

$myArray = [1,2,3,4,5];
$myArray{2}; // Ошибка
$myArray[2]; // Правильно

Если вы встретили ошибку “PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function set_error_handler::{closure}(), 4 passed in …”

Дело в том, что в PHP 8 на обработчик ошибки подается на 1 параметр меньше, поэтому если ваша функция принимала 5 параметров, то для php 8 необходимо последний параметр удалить, и тогда все заработает. 

Если вы столкнулись с ошибкой "The port ххх is already in use", где ххх - это любое число, то самый простой способ это сделать - это сначала узнать, какой процесс занимает данный порт, а потом завершить этот процесс. 

Как это можно сделать описано в другой статье: 

Есть несколько причин, почему может возникать данная ошибка.

Возможные решения: 

Ваш диск переполнен.

 Просто удалите какие-либо ненужные файлы, чтобы освободить место.

Проблемы с temp папкой. 

Для начала узнайте, где она располагается. Введите “echo %temp%” в консоли Windows. В ответ должен быть путь. Проверьте, что по такому пути папка существует. Важный момент - в пути не должно быть скрытых папок. К примеру, если у вас адрес “C:\Users\username\AppData\Local\Temp” - то проблема может быть с тем, что папка “AppData” является скрытой. 

Решения:  либо сделать папку видимой (правый щелчок мыши на папке → Properties → в пункте attributes снять галочку напротив hidden, возможно нужны будут права администратора). Если вы не видите саму  папку, сначала нужно включить отображение скрытых папок в системе (если не знаете как это сделать - внизу статьи будет ссылка на инструкцию).

либо поменять адрес для temp папки (правый щелчок мыши на “computer” , затем выберите в контекстном меню properties -> advanced system settings -> environment variables ->
"User variables for " в списке выберите  TEMP(и потом повторите с  TMP) и поменяйте значения к примеру на "c:\temp", только убедитесь, что такая папка у вас есть, либо создайте ее сами).

Если вы столкнулись с ошибкой Git "pre-receive hook declined", то есть несколько вариантов, почему она возникла.

Самая распространенная причина - в вашем репозитории (к примеру GitLab)  master   ветка теперь “защищена” (protected), а главная ветка - это main. 

Решения: 

  • В настройках проекта (Settings > Repository) зайдите в раздел защищенных веток "Protected branches",  найдите ветку "master"  и нажмите на сброс блокировки ("Unprotect"). 
  • Как альтернативное решение - настроить своему пользователю разрешение делать изменения в данной ветке. 

Чтобы запросить данные из таблицы за текущий день, можно использовать такой код запроса:

SELECT *
FROM table_name
WHERE DATE(date_field_name) = CURDATE()

где table_name = название таблицы, откуда хотите получить данные.

date_field_name - название поля, где хранятся даты (в формате date или datetime)

 

Альтернатива - при помощи PHP прописать сегодняшнюю дату в запрос (иногда имеет смысл при использовании индексирования на колонку дат):

$mysqlQuery = "SELECT *
FROM table_name
WHERE date_field_name > '" . date('Y-m-d') . " 00:00:00' ";

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

Исходные значения:

$("#your_input_id").daterangepicker(
{
locale: {
"daysOfWeek": [
"Su",
"Mo",
"Tu",
"We",
"Th",
"Fr",
"Sa"
],
"monthNames": [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
"applyLabel": "Apply",
"cancelLabel": "Cancel",
"fromLabel": "From",
"toLabel": "To",
"customRangeLabel": "Custom",
}
});

Перевод на русский:

...

Допустим, есть дата в произвольном формате “25.08.2022”. Мы ходим ее использовать далее при создании объекта new Date(). Проблема в том, что в таком формате мы не можем сразу передать дату в new Date(), потому что будет либо ошибка, либо дата будет не корректной. 

Сначала необходимо конвертировать дату в нужный формат. 

Один из примеров, как это можно сделать:

var splittedDate = "25.08.2022".split(".");  
var formattedDate = splittedDate[1] + "/" + splittedDate[0] + "/" + splittedDate[2];
var finDate = new Date(formattedDate);
console.log(finDate);

 

Задать нужный формат можно при инициализации скрипта:

$(function() {
$("#your_input_id").daterangepicker(
{
opens: 'left',
locale: {
format: 'DD.MM.Y' // формат выбранных дат, как они будут отображаться у пользователя. В данном примере дд.мм.гггг
}

},
function(start, end, label) { //обработка выбранных значений
});
});

html:

<input name="your_input_name" id="your_input_id" value="" />

Быстро извлечь определенный файл из zip архива с помощью PHP можно с помощью обычной функции copy:

copy("zip://" . $zipFilePath. "#" . $zippedFileName, $unzipFilePath);

где 

  • $zipFilePath - путь до архива,
  • $zippedFileName - название файла в архиве
  • $unzipFilePath - куда разархивировать

пример: 

copy("zip://myfile.zip#textfile.doc", "myDocument.doc");

Подробнее можно почитать тут

 

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

function extractZip($zipFilePath, $folderToExtract) 
{
$zipArchive = new ZipArchive();
$result = $zipArchive->open($zipFilePath);
if ($result === TRUE) {
for ($i = 0; $i < $zipArchive->numFiles; $i++) {
$filename = $zipArchive->getNameIndex($i);
$filePath = $folderToExtract. '/' . $filename;
if (file_exists($filePath)) {
$fileInfo = pathinfo($filename);
$newFileName = $fileInfo['filename'] . '_(copy).' . $fileInfo['extension'];
copy("zip://" . $zipFilePath . "#" . $filename, $folderToExtract . '/' . $newFileName);
} else {
copy("zip://" . $zipFilePath. "#" . $filename, $filePath);
}
}
$zipArchive->close();
}
}

Параметры функции: 

$zipFilePath - путь до zip файла

$folderToExtract - путь до папки, куда нужно распаковать архив. 

 

Стоит учитывать, что функция не проверена на вложенных архивах и на вложенных папках. 

Функция, позволяющая извлечь файлы из zip архива в указанную папку:


function extractZip($filePath, $extractTo){
$zip = new ZipArchive();
$result = $zip->open($filePath);
if ($result === TRUE) {
$zip->extractTo($extractTo);
$zip->close();
}
return $result;
}

$file = 'myfile.zip'; // поменять на путь до вашего файла
$folder = 'myfolder'; // поменять на путь до папки, куда нужно извлечь файлы

extractZip($file, $folder);

Примечание: нужна библиотека zlib