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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
Ошибка Call to undefined function mysqli_connect()

Не могу подключить базу данных к сайту. При попытке подключить БД выдаётся такая ошибка:

Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in D:\Проекты\Новая папка\index.php:11 Stack trace: #0 {main} thrown in D:\Проекты\Новая папка\index.php on line 11

У меня OC Windows 11

Вот мой код:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>Не работает php</p>
<?php
$connection=mysqli_connect('localhost', 'root', '', 'data');
$sql = "SELECT Name FROM tablical";
$massive=mysqli_query($connection, $sql);
$data=mysqli_fetch_assoc($massive);
foreach ($data as $key => $value) {
print_r($value);
}
?>



</body>
</html>
Авторизация действий над определенными полями на основе ролей и разрешений

Использую пакет spatie-permission, Laravel 11.У юзера есть permission формата entity.action.value, например - order.edit.description(редактировать описание заказа) или order.see.Accepted (видеть заказы со статусом Accepted). У меня появились две идеи как это авторизовать: первая - написать кастомное правило валидации и применить к каждому полю в FormRequset:

public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (!Gate::allows($this->action,[$attribute,auth()->user()])){
$fail('You do not have permission to interact with this field.');
}
}
Gate:

Gate::define('order-edit-field', function (User $user,string $attribute): bool {
return (in_array($attribute,$user->convertPermissionToValue('order.edit')) || $user->isAdmin());
});
Идея в чем - все разрешения обрезаются с помощью convertPermissionToValue() до value , и это value сравнивается с пришедшем с реквеста полем.

Вторая мысль - через политики:

public function update(User $user, Order $order,array $data): bool
{
if ($user->isAdmin()){
return true;
}

$fields = $user->convertPermissionToValue('order.edit');
$statuses = $user->convertPermissionToValue('order.view');
return in_array($order->status,$statuses)
&& array_reduce(array_keys($data),function ($accum, $item ) use ($fields){
return in_array($item,$fields) && $accum;
},true);
}
Сравнивается .value и fields реквеста, если какого то field нет в value - 403. Таким же образом проверяются любые действия над сущностями - permissions обрезаются до value, value сравнивается с полями ,со статусами, и вообще с чем угодно ,над чем нужно будет совершить action.

В чем собственно говоря вопрос: хоть один из этих вариантов - так вообще норм делать ? Сколько бы не гуглил, я не смог найти как именно организовать авторизацию действий над конкретными полями. Есть какие примеры реализации такого, как бы это вы сделали, где разумно было бы делать подобные проверки, хорошая ли вообще идея с convert разрешений, рабочая ли идея с такими составными permission. Буду ооочень благодарен за любую помощь или подсказку, ибо я новичок и даже те два примера выше выдались огромными нервозатратами)
Качество кода, архитектуры. Service and Repository pattern. PHP & Laravel

Стремлюсь к очень качественному коду, посоветоваться не с кем. Вычитал очень много про архитектуру и пришел к этому (Пример на PHP Laravel)

Middleware - Прослойка запроса, проверка аутентификации и подобного, если это необходимо

FormRequest - Тут мы делаем валидацию запроса(Если это не GET)

Controller - тут мы принимаем запрос, делаем валидацию, если FormRequest не предусмотрен, отдаем это всё в Service и затем отдаём ответ

Service - Тут вся бизнес логика, обращение к Repository

ServiceInterface - интерфейс для нашего Service, для гибкости кода

Repository - логика обращения к базе данных, модели, все запросы и т д

RepositoryInterface - интерфейс для Repository, так же для гибкости

Затем мы регистрируем наши интерфейсы и их реализацию в ServiceProvider и работаем по такой архитектуре.

Хотел спросить - всё ли верно, не излишне ли, стоит ли добавить какой то шаг или же убрать. Спасибо
Как устроена реализация в играх кликерах обработка и сохранение кликов в бд?

Каждый клик допустим это +N монет. Отправлять при каждом клике на фронте событие в виде простого запроса на бэк, где инкрементируется значение в бд - очевидное и простое решение, но будет высокая нагрузка на бэк. Поэтому интересно как лучше всего решать задачи подобного плана и какие инструменты использовать.

Я так понимаю для таких задач нужен какой то демон на сервере собирающий события пользователей о кликах в оперативке и после интервально сохранять в БД подсчитав и проверив данные, так как хранить на фронте даже шифруя наверное будет опрометчиво и при желании можно будет обмануть сервер? Какими инструментами лучше решать эту задачу? nginx push stream, socketio nodejs или есть еще варианты?

Буду благодарен за любую подсказку, может статью которая задевает этот технический аспект, ну и названия пакетов\допов для веб-сервера.
Один источник данных для множества каналов

Всем привет.

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

Источник->Раздающий скрипт->Потребители

То есть, я получаю по вебсокету и по curl определенные данны. По вебсокету бегут постоянно, по curl более статичные. Мне нужно, желающим, эти данные отдавать не неся нагрузку на Источник. То есть Источник только предоставляе их одному сайту, а тот сайт уже раздает другим.

Вопрос в том, как правильно организовать раздачу вебсокета, если к Источнику я могу подключить только один канал?

Я с вебсокетом работал только в простом варианте - получить, отправить и т.д.
laravel pusher не работает почему то отправка

'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',
'port' => env('PUSHER_PORT', 443),
'scheme' => env('PUSHER_SCHEME', 'https'),
'encrypted' => true,
'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
],
'client_options' => [
// Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
],
],
Файл конфигурации не трогал просто добавлял в env креды ,на прямую креды работают если использовать

public function sendTestMessage()
{
$options = [
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => true
];
$pusher = new Pusher(
env('PUSHER_APP_KEY'),
env('PUSHER_APP_SECRET'),
env('PUSHER_APP_ID'),
$options
);

$data['message'] = 'hello world';
$pusher->trigger('test-channel', 'my-event', $data);

return response()->json(['message' => 'Event has been sent!']);
}
Отправляю Event после того как создал заказ но сам event не приходит в pusher Debug Console

Использую laravel 11
Разделить список директории на дочерние и родительские

Подскажите правильное направление или пример. Есть список:

$list = ['folder', 'folder2','folder2/items','folder2/items/css','folder2/images'];
Нужно получить многомерный массив с дочерними элементами:

$list = [
["name" => "folder", "path" => "/folder", children: []],
["name" => "folder2", "path" => "/folder2", children:
[
"name" => "items", "path" => "/folder2/items", children:
[
"name" => "css", "path" => "folder2/items/css", children: []
],
"name" => "images", "path" => "/folder2/images", children: [],
]
],
];
Bitrix24 вызов попапа посредством события в inti.php

В init.php прописываю событие, которое должно открывать попап после сообщения в открытых линиях, само событие отрабатывает, в лог пишет. Но попап в CRM не открывается. Вот само событие:

AddEventHandler("imopenlines", "OnSessionStart", "OnFirstMessage");
function OnFirstMessage($arFields) {
$chatId = $arFields['CHAT_ID']; // Логируем ID чата в файл для дальнейшей обработки
file_put_contents(__DIR__."/test.txt", $chatId . PHP_EOL, FILE_APPEND);
\Bitrix\Main\Page\Asset::getInstance()->addString('
<div id="openline_confirm"></div>');
\Bitrix\Main\Page\Asset::getInstance()->addString('
<script>
BX.ready(function() {
var Confirmer = new BX.PopupWindow("openline_confirm", null, {
content: "<div></div>" + "<h3>Новое сообщение в открытых линиях</h3>",
closeIcon: {
right: "20px",
top: "20px"
},
width: 350, // ширина окна
height: 150, // высота окна
zIndex: 100, // z-index
draggable: false, // можно двигать или нет
resizable: true, // можно ресайзить
min_height: 250, // минимальная высота окна
min_width: 100, // минимальная ширина окна
overlay: {
backgroundColor: "black",
opacity: "80"
},
buttons: [
new BX.PopupWindowButton({
text: "Принять",
className: "popup-window-button-accept",
events: {
click: function() {
BX.Messenger.Public.openLines();
this.popupWindow.close();
}
}
}),
new BX.PopupWindowButton({
text: "Отклонить",
className: "webform-button-link-cancel",
events: {
click: function() {
this.popupWindow.close();
}
}
})
]
});
Confirmer.show();
});
</script>');
CJSCore::Init(array("Confirmer"));
}
При событии js на стороне клиента не добавляется, как это можно реализовать?
Ошибка в получении данных VK Api

Подскажите почему возникает ошибка "Ошибка при получении данных"? Ничего не отдается хотя id и токен ввожу правильно

<?php
$group_id = '******';
$access_token = '********';
$count = 5; // Количество постов

$url = "https://api.vk.com/method/wall.get?owner_id=-$group_id&count=$count&access_token=$access_token&v=5.131";
$response = file_get_contents($url);
$data = json_decode($response, true);

if (isset($data['response']) && isset($data['response']['items'])) {
$posts = $data['response']['items'];

foreach ($posts as $post) {
// Выводим текст поста
echo $post['text'] . '
';

// Дополнительные действия с постом
// Например, вывод изображений, комментариев и т.д.
}
} else {
echo 'Ошибка при получении данных';
}
?>
php
Как установить правильно sqlsrv для php?

0

В общем я пытался установить sqlsrv, с помощью вот этой документации: https://learn.microsoft.com/ru-ru/sql/connect/php/microsoft-php-driver-for-sql-server?view=sql-server-ver16#getting-started, но у меня после вызова phpinfo нет sqlsrv. Что находиться в php(Тип файла INI-DEVELOPMENT):

extension_dir = "C:\php\ext"
extension=php_pdo_sqlsrv_82_ts_x64.dll
extension=php_sqlsrv_82_ts_x64.dll
Моя версия php: PHP Version 8.2.20 Мне это нужно для того, чтобы подключиться ко внешней БД, со своего локального ПК (у меня нет сервера). Но у меня появилась ошибка: Fatal error: Uncaught Error: Call to undefined function sqlsrv_connect() in C:\Users\ivakov.av\Desktop\Php_Projects\sigur.php:15 И мне надо установить корректно sqlsrv, помогите, пожалуйста!

// Подключаемся к MS SQL
$serverName = ""; // Имя сервера MS SQL
$connectionInfo = array(
"Database" => "", // Имя базы данных
"UID" => "", // Имя пользователя
"PWD" => "" // Пароль
);
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
echo "Connection failed: " . print_r(sqlsrv_errors(), true);
exit;
}
PHP parse/syntax errors; Ошибки Unexpected XXX и как решить их

Часто программисты допускают ошибки. Могут возникать ошибки синтаксиса. Например:

PHP Parse error: syntax error, unexpected '{' in index.php on line 20

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

Всегда смотрите на контекст кода. Синтаксическая ошибка часто кроется в упомянутых или в предыдущих строках кода. Сравните свой код с примерами синтаксиса из руководства.
cms для блога прошу о помощи

здравствуйте у меня такой вопрос я пока нечего не понимаю в программирования решил разработать cms для блога , в краце подскажите пж как создать связь меж этими таблицами я пользуюсь PhpMyAdmin id | login | password | screen_name

#posts id | alias | author_id | date_posted

#posts_content post_id | language_id | title | post_body

#comments id | post_id | author_id | text | date_posted | parent_comment_id
Каким образом можно автоматизировать HTTP запросы на интернет-ресурс, чтобы они выполнялись круглосуточно?

Задача следующая: есть URL, на который требуется с определенной периодичностью отправлять POST-запросы 24/7. Набросал код на JS и запустил на ноде, все работает. Но свой компьютер постоянно включенным держать не могу. Первая идея - арендовать виртуальный сервер и отправлять запросы с него, но в серверной разработке я полный ноль. Арендованный виртуальный сервер у меня есть, но использую я его только для тестов фронтенда, с серверными скриптами ни разу не работал. Есть ли вообще такая возможность? Подскажите направление куда копать.
Исправление конфигурации OPcache ускорило работу PHP-приложения в 3 раза

Правильное управление OPcache при атомарных деплойментах позволило:

🔸Ускорить приложение в 3 раза.
🔸Снизить нагрузку на CPU в 10 раз.
🔸Сохранить сотни дней на время загрузки для пользователей.

Проблема
При деплойментах с символьными ссылками OPcache продолжает кэшировать файлы предыдущих релизов, заполняя память. Это снижает эффективность кэша.

Решение
Сбрасывать OPcache при каждом деплойменте с помощью cachetool. Это гарантирует, что файлы нового релиза будут кэшироваться заново.

Настройки OPcache
opcache.validate_timestamps=0 — отключить проверку временных меток.
opcache.file_update_protection=0 — мгновенное кэширование новых файлов.
Настроить объем памяти (opcache.memory_consumption) и количество файлов (opcache.max_accelerated_files) для ваших нужд.

Мониторинг
Добавьте ключевые метрики OPcache (свободная память, hit rate) в систему мониторинга. Это поможет выявлять проблемы и оптимизировать работу.

@phpquiz
Настраивать xdebug для первого запуска не нужно вообще! Как в Phpstorm запустить отладку за минуту и без браузера

Многие считают, что добиться успешного запуска отладки xdebug после его установки — тяжело и мучительно. Но на самом деле, сделать первый запуск можно менее чем за минуту, не делая настройки и даже не прикасаясь к конфигурационным файлам .ini (php.ini/xdebug.ini). Как это сделать? Об этом и пойдет речь в этой статье.

@phpquiz
Всех с наступившим новым годом! ❤️🌲

С завтрашнего дня публикации будут выходить как обычно.
🔥 Как избежать проблем с isset() и empty() в PHP?

Сегодня разберём две часто используемые функции в PHP — isset() и empty(), которые могут вести себя не так, как вы ожидаете.

📌 isset()
Функция isset($var) проверяет, была ли переменная установлена и не равна ли она null.
❗️ Пример подвоха:

$var = null;
var_dump(isset($var)); // false

Если переменной вообще нет в коде — тоже будет false.

📌 empty()
Функция empty($var) проверяет, считается ли переменная "пустой".
❗️ Пустыми считаются:
- "" (пустая строка)
- 0 (число)
- "0" (строка с нулём)
- null
- false
- [] (пустой массив)

Пример:

$var = "0";
var_dump(empty($var)); // true, хотя строка не null

⚠️ Ошибка: проверка if (!isset($var) || empty($var)) может привести к неожиданному результату.

🔥 Лучший подход?
Используйте строгие проверки:

if ($var === null) { /* Переменная null */ }
if ($var === &apos;&apos;) { /* Пустая строка */ }
if ($var === 0) { /* Число 0 */ }

Если проверяете массивы, то:

if (count($var) === 0) { /* Массив пуст */ }


Вывод: не злоупотребляйте isset() и empty(), а проверяйте переменные строго!
Какую из следующих функций PHP нужно использовать для получения текущего использования памяти?
Anonymous Poll
8%
get_usage()
4%
get_peak_usage()
82%
memory_get_usage()
12%
memory_get_peak_usage()
Какая из реализаций метода getName() не валидна в классе ChildCls?
Anonymous Poll
12%
protected function getName(){}
22%
function getName(){}
53%
private function getName(){}
29%
public function getName(){}