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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
👨🏻‍💻 Моя первая программа, не могу понять почему не работает

Это HTML

<!DOCTYPE html>
<html>
<head>
<title>TesT</title>
<meta charset="utf-8">
</head>
<body>
<h2>Введи свои данные:</h2>
<form action="display.php" method="post">
<p>Введите имя: <input type="text" name="firstname" /></p>
<p>Введите фамилию: <input type="text" name="lastname" /></p>
<input type="submit" value="Отправить">
</form>
</body>
</html>


PHP

<?php

$name = $_POST["firstname"];
$surname = $_POST["lastname"];


echo "Ваше имя: <b>".$name . " " . $surname . "</b>";
?>

Получаю вот такую ошибку

stderr: PHP Warning:  Undefined array key "firstname" in C:\Users\user\Desktop\phpGides\display.php on line 3
PHP Warning: Undefined array key "lastname" in C:\Users\user\Desktop\phpGides\display.php on line 4

PHP задачи с собеседований
👎14👍1
👨🏻‍💻 Как собрать массив из строчных данных?

Здравствуйте помогите пожалуйста понять алгоритм сборки данных в массив. надо собрать дерево категорий из строчных даных, все строки с ':' это данные которые должны быть в соответствующей категории.

Пример данных

db1
catA
cat1a1
prod1:a0
prod2:a0
prod3:a0
cat2a2
prod1:a1
prod2:a1
prod3:a1
catB
cat1b1
prod1:b0
prod2:b0
prod3:b0
cat2b2
prod1:b1
prod2:b1
prod3:b1
db2
catC
cat1c1
prod1:c0
prod2:c0
prod3:c0
cat2c1
prod1:c1
prod2:c1
prod3:c1
catD
cat1d2
prod1:d0
prod2:d0
prod3:d0
cat2d2
prod1:d1
prod2:d1
prod3:d1
на выходе должен получится массив

$db = [
'db1' =>
[
'catA' =>
[
'cat1a1' => ['prod1:a0', 'prod2:a0', 'prod3:a0'] ,
'cat2a2' => ['prod1:a1', 'prod2:a1', 'prod3:a1']
],
'catB' =>
[
'cat1b1' => ['prod1:b0', 'prod2:b0', 'prod3:b0'],
'cat2b2' => ['prod1:b1', 'prod2:b1', 'prod3:b1']
]
],
'db2' =>
[
'catC' =>
[
'cat1c1' => ['prod1:c0', 'prod2:c0', 'prod3:c0'] ,
'cat2c2' => ['prod1:c1', 'prod2:c1', 'prod3:c1']
],
'catD' =>
[
'cat1d1' => ['prod1:d0', 'prod2:d0', 'prod3:d0'],
'cat2d2' => ['prod1:d1', 'prod2:d1', 'prod3:d1']
]
]
];

дело в том что структура данных собирается по строчно, попробую объяснить: первая строка без ':' это главная категория если следующая строка тоже без знака ':' то это под категория и так далее до первой строки со знаком ':' типо db1->catA->cat1a1 если в строке есть знак ':' то данные записываются в последую под категорию.

плюс еще db1,catA,cat1a это пример, на сомом деле все данные разные я не могу ни к чему привязаться кроме знаков "\n" и ":"

db1->catA->cat1a=prod1:a0
db1->catA->cat1a=prod2:a0
db1->catA->cat1a=prod3

PHP задачи с собеседований
👍1
👨🏻‍💻 Как сохранить на сервер, сделанный через php xml файл?

Есть код, пытался через file сохранить и пытался и через curl, но ничего не получается, как сделать? Подскажите пожалуйста

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
/*
* Настройки
*/
require($_SERVER["DOCUMENT_ROOT"]."/1c_exchange/core/options.php");
/*
* Функции
*/
require($_SERVER["DOCUMENT_ROOT"]."/1c_exchange/core/functions.php");

$reader = new XMLReader();
$xmlfile = GetXML("users");
if (!$reader->xml($xmlfile)){
$error_text = date("d.m.Y H:i:s")." - Импорт сотрудников: полученный ответ от веб-сервиса не удалось открыть на чтение, как xml файл";
hlb_import_log($error_text);
die($error_text);
}
$arPositions = array();
//справочник должнсотей. их меньеш чем юзеров так что сначала получим его
CModule::IncludeModule("highloadblock");
$hlblock = Bitrix\Highloadblock\HighloadBlockTable::getById(HLB_POSITIONS_ID)->fetch();
$entity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$resPosition = $entity_data_class::getList(array ('order' => array ("ID" => "ASC"), 'filter' => array(), 'select' => array('*')));
while($arPosition = $resPosition->Fetch()) $arPositions[$arPosition["UF_NAME"]] = $arPosition;
$oUser = new CUser;
while ($reader->read()):
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'm:items'){
$data = new XMLReader();
$data->xml($reader->readOuterXML());
$UserFields = [];
$AcceptedPosition = [];
while($data->read()){
switch ($data->name){
case "m:id": $v = $d

PHP задачи с собеседований
👎2
👨🏻‍💻Задание для вас
Как занести выбранные элементы из json в массив PHP

Подскажите как занести из json файла в массив double все элементы link через for()?

[{"_id":"2","link":"t.me\/vamix"},{"_id":"1","link":"t.me\/texas"}]

$double = [];
$q=mysql_query("SELECT * FROM black ORDER BY _id DESC");
while($e=mysql_fetch_assoc($q)) $output[] = $e;
$string = json_encode($output);
print($string);

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

Валидация формы обратной связи php

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

Мне нужно сделать так что-бы нельзя было отправить пустые поля! Как мне это сделать?

Сам код:

sendmess.php

<?php

/* https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXXX/getUpdates,
где, XXXXXXXXXXXXXXXXXXXXXXX - токен вашего бота, полученный ранее */

$name = $_POST['user_name'];
$email = $_POST['user_email'];
$phone = $_POST['user_phone'];
$token = "TOKEN_BOT";
$chat_id = "CHAT_ID";
$arr = array(
'ФИО:' => $name,
'Email:' => $email,
'Телефон:' => $phone,
);


foreach($arr as $key => $value) {
$txt .= "<b>" . urlencode($key) . " </b>" . urlencode($value) ."%0A";
};

$sendToTelegram = fopen("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&parse_mode=html&text={$txt}","r");

if ($sendToTelegram) {
header('Location: index.php');
} else {
echo "Error";
}
?>


index.php

<!-- Форма обратной связи -->
<form action="sendmess.php" method="POST">

<!-- Каждый input для выравнивания вкладываем в блок input-box -->
<div class="input-box">
<input type="text" name="user_name" placeholder="ФИО" />
</div>
<div class="input-box">
<input type="email" name="user_email" placeholder="Email" />
</div>
<div class="input-box">
<input type="phone" name="user_phone" placeholder="Телефон" />
</div>
<div class="button">
<input class="button" type="submit" value="Отправить" />
</div>
</form>
</div>
</div>


PHP задачи с собеседований
👍4👎1
👨🏻‍💻Вопрос от пользователя

Пытаюсь вытянуть информацию о видео с MySQL через апи в реакт

У меня есть функция в ларе которой можно загрузить видео в бд, но когда хочу вывести в реакт то не получается воспроизвести видео, не могу понять почему, ошибок в консоли не выдаёт код с лары :

public function store(Request $request){
$data = $request->validate([
'name' => 'required',
'description' => 'required',
'category_id' => 'required',
'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'video' => 'required|file|mimes:mp4,mov,avi|max:100000'
]);

if ($request->hasFile('image')){
$image = $request->file('image');
$imageName = time() . '_' . $image->getClientOriginalName();
$data['image'] = $imageName;

$request->image->move(public_path('storage/images'), $imageName);
}

if ($request->hasFile('video')) {
$video = $request->file('video');
$videoName = time() . '_' . $video->getClientOriginalName();
$data['video'] = $videoName;

$request->video->move(public_path('storage/videos'), $videoName);
}

Post::create($data);

$posts = Post::all();
return view('Post.listPost', ['posts'=>$posts]);
}

код с реакта :

function PostDetail() {
const { id } = useParams();
const [post, setPost] = useState({});

useEffect(() => {
fetch(`http://127.0.0.1:8000/api/post?id=${id}`)
.then(res => res.json())
.then(data => setPost(data))
.catch(error => console.error(error));
}, [id]);

return (
<div className="post_detail">
<div className="post_details_watch">
<video className="post_detail_video" controls>
<source src={post.video} type="video/mp4" />
</video>
<img src={post.image} alt=""/>

<p>{post.name}</p>
<p>Plot Summary :</p>
<p>Содержание: {post.description}</p>
</div>

</div>
);
}

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

Wordpress сайт в PHP скрипте $_SERVER['HTTP_USER_AGENT'] выдаёт разные значения хотя захожу с одного и того же устройства и браузера

Доброго времени суток!

сайт выложил уже на хостинг. с помощью $_SERVER['HTTP_USER_AGENT'] принимается решение какую версию сайта показывать мобильную или десктопную.

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

вот код

$mobile =false;
$android = strpos($_SERVER['HTTP_USER_AGENT'],"Android");
$bberry = strpos($_SERVER['HTTP_USER_AGENT'],"BlackBerry");
$iphone = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone");
$ipod = strpos($_SERVER['HTTP_USER_AGENT'],"iPod");
$webos = strpos($_SERVER['HTTP_USER_AGENT'],"webOS");
if ($android || $bberry || $iphone || $ipod || $webos== true)
{
$mobile =true;
}
echo $_SERVER['HTTP_USER_AGENT'];


if($mobile)
{
require "enMob.php";
}
else
{
require "en.php";
}

PHP задачи с собеседований
👎13
👨🏻‍💻Вопрос от англоязычного пользователя

How to append an attribute into Eloquent collection in Laravel

I'm writing a pagination on laravel. I know that laravel has it's own pagination but I want just to try make my own. So I used a generator to get records from db but i have a problem - I need somehow mark last records to understend when it'll be the last page in pagination. I tried to add a field to my records via 'append' in Laravel but it doesn't works

Here is the code from Model

protected function is_last_record(): \Attribute
{
return new \Attribute(
fn () => 'yes',
);
}

public function pagination($pageNumber=1, $numOfRecords=8)
{

$numberOfRecords = Anime::select('*')->count();

$offset = ($pageNumber - 1) * $numOfRecords;

$data = Anime::select('title', 'poster')->limit($numOfRecords)->offset($offset)->get();
$numberOfRecords -= $data->count();

if($data->count() > 0){
if($numberOfRecords > 0){
yield $data;
}
else if($numberOfRecords == 0){
$data->appends(['is_last_record'])->toArray();
yield $data;
}
}
}
Controller code

public function List(){

$data = $this->anime->pagination();
$list = [];
foreach($data as $item){
array_push($list, $item);
}
return view('/list', ['list' => $list]);
}
Can somebody help me to fix it so it can return also a field "is_last_record" if it's a last page and i could parse it in view ?

PHP задачи с собеседований
👍1
👨🏻‍💻 PHP 8.1, ошибка при установке sqlsrv и pdo_sqlsrv

Имеется сервер Debain 11 на котором установлен SQL SERVER и PHP 8.1 Необходимо установить необходимые расширения (sqlsrv и pdo_sqlsrv), при попытке установить одно из них я получаю ошибку:

/usr/bin/sed: can't read /usr/lib/x86_64-linux-gnu/libltdl.la: No such file or directory
libtool: error: '/usr/lib/x86_64-linux-gnu/libltdl.la' is not a valid libtool archive
make: *** [Makefile:254: pdo_sqlsrv.la] Error 1
ERROR: `make' failed

Пробовал удалять и устанавливать libtool, пробовал менять версию PHP с 7.4 и до более новых версий, пробовал удалять кэш и временные пакеты. Данная ошибка появляться в любом случаи, чтобы я не пробовал делать. ChatGPT не помогает :) Какие могут быть возможные решения проблемы?

PS. Так же при попытке вручную скомпилировать расширение получаю ошибку:

libtool: warning: library '/usr/lib/x86_64-linux-gnu/libodbc.la' was moved.
libtool: warning: library '/usr/lib/x86_64-linux-gnu/libodbcinst.la' was moved.
libtool: link: cc -shared -fPIC -DPIC .libs/conn.o .libs/util.o .libs/init.o .libs/stmt.o shared/.libs/core_conn.o shared/.libs/core_results.o shared/.libs/core_stream.o shared/.libs/core_init.o shared/.libs/core_stmt.o shared/.libs/core_util.o shared/.libs/FormattedPrint.o shared/.libs/localizationimpl.o shared/.libs/StringFunctions.o -lstdc++ /usr/lib/x86_64-linux-gnu/libodbc.so /usr/lib/x86_64-linux-gnu/libodbcinst.so -g -O2 -Wl,-z -Wl,now -pthread -Wl,-soname -Wl,sqlsrv.so -o .libs/sqlsrv.so
libtool: error: '/usr/lib/x86_64-linux-gnu/libltdl.la' is not a valid libtool archive
make: *** [Makefile:251: sqlsrv.la] Error 1

PHP задачи с собеседований
👍3
👨🏻‍💻 Оптимизация вставки или обновления множества значений в базу данных

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

$words = array(
"cat",
"dog",
"mouse",
"home",
...
);

Нужно каждое слово сохранить в таблице, если оно там не встречается и задать ему счетчик = 1.
Если слово встречается, то увеличить счетчик данного слова на 1.
С этим в принципе проблем нет, вопрос в другом. Иногда приходит массив на 1000 слов, и в целом может прийти и неограниченно больше. Сейчас проверка и запись в базу происходит тупо в цикле по одному.

Вопрос такой: можно ли как-то это оптимизировать, например, как-то обновлять таблицу одним запросом. Если да, то не будет ли какое ограничение по длине запроса. В целом, как бы вы сделали, посоветуйте варианты.

PHP задачи с собеседований
👨🏻‍💻 PhpStorm Live Templates for toArray() method

Мне нужно написать много Dto, а именно методы toArray() на PHP. Я искал в Интернете и допрашивал ChatGpt, но так и не смог получить четкий ответ.

Как мне написать шаблон, аналогичный __construct()? В его смысле. Я хочу создать метод в формате:

public function toArray(): array
{
return [
'id' => $this->getId(),
'name' => $this->getName(),
'alert' => $this->isAlert(),
'status' => $this->getStatus()
];
}

Но ничего не работает. Например, на вкладке “Settings > Editor > File and Code Templates > Code” я даже не могу добавить новый шаблон. Кнопка “Create Template” просто неактивна. Я не понимаю, как это работает, чтение документации JetBrains не помогло.

PHP задачи с собеседований
👎4
👨🏻‍💻 Вебхук Битрикс24 долго отвечает

Проблема: с сайта отправляется заявка в чат телеграм (через телеграм бот) и сразу в СРМ. Сервер ждёт ответа, телеграм отправляет заявку почти мгновенно, а от СРМ Битрикс24 бывает по 4 минуты нужно ждать ответа. И получается на сайте идёт загрузка несколько минут. Иногда Битрикс отвечает быстро, и загрузка только секунды 2, но не всегда.

Что с этим делать? Есть вариант ответить стороне клиента "OK", даже если СРМ ещё не ответила, надеясь, что лид успешно прийдёт. Но мне этот вариант не нравится, потому что есть вероятность что лид прийдёт только в телеграм, а в СРМ нет. И клиент будет потерян.

То есть проблема в скорости ответа СРМ.

Хостинг Fornex, локация Украина.

Ниже код, как я отправляю данные (типа REST API если я правильно понял). Метод вебхука crm.lead.add

// отправляем запрос в Б24 и обрабатываем ответ
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $queryURL,
CURLOPT_POSTFIELDS => $queryData,
));
$result = curl_exec($curl);
curl_close($curl);
$result = json_decode($result,1);

// если произошла какая-то ошибка - выведем её
if(array_key_exists('error', $result)){

die("Ошибка при сохранении лида: ".$result['error_description']);
//echo 'false';

}else{

echo 'true';

}

PHP задачи с собеседований
👎11
👨🏻‍💻Вопрос от пользователя

Не могу поднять локально страницу на Laravel

При запуске страницы вижу ошибку (на картинке)

Я сам фронт, вообще не понимаю как это решить Как это исправить? Запускаю через live server.

PHP задачи с собеседований
👎2👍1
👨🏻‍💻Вопрос от пользователя

Liqpay не отправляет callback после успешной оплаты

Подключаю платёжную систему liqpay к сайту, используя их платёжную страницу (checout), перенаправляю на неё пользователя с данными об оплате. Но после совершения оплаты мне нужно как-то получить callback от сервера liqpay что-бы я понимал что пользователь совершил оплату. На сколько я понял из их документации для этого в массив с данными об оплате нужно добавить server_url в котором укажу куда liqpay должен отправить запрос с данными об оплате после оплаты, но этого не происходит совсем.

Он отправит эти данные только если я добавлю в массив result_url с url ссылки куда пользователь сможет перейти после оплаты что-бы вернуться обратно на сайт, и если он таки перейдёт по этой ссылке то туда вместе с переходом liqpay таки отправит запрос с данными, но пользователю ведь совсем не обязательно переходить на сайт по этой ссылке, а если он этого не сделает то я не получу информацию что он совершил оплату а значит не смогу увеличить ему баланс.

Может кто-то уже работал с liqpay и знает в чём дело? Почему он не отправляет callback после успешной оплаты?
PHP задачи с собеседований
👨🏻‍💻 Многопоточный обход массива\строки средствами php

Допустим есть строка, которая состоит из символов в кол-ве от 400 до 800 тысяч штук и длина которой кратна четному числу. Мы ее превращаем в массив:

$string = str_split('1234567890.......');

и делим на, допустим, 8 кусков, создавая массив из 8 строк;

$combine = array_chunk($string,8);

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

Вопрос - есть ли корректный способ сделать так, чтобы каждый экземпляр массива $combine обрабатывался функцией параллельно, а не ждал пока будет его очередь при линейном обходе средствами foreach?

У меня сервер на windows, с апачем и php 7.4\8.2, php подгружается как модуль для Apache. Читал что при подобном варианте возможно только использовать proc_open для многопоточного серверного вычисления, но не совсем понимаю как это можно реализовать. Может есть какие-то рабочие примеры? Не очень хочется городить кривой велосипед из multicurl с обращениями самой страницы к себе и выдергиваниями фрагментов кода, т.к. это явно все будет работать через 3 палки и криво. Нужно что-то кроме shell_exec, т.к. при работе с ним возможны ошибки, если страница закрывается раньше чем завершается работа консольного cli интерфейса.

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

UPD

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

PHP задачи с собеседований
👨🏻‍💻 Не идет запись в базу данных

Такое ощущение, будто массивы не идут. Цикл не запускается, я добавляю как положено, Excel файл, но загрузка останавливается. Что нужно сделать?

<?php
include 'include/db.php';
include 'assets/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
error_reporting(E_ALL);
ini_set('display_errors', 1);


if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_FILES['add_file']) && $_FILES['add_file']['error'] === UPLOAD_ERR_OK) {
$file_path = $_FILES['add_file']['tmp_name'];

$spreadsheet = IOFactory::load($file_path);
$worksheet = $spreadsheet->getActiveSheet();
echo 'Обработка файла</br>';
$keywords = array(
"source_operator" => array("source", "operator"),
"start_time_stamp" => array("start", "time", "stamp"),
"subscriber_relation" => array("subscriber", "relation"),
"msisdn" => array("msisdn", "ISND"),
"other_party" => array("other", "party"),
"redirecting_number" => array("redirecting", "number"),
"call_duration" => array("call", "duration"),
"call_status" => array("call", "status"),
"cause" => array("cause"),
"imsi" => array("imsi"),
"imei" => array("imei"),
"imsi_called" => array("imsi", "called", "party"),
"imei_called" => array("imei", "called", "party"),
"lac" => array("LAC"),
"cell_id" => array("cell", "ID"),
"base_station_location_address" => array("base", "station", "location"),
"azimuth" => array("azimuth"),
"lon" => array("lon"),
"lat" => array("lat"),
"radius" => array("radius"),
"region" => array("region"),
"record_type" => array("record", "type"),
"record_id" => array("record", "ID", "номер"),
"calling_party_number" => array("calling", "party", "number"),
"called_party_number" => array("called", "party", "number"),
"supplementary_services" => array("supplementary", "services"),
"msisdn_calling_party" => array("msisdn", "calling", "party"),
"msisdn_called_party" => array("msisdn", "called", "party"),
"calling_party_category" => array("calling", "party", "category"),
"operator_id" => array("operator", "Identification"),
"connected_number" => array("connected", "number"),
"msc_number" => array("MSC", "number"),
"date_and_time" => array("Date", "time"),
"call_direction" => array("call", "direction"),
"vlr_number" => array("vlr", "number"),
"roaming_number" => array("roaming", "number"),
"forwarding_reason" => array("forwarding", "reason"),
"ss_code" => array("ss-code"),
"ussd" => array("ussd"),
"access_delivery" => array("access", "delivery"),
"redirection_number" => array("redirection", "number"),
"redirection_information" => array("redirection", "information"),
"call_id_number" => array("call", "Identification", "Number"),
"data_validity" => array("Data", "Validity"),
"network_provider_id" => array("network", "provider", "ID"),
"progress" => array("progress"),
"dpc" => array("dpc"),
"opc" => array("opc"),
"location_number" => array("location", "number"),
"account_code_imput" => array("account", "code", "input"),
"tmsi_calling_party" => array("TMSI", "calling", "party"),
"tmsi_called_party" => array("TMSI", "called", "party"),
"hlr_number" => array("HLR", "number"),
"location_info_calling_party" => array("location", "calling", "party"),
"location_info_called_party" => array("location", "called", "party"),
"ciphering_mode" => array("ciphering", "mode"),
"answer_time" => array("answer", "time"),