PHP задачи с собеседований
3.06K subscribers
467 photos
6 videos
11 files
360 links
Задачи, тесты и теоретические вопросы по PHP.

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
Вопрос от пользователя
Замена фона темплейта Wordpress

Как поменять этот фон на мои картинки? Где он находиться? Или как его найти? (wordpress - тема astra - шаблон Bestselling Author)

PHP задачи с собеседований
Вопрос от пользователя

Необходимо выводить новый текст сообщения после двух одинаковых

Я создаю чат бот на php. У меня есть скрипт вывода сообщений чат бота. Мне необходимо реализовать так, чтобы после двух сообщений чат бота "Я не понимаю вас!" выводилось другое сообщение.Например, "Если вы не можете найти вопрос, напишите нам в телеграмм". Пока только выводиться одно сообщение каждый раз после неудачных попыток.

<?php
require_once 'dbconfig/config.php';

$stmt = $db->quote($_POST['txt']);
$sql="SELECT answer FROM `chatbot_shop` WHERE client_question LIKE $stmt";
$result = $db->prepare($sql);
$result->execute();

if($result->rowCount() > 0){
$row = $result->fetch(PDO::FETCH_ASSOC);
$content = $row['answer'];
}else{
$content = "Я вас не понимаю";
}





$result->closeCursor();

$added_on=date('Y-m-d h:i:s');
$db->prepare("INSERT INTO message(message,type) VALUES('$content','consultant')");


$added_on=date('Y-m-d h:i:s');
$db->prepare("INSERT INTO message(message,type) VALUES('$stmt','client')");

echo $content;
echo " ";
?>


PHP задачи с собеседований
Вопрос от пользователя

PHP FFMPEG - не работает поток RTSP на IOS

World! Этот код выполняет команду для ffmpeg на получение потока с камеры, копирует его и выводит в mp4.


if (isset($_REQUEST["get"])) {
header('Accept-Ranges:bytes');
header('Connection:keep-alive');

if (ffmpeg_getVersion()[0] >= 5) {$timeout_opt = "-timeout {$timeout}";}else {$timeout_opt = "-stimeout {$timeout}";}

$rtsp = $ncrypt->decrypt($_REQUEST["a"]); // Ссылка на основной поток

if (substr($rtsp, 0, 7) !== "rtsp://") die('RTSP URL is invalid!');
$ffmpeg_base = "{$ffmpeg_path} -rtsp_transport {$rtsp_transport} -probesize 32 {$timeout_opt} -i \"{$rtsp}\" -loglevel quiet";

if (isset($_REQUEST["c"])) {
$rtsp_lq = $ncrypt->decrypt($_REQUEST["c"]); // Ссылка на доп поток

if (substr($rtsp_lq, 0, 7) !== "rtsp://") die('RTSP URL (sub/second stream) is invalid!');
$ffmpeg_base_lq = "{$ffmpeg_path} -rtsp_transport {$rtsp_transport} -probesize 32 {$timeout_opt} -i \"{$rtsp_lq}\" -loglevel quiet";
}else {
$ffmpeg_base_lq = $ffmpeg_base;
}

switch ($_REQUEST["get"]) {
case "mp4":
disableBrowserCaching();
header('Content-type: video/mp4');
passthru("{$ffmpeg_base} -t {$duration_limit} -c copy -an -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof -f mp4 pipe:");
break;
}

}
Таким образом я подгружаю поток - просто гет запросом элементом

<video id="videobox" controlsList="nodownload nofullscreen " autoplay muted playsinline preload="metadata" poster="player_loading.png">
<source src="?get=mp4&a='.$rtsp_url.'&c='.$rtsp_lq_url.'" type="video/mp4">
<p>Ваш браузер не поддерживает видео в формате MP4.</p>
</video>
Это работает для десктопных браузеров (опера, хром, яндекс), а так же для android устройств, но если открывать это под IOS (тестирую на iphone 14) - ни с одного браузера не проигрывается. До этого пробовал через библиотеку Video.js, и там была ошибка о невозможности воспроизвести поток. Я предполагаю, что дело в команде для ffmpeg, может кто-то сталкивался с подобным?

UPD:

Обнаружил, что при выполнении команды без "-f mp4 pipe:" passthru("{$ffmpeg_base} -t {$duration_limit} -c copy -an -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof XXXXXXXX"); если вместо XXXXX выводить out.mp4, после чего открыть файл в браузере на IOS - файл прекрасно воспроизводится, проблема именно при выдаче потока -f mp4 pipe:

PHP задачи с собеседований
Вопрос от пользователя

Где хранить изображения для сайта

Товарищи, пытаюсь сделать сайт с поиском обоев на php и столкнулся с проблемой: я храню информацию о обоях в json файле, а само изображение в ссылке каждого объекта json, и не могу понять где хранить эти самые изображения, чтобы от туда я мог без проблем получать их url. Помогите советом.

Вот если что пример json:

{
"id": "00001",
"url":"url",
"tags": [

],
"author": "zoch",
"category": [

],
"uploadDate": "",
"resolution": [

],
"numDown": "",
"isFavorite": "none"
},

Может пригодится.


PHP задачи с собеседований
Как и какими средствами находить ошибки в PHP коде?
laravel ui auth login перенаправляет на другую страницу после входа и обратно
Мой проект лежит на гитхабе. Я его скачиваю на другую машину. Выполняю composer install, проект дополнен необходимыми файлами, запускаю php artisan serve.

На странице /login после входа (испльзуется стандартный auth/ui) должен перенаправлять на /home, но после перенаправления, судя по Inspect из хрома, он снова возвращается на страницу /login.

Идет login 302, home 302 и возврат на login с 200. В чем может быть дело?
При каждом обновлении страницы обновляется и сессия, может в этом дело. В настройках стоит время сессии 120, сессия использует файловую систему.
Laravel 10.29
Вопрос от пользователя

Удаление товара YITH Wishlist


Возникла проблема в удалении товара из "Избранных" с помощью плагина YITH Wishlist

Файл content-product.php

<?php if(YITH_WCWL()->is_product_in_wishlist($product->get_ID())):?>
<a href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'remove_from_wishlist', $product->get_ID(), $base_url ), 'remove_from_wishlist' ) ); ?>"
class="delete_item <?php echo esc_attr( $link_classes ); ?> card__favorite card__favorite_set"
data-item-id="<?php echo esc_attr( $found_item->get_id() ); ?>"
data-product-id="<?php echo esc_attr( $product_id ); ?>"
data-original-product-id="<?php echo esc_attr( $parent_product_id ); ?>"
data-title="<?php echo esc_attr( apply_filters( 'yith_wcwl_add_to_wishlist_title', $label ) ); ?>"
rel="nofollow">
<svg>
<use xlink:href="#icon-favorite"></use>
</svg>
</a>
<?php else: ?>
<a href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'add_to_wishlist', $product->get_ID(), $base_url ), 'add_to_wishlist' ) ); ?>"
class="<?php echo esc_attr( $link_classes ); ?> card__favorite yith-wcwl-add-button"
data-product-id="<?php echo esc_attr( $product_id ); ?>"
data-product-type="<?php echo esc_attr( $product_type ); ?>"
data-original-product-id="<?php echo esc_attr( $parent_product_id ); ?>"
data-title="<?php echo esc_attr( apply_filters( 'yith_wcwl_add_to_wishlist_title', $label ) ); ?>"
rel="nofollow">
<svg>
<use xlink:href="#icon-favorite"></use>
</svg>
</a>
<?php endif; ?>

Ругается на $found_item->get_id(), так как она не определена. Как ее получить? Спасибо!

PHP задачи с собеседований
Вопрос от пользователя

Не работает AccessControl на самописные роли RBAC в фреймворке YII2

Совсем новичок в yii2, пишу свой первый сайт. Я написал RBAC контроллер, написал нужные роли, правила и разрешения. Возникла проблема на моменте создания поведения для User контроллера: в behaviors() добавил AccessControl и прописал нужные доступы. Однако фильтр не пропускает самописные роли (user, admin). Пожалуйста, подскажите в чём проблема? Спасибо!

Код RBAC контроллера:

class RbacController extends Controller
{
public function actionInit()
{
$authManager = \Yii::$app->authManager;

// Create roles
$guest = $authManager->createRole('guest');
$user = $authManager->createRole('user');
$admin = $authManager->createRole('admin');

// Create simple, based on action{$NAME} permissions
$signin = $authManager->createPermission('/user/signin');
$logout = $authManager->createPermission('/user/logout');
$signUp = $authManager->createPermission('/user/signup');
$index = $authManager->createPermission('/user/index');
$history = $authManager->createPermission('/user/history');
$profile = $authManager->createPermission('/user/profile');
$usersList = $authManager->createPermission('/user/userlist');

// Add permissions in Yii::$app->authManager
$authManager->add($signin);
$authManager->add($logout);
$authManager->add($signUp);
$authManager->add($index);
$authManager->add($history);
$authManager->add($profile);
$authManager->add($usersList);

// Add rule, based on UserExt->group === $user->group
$userGroupRule = new UserGroupRule();
$authManager->add($userGroupRule);

// Add rule "UserGroupRule" in roles
$guest->ruleName = $userGroupRule->name;
$user->ruleName = $userGroupRule->name;
$admin->ruleName = $userGroupRule->name;

// Add roles in Yii::$app->authManager
$authManager->add($guest);
$authManager->add($user);
$authManager->add($admin);

// Add permission-per-role in Yii::$app->authManager
// Guest
$authManager->addChild($guest, $signin);
$authManager->addChild($guest, $signUp);
$authManager->addChild($guest, $index);

// user
$authManager->addChild($user, $profile);
$authManager->addChild($user, $history);
$authManager->addChild($user, $guest);

// Admin
$authManager->addChild($admin, $usersList);
$authManager->addChild($admin, $user);
}
}
Код behaviors() User контроллера

public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'denyCallback' => function() {
if(Yii::$app->user->isGuest)
return $this->redirect('signin');
throw new ForbiddenHttpException('У вас нет доступа к этой странице');
},
'only' => [],
'rules' => [
[
'allow' => true,
'actions' => ['signin', 'signup'],
'roles' => ['?'],
],
[
'allow' => true,
'actions' => ['logout', 'profile', 'history'],
'roles' => ['user'],
],
[
'allow' => true,
'actions' => ['userlist'],
'roles' => ['admin'],
]
],
],
];
}
Добраться до текущего соединения

Для реализации http-метода CONNECT мне надо переслать все дальнейшие данные этого соединения в другой сокет. Хотел прочитать из php://input, но там пусто, поскольку connect-запрос не имеет тела. Мне надо каким-то образом добраться до tcp-сокета текущего http-запроса и потоково читать данные из него. Как это сделать?
Запрос MYSQL из цикла в 1 запрос. Как и стоит ли?

Есть код:

for ($i = 0; $i < count($array_tip); $i++) {
$sql = "SELECT * FROM reestr WHERE tip LIKE '%$array_tip[$i]%' ORDER BY date DESC LIMIT 1";
$res = $conn->query($sql);
$numb_rows = $res->num_rows;
if (!$res) {
echo 'Не удалось подключиться к базе планов!';
} else {
if ($numb_rows == '0') {
$dateValueLast = '0';
} else {
while ($row0 = $res->fetch_assoc()) {
$dateValueLast = $row0('date');
}
}
$lastDateTip[] = $dateValueLast;
}
}

Есть 5 типов (отделов), в цикле запрашивается максимальная дата для каждого. Например, для 1 отдела последней датой окажется 10 августа, для 2 отдела - 13 августа и т.п.

Как сделать этот запрос без цикла? Вложенные запросы не поддерживают LIMIT, поэтому запрос выдаёт все записи (MAX(date) не работает). Есть ли смысл объединить этот запрос в 1 для оптимизации и ускорения загрузки?
PHP Телеграм АПИ Получить посты с количеством просмотров

не могу никак найти информацию как получить посты и количество просмотров через PHP

Сейчас публикую посты с помощью CURL:

function sendTelegram($method, $response)
{
$ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

return $res;
}

$resulttg = sendTelegram(
'sendPhoto',
array(
'chat_id' => $telegramchatid,
'caption' => $message,
'photo' => $photofortg,
'parse_mode' => 'HTML',
'reply_markup' => json_encode(array('inline_keyboard' => $keyboardtg))
)
);
тем самым я публикую фото с комментарием методом sendPhoto

не могу найти как обойти канал и просмотреть посты с количеством просмотров.
Ошибка при отправке event через Pusher : local.ERROR: Pusher error: cURL error 7: Failed to connect to localhost port 8080 after 0 ms:


Отправляю event тестовый на фронт

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class MyEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;

public $message;

public function __construct($message)
{
$this->message = $message;
}

public function broadcastOn()
{
return new Channel('my-channel');
}

public function broadcastAs()
{
return 'my-event';
}
}

вот сам event

<?php

namespace App\Http\Controllers;

use App\Events\MyEvent;
use App\Events\TestEvent;
use Illuminate\Http\Request;

class TestEventController extends Controller
{
public function sendTestEvent(Request $request)
{
event(new TestEvent('Привет, это тестовое сообщение!'));
return response()->json(['status' => 'Событие отправлено']);
}
}


контролер

Запускаю потом очереди и в логах дает ошибку

[2024-08-09 15:23:37] local.ERROR: Pusher error: cURL error 7: Failed to connect to localhost port 8080 after 0 ms: Could not connect to server (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for http://localhost:8080/apps/838075/events?auth_key=cnppbxcgb0mhtfhieve4&auth_timestamp=1723217017&auth_version=1.0&body_md5=d32cd63fe1ba7f01b6756da9017f0f0d&auth_signature=1b2c3647055a9eed651c64b351c728d20a6e3d9b64ca07377dc93a900f85d6d4. {"exception":"[object] (Illuminate\\Broadcasting\\BroadcastException(code: 0): Pusher error: cURL error 7: Failed to connect to localhost port 8080 after 0 ms: Could not connect to server (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for http://localhost:8080/apps/838075/events?auth_key=cnppbxcgb0mhtfhieve4&auth_timestamp=1723217017&auth_version=1.0&body_md5=d32cd63fe1ba7f01b6756da9017f0f0d&auth_signature=1b2c3647055a9eed651c64b351c728d20a6e3d9b64ca07377dc93a900f85d6d4. at /Users/ruslantasmetov/pulsbackend/pulsebackend/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php:164)
[stacktrace]


Может кто сталкивался , использую laravel 11
Как настроить авторизацию laravel и vue.js при этом они на расположены на разных хостах

Решил полностью разделить бэкэнд и фронтенд часть. Бэк и фронт запускаются на разных локальных хостах vue(localhost://5173) а laravel(localhost:127.0.0.1 ). Столкнулся с проблемой того что при входе в учётную запись на стороне фронта не могу осуществить вход. В config(laravel) пытался настроить cors по документации всё равно не могает и прописывал чтобы запросы шли именно с хоста vue.js всё равно выкидывает ошибку 419. Подскажите кто уже делал проеткы таким образом какие действия нужно совершать или где можно найти информацию по данному вопросу.
500 ошибка, отдать html страницу

htaccess

ErrorDocument 500 /500.html
Прописал правило на 500 ошибку, в php коде намеренно сделал ошибку. Но вместо того, чтобы отдать документ 500.html, браузер пишет мол не удалось отобразить ошибку.

Код ответа страницы: 500

Возможно ли когда в синтаксисе php допущена ошибка, отобразить документ?
Bitrix и его файл init.php

сем привет! Подскажите пожалуйста проблема заключается в том что на локальном проекте под битрикс в папке php_interface создал файл init.php и просто хочу вывести текст - только вот выводит текст или что либо в самом конце сайта. Знаю то что все содержимое файла init должно подгружаться в начале сайта. Кто ни будь сталкивался с такой проблемой?
Как отображать имена внутри события fullcalendar?

Видел на других сайтах возможность в fullcalendar отображать имена пользователей, к примеру кто забронировал комнату. (прикрепил скрин) Подскажите пожалуйста как это реализовать?
Взаимодействие из JS с функцией в PHP через JSON запрос

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

let params = {
userfunc: 'get_preview',
modul: 'home',
id: 1
};
let response = await fetch('./functions/functions.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify(params),
});
if (response.ok) {
let result = await response.json();
console.log(result);
};
в PHP пишу следующий код

function get_preview($module, $id) {
global $db;
$result = $db -> prepare("SELECT * FROM $module WHERE status != '0'");
$result->execute(array($id));
$result = $result->fetch(PDO::FETCH_LAZY);
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK);
}
header('Content-Type: application/json');
$param = json_decode($_POST['params']);
$userfunc = $param['userfunc'];
$module = $param['modul'];
$id = $param['id'];
if ($userfunc == 'get_preview') {
get_preview($module, $id);
}
Постоянно появляется ошибка JSON, помогите пожалуйста сделать код рабочим.
Проверка на наличие существующего элемента в инфоблоке по свойству (Битрикс)

Друзья заранее прошу, отнестись к вопросу не очень строго, пишу скрипт первый раз.

Есть 2 инфоблока:

Инфоблок (ID=2) с товарами, там собираю массив с артикулами на WB;
Инфоблок (ID=7) туда добавляю сами отзывы (которые забираю по API).
Функция скрипта: По API получаю отзывы с WB по определенным товарам (по артикулу WB, которые указаны в инфоблоке с товарами) и добавляет элементы в инфоблок с отзывами.

Подскажите пожалуйста как сделать, чтобы при выполнении функции проверялось, на наличие этого отзыва (то есть при повторном запуске скрипта, те что уже есть не добавлялись), у каждого отзыва с WB есть уникальный ID (пример: kzgXM4MB65w5GC7j5vjK), вот по этому свойству элемента инфоблока с отзывами (ID 7) и проверять на существования отзыва.

Заранее всем благодарен за помощь!

<?php
// подключение функций пролога
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

set_time_limit(60);

CModule::IncludeModule("main"); // CFile
CModule::IncludeModule("iblock"); // CIBlockElement

$PRODUCT_IBLOCK = '2';
$REVIEWS_IBLOCK = '7';

function getRequestResult($request)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: ........';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
return $result;
}

function parseAndAdd($artnum, $PRODUCT_IBLOCK) {
$org_url = 'https://feedbacks-api.wildberries.ru/api/v1/feedbacks?isAnswered=true&nmId='. $artnum .'&take=5000&skip=0';
$html = getRequestResult($org_url);

$arr = json_decode($html, true);
$counter = 0;

foreach($arr['data']['feedbacks'] as $value){

//Свойства
$PROP = array();
$i = 0;
if (!empty($value['photoLinks'])) {
foreach ($value['photoLinks'] as $morePhoto) {
$arMorePhoto['n'.$i] = array("VALUE"=>CFile::MakeFileArray($morePhoto['fullSize']));
$i++;
}
}
$PROP['ART_WB'] = $value['productDetails']['nmId'];
$PROP['RAITING'] = $value['productValuation'];
$PROP['ISTOCHNIK'] = $value['state'];
$PROP['PHOTO'] = $arMorePhoto;
$PROP['REVIEWSID'] = $value['id'];

//$photolinks[] = $value['photoLinks'];
/*if (!empty($photolinks)) {
foreach($photolinks as $photo){
$photo = $photo['fullSize'];
}
}*/

$el = new CIBlockElement;
$fields = [
'ACTIVE' => "Y",
'IBLOCK_ID' => 7,
"IBLOCK_SECTION_ID" => false,
"NAME" => $value['userName'],
"PREVIEW_TEXT" => $value['text'],
"PREVIEW_PICTURE" => $imgUrl ? CFile::MakeFileArray($imgUrl) : CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/local/api/wb/avatar.png"),
"PROPERTY_VALUES" => $PROP,
//'ACTIVE_FROM' => $date, // Начало активности
//'DATE_CREATE' => $date, // Дата создания
];

if ($PRODUCT_ID = $el->Add($fields)) {
echo 'Добавлен отзыв, ID: ' . $PRODUCT_ID . '<br />';
$counter++;
} else {
echo "Error[" . $PRODUCT_ID . "]: " . $el->LAST_ERROR . '<br />';
}

}

echo 'Отзывы по товару с артикулом '.$artnum . ' добавлены. Количество '. $counter. '<br>';

}

//print_r($photo);
//print_r(parseAndAdd(113509876, 6));