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

Решение: 

заменить в строке ошибки фигурные скобки на квадратные

Пример: 

$myString = "podelitsa";

echo($myString{0}); //ошибка
echo($myString[0]); //решение

Возможна такая ситуация, когда при работе с Selenium возникла необходимость в отправке POST запроса. 

Основная проблема в том, что Selenium такие запросы не поддерживает.

Что же можно сделать? 

Есть одно решение: так как Selenium  позволяет выполнять на странице JavaScript, то с помощью скриптов можно динамически создать форму на странице и затем ее отправить. Либо же сразу сделать нужный вам запрос с помощью JavaScript.  

Простой вариант (PHP + JavaScript): 

$client = Client::createChromeClient();
$client->request('GET', 'mytest.com');
$js = '

let data = {elementName: "value"};
fetch('https://testaddress.com', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
}).then(res => {

console.log('Response:', res);

});
';
$client->executeScript($js);
$client->close();

В данном примере сначала открываем страницу mytest.com с помощью Selenium (Symfony Panther), затем отправляем POST запрос на testaddress.com используя js. 

Допустим после ajax запроса у нас есть ответ response с типом данных readableStream. Задача: сделать так, чтобы этот поток сразу скачивался в файл.

Решение:

//функция для скачивания файла:
function downloadFile(blob, filename) {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}

//запрос:
let data = {elementName: "value"};
fetch("http://mytesturl", {
method: "post",
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then( (response) => {
console.log('resp', response);
//если получили ответ в нужном формате, то вызываем скачивание файла:
response.blob().then(blob => downloadFile(blob, 'testfile.pdf'))
})

Допустим, есть необходимость выполнить кастомный js код на странице, контролируемой автоматически с помощью Selenium WebDriver.

Рассмотрим как это сделать на примере:

$client = Client::createChromeClient();
$client->request('GET', 'mytest.com');
$js = 'alert("Test!")';
$client->executeScript($js);
sleep(5); // для того чтобы увидеть результат, если запускаете не в headless режиме
$client->close();

Если вы пробуете открыть phpPgAdmin в Open Server и вместо панели видите такую ошибку:

Your PHP installation does not support the pgsql module. You will need to install, enable, or compile it to use phpPgAdmin

То решение скорее всего простое: в php.ini необходимо включить расширение pgsql  и перезапустить сервер. 

Задача: есть две даты, надо получить перечень всех месяцев, которые затрагивает данный интервал. 

Решение: 

function getMonths(DateTime $startD, DateTime $endD)
{
$start = $startD->modify('first day of this month');
$end = $endD->modify('first day of next month');
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($start, $interval, $end);
$results = [];
foreach ($period as $d) {
$results[$d->format("Y")][] = $d->format("m");
}
return $results;
}
$date1 = new DateTime('2023-02-02 00:00:00');
$date2 = new DateTime('2023-10-03 00:00:00');
$result = getMonths(date1, date2);
var_dump( $result );

Результат: 

array (size=1)
2023 =>
array (size=10)
0 => string '02' (length=2)
1 => string '03' (length=2)
2 => string '04' (length=2)
3 => string '05' (length=2)
4 => string '06' (length=2)
5 => string '07' (length=2)
6 => string '08' (length=2)
7 => string '09' (length=2)
8 => string '10' (length=2)
9 => string '11' (length=2)

Пример, как получить кинутый элемент на jQuery  droppable.

HTML: 

<div class="droppable">test</div>

 

JQuery: 

$( ".droppable" ).droppable({
drop: function( event, ui ) {
var droppedElement = ui.draggable;
//droppedElement - это элемент, который кинули на данный блок
}
});

 

Единственное, надо еще прописать сам draggable элемент, который будут перетаскивать. 

Как получить текущую дату с помощью JavaScript, и потом отформатировать ее: 

let today = new Date();
let year = today.getFullYear();
let month = today.getMonth() + 1; // + 1 т.к. нумерация с 0
let day = today.getDate();

if (day < 10) day = '0' + day; // чтобы были нули спереди в числах до 10
if (month < 10) month = '0' + month ;

let finalDate = day + '.' + month + '.' + year; // в формате dd.mm.yyyy
console.log(finalDate );

 

Точная стоимость электронной визы в Россию составляет 52 USD. 

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

Заявления на визы стали принимать с 1 августа 2023 года. 

Оплата производится с помощью банковских карт, принимаются карты иностранных государств ( оплата идет через Amazon Payment services). 

Допустим есть 2 таблицы: 

Первая table1: 

  • id
  • name

Вторая table2: 

  • id
  • table1_id

И нам надо удалить из первой таблицы записи, которые ни разу не встречаются  во второй таблице в колонке table1_id.

SQL: 

DELETE a FROM table1 a
LEFT JOIN table2 b ON a.id = b.table1_id
WHERE b.table1_id IS NULL

Если вы ищете как установить стиль по умолчанию к Worksheet, то это можно сделать так: 

$worksheet->getParent()->getDefaultStyle()->applyFromArray($defaultParameters);

Где $defaultParameters - массив с вашими настройками по умолчанию. 

В данном случае надо вызывать функцию getDefaultStyle не у самой Worksheet, а сначала получив родительский класс с помощью getParent

При новой установке PhpStorm столкнулась с проблемой, что отсутствует привычная вкладка Local changes, где можно просмотреть все изменения, которые еще не закоммичены. 

Как ее вернуть: 

Открыть File - > Settings

В пункте Version control → Commit снять галку с пункта Use non-modal commit interface

Появилась такая проблема - после установки новой системы и нового браузера в Google Chrome на странице синхронизации можно найти такую надпись: “Sync Please wait…”, но ничего не происходит, никакой синхронизации нет.

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

В данном случае помогло проверить hosts файл (C:\Windows\System32\Drivers\etc\hosts). 

Оказалось, что в его конец были добавлены строки: 

127.0.0.1 clients.google.com
127.0.0.1 clients0.google.com
127.0.0.1 clients1.google.com
127.0.0.1 clients2.google.com
127.0.0.1 clients3.google.com
127.0.0.1 clients4.google.com
127.0.0.1 clients5.google.com
127.0.0.1 clients6.google.com
127.0.0.1 clients7.google.com
127.0.0.1 clients8.google.com
127.0.0.1 clients9.google.com

Таким образом google просто не мог ничего скачать. 

Помогло просто удаление этих строк из данного файла. 

Для проверки, зарегистрировано ли доменное имя, можно использовать стандартную функцию PHP -  checkdnsrr с параметром ANY. 

Смысл такой - если найдена хотя бы одна любая запись DNS, то домен зарегистрирован. 

Пример: 

 if ( checkdnsrr('podelitsa.ru', 'ANY') ) {
echo "Запись DNS найдена - домен зарегистрирован";
} else {
echo "Нет записей DNS - домен не зарегистрирован";
}

Рассмотрим случай, когда нужно в PHPUnit запустить определенный testsuite из командной строки. 

К примеру в файле конфигурации phpunit.xml добавлены такие testsuites:

<testsuites>
<testsuite name="all">
<directory>tests</directory>
</testsuite>
<testsuite name="custom">
<directory>tests/dir1</directory>
<directory>tests/dir2</directory>
</testsuite>
</testsuites>

И цель - запустить только testsuite  с именем custom. 

Это можно сделать с помощью такой команды:

 vendor/bin/phpunit --testsuite custom

Эта ошибка происходит потому что файл конфигурации phopunit.xml содержит устаревшую структуру. 

Для устранения ошибки достаточно выполнить такую команду: 

vendor/bin/phpunit --migrate-configuration