SELECT * FROM
(SELECT max(id) as maxId, from_id
GROUP BY from_id
WHERE from_id in (1,2,3)
ORDER BY maxId desc
) as t1
INNER JOIN messages m on t1.maxId = m.id
// Подзапрос для получения maxId и from_id
$subQuery = (new Query())
->select(['maxId' => 'MAX(id)', 'from_id'])
->from('messages')
->where(['from_id' => [1, 2, 3]])
->groupBy('from_id')
->orderBy(['maxId' => SORT_DESC]);
// Основной запрос с INNER JOIN
$query = (new Query())
->select('*')
->from(['t1' => $subQuery])
->innerJoin('messages m', 't1.maxId = m.id');
// Выполнение запроса
$results = $query->all();
// Создаем объект DateTime с текущей датой
$date = new DateTime();
// Вычитаем 100 дней
$date->modify('-100 days');
// Выводим результат в нужном формате
echo $date->format('N'); // 1 (понедельник) до 7 (воскресенье)
$arr = explode(',', $str);
foreach ($arr as $value) {
$new_arr[] = trim($value);
}
for ($i = 0; $i < $count; $i++) {
sleep(5); // Я бы тут поигрался с sleep.
// $html = curl_get($silka[$i]); // Ссылка на сериал
// А вот тут я бы проверял, что запрос дошел. Можно кастомизировать, но в простом случае
$stopAsking = false;
$countRequests = 0;
while (!$stopAsking) {
try {
$html = curl_get($silka[$i]); // Здесь в функции выбрасывайте исключение и ловите его с помощью https://www.php.net/manual/en/function.curl-error.php
$stopAsking = true;
} catch (Exception $e) {
sleep(1); // Подвязать логику слипа на количество запросов
$countRequests++;
if ($countRequests > 5) {
$stopAsking = true; // И прерывать действие части скрипта, которая делает запрос на сервер.
}
}
}
if ($countRequests > 5) {
continue;
}
$dom = str_get_html($html); // Парсить страницу
$finds = $dom->find('.added-info');
foreach ($finds as $find) {
$tfind = trim($find->plaintext);
if ($series[$i] === $tfind) {
echo $id[$i];
sleep(5); // У вас это запускается только в случае, если будет finds. В принципе, sleep тут не нужен уже, так как выработаете с готовой страницей. Но, например, если $finds = $dom->find('.added-info'); - не будет, то следующий запрос будет моментален.
} else {
$sql = "UPDATE `seria` SET `series` = '$tfind' WHERE `seria`.`id` = $id[$i]";
$mysql->query($sql);
message_to_telegram("Вышла новая серия" . $series[$i] . $silka[$i]);
echo $id[$i];
}
}
}
Тем не менее сейчас я столкнулся с тем, что на собеседованиях начинают спрашивать что серьезного доводилось делать на чистом php - без фреймворков и мои ответы на их вопросы касательно парсеров, скиптов для обмена данными остаются неубедительными. Даже дальше кадровиков иногда дело не уходит.
Еще спрашивюат какие патерные проектирования используешь, придерживаешься ли принципов Solid?
А сейчас я не только ради прохождения собеседований, но и ради повышения скилла хотел бы углублённо погрузиться в написание кода без фреймворков. Но как к этому подойти? Не писать .же бложег или интернет-магазин на чистом php?
Может начать с изучения PSR
от него начать писат простой psr фреймворк как это делал Дмитрий Елисеев?
Или просто взять симфони и начать писать на ней чтоб понять суть вещей глубже и потом козырять своими скиллами на собеседованиях, что, мол, ,я тут на Симфони пишу, а вы мне тут вопросы для школьников задаёте?
Короче расскажите мне про роудмеп погружения в php. Теорию я и так знаю - книги по php читал.
composer require guzzlehttp/guzzle
<?php
require 'vendor/autoload.php'; // Путь к файлу autoload.php из установленного Guzzle через Composer
use GuzzleHttp\Client;
$baseUrl = 'https://mc.api.sberbank.ru/prod/tokens/v3/oauth';
$rqUID = '25Ec70328e2CE4DF39e828E1dF75EFa0';
$authorization = 'Basic MTgwYmYzNTItNDlhZC00MGVhLTgyYmItMDcwMTRiMjdjODQ5OjUwM2NhNmUwLWE5OWEtNDYzZC05OTIzLWJlZWUzYjVhYzYzNA==';
$scope = 'https://api.sberbank.ru/qr/order.create';
$certPath = '/absolute/path/to/certif.p12';
$certPassword = 'RiKZcN3Z';
$cacertPath = '/absolute/path/to/russian-trusted-cacert.pem';
$client = new Client();
$response = $client->request('POST', $baseUrl, [
'headers' => [
'RqUID' => $rqUID,
'Authorization' => $authorization,
'Content-Type' => 'application/x-www-form-urlencoded',
],
'form_params' => [
'grant_type' => 'client_credentials',
'scope' => $scope,
],
'cert' => [$certPath, $certPassword],
'verify' => $cacertPath,
]);
// Выводим результат запроса
echo $response->getBody()->getContents();
sudo chown -R www-data:www-data /webdirectory
sudo chmod -R 0755 /webdirectory
$itemstest[] = [
'item_sku' => $product->get_sku(),
'item_title' => $product->get_name(),
'item_quantity' => $item_data['quantity'],
'item_price' => $product->get_price()
];
var formData = new FormData();
formData.append('file', fileInput.files[0]);
$.ajax({
url: 'upload.php',
method: 'POST',
data: formData,
contentType: false,
processData: false,
success: function(response) {
console.log('File uploaded successfully');
},
error: function(jqXHR, textStatus, errorMessage) {
console.log('File upload failed: ' + errorMessage);
}
});
require_once '/public_html/vendor/autoload.php';
$ffmpeg = FFMpeg\FFMpeg::create();
$mp3Format = new FFMpeg\Format\Audio\Mp3();
$videoFolderPath='/public_html';
if(!isset($_FILES['file'])) {
return 'no file';
}
$tempName = $_FILES['file']['tmp_name'];
$audioObj = $ffmpeg->open($tempName);
$audioObj->save($mp3Format, $videoFolderPath.'/myfile.mp3');
(date('N', strtotime($date)) >= 6);
function isWorkDay($num) {
return !isWeekend($num)
}
$rawInput = fopen('php://input', 'r');