Статьи об IT

Web-программирование - Шпаргалки и простые примеры: php, vue, html, css, modx, javascript - PHP

И вначале реклама, небольшой блок. Прошу не сердиться и не вносить ее в фильтры блокировщиков.

подробнее о рекламодателе можно узнать внутри блока
Спасибо. А теперь сам материал.

PHP

Используя тернарный оператор проверим существует ли переменная или нет

$b = isset($a) ? "Условие сработало".$a." существует" : "не существует, условие не сработало";
//или же $a = (условие) ? если сработало, да, то выполняем действие : иначе выполняет это действие

С php7 можно использовать  нулевое слияние 

 $a = $b ?? "Не существует"; 
// Нулевое слияние позволяет установить значение переменной по умолчанию, если проверяемое значение равно null или не существует.

В условиях 
= - присвоение
== - равно, значение
=== - равно, с типизацией (очень строгая проверка, проверяет эквивалентность и значение)
&& - и
|| - или

Пример switch case (проверяем значение пока не совпадет или не выведется по умолчанию)

$cmd = "что-то содержит";
switch ($cmd) {
case "Variable1": //cmd содержит Variable1? условие верно?
echo "Действие 1";
break;
case "Variable2":
echo "Действие 2";
break;
case "Variable3":
echo "Действие 3";
break;
default:
echo "По умолчанию";
}

 

Популярная задача и вопрос. Вывод даты в родительном падеже при использовании strftime. Когда вы используете  strftime(%e %B %Y), то php вам покажет типа 1 сентябрь 2023 года. В интернете огромное количество решений этой проблемы - от перебора массива своих имет месяц, до.. уже и не помню. В основном все пишут свою функцию, которая заменит символ на месяц. На самом деле с версии php 7 какой-то и уж тем более в php 8  Функция объявлена УСТАРЕВШЕЙ, о чем прямо гласит информация здесь https://www.php.net/manual/ru/function.strftime.php . Вы можете использовать date(), но он выведет на английском или учиться писать с помощью IntlDateFormatter . Вот пример

//Дата на русском по стандартам php
$timestamp = time();//текущее время или
//$timestamp = new DateTime('2023-10-06'); например, если только дата в таком виде $dateFormatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
$dateFormatter->setPattern('d, MMMM, Y');
$formattedDate = $dateFormatter->format($timestamp);
echo $formattedDate;

Дата будет выведена на русском языке и уже в родительном падеже. Подробнее о встроенном классе и работы с ним здесь - https://www.php.net/manual/ru/class.intldateformatter.php

Проверяем на безопасность получаемые данные или передаваемые далее

Основное - 

Функция htmlspecialchars(), а лучше htmlentities() можно вызывать с параметрами и преобразовывает в сущности html (кавычки, символы <> и т.д.)

$clear_inp = htmlspecialchars($text, ENT_QUOTES);

Функции фильтрации ввода  filter_var() или filter_input()  . Все возможные фильтры тут

$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);

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

$input = $_POST['text'];
$clear_input = filter_var($input, FILTER_SANITIZE_STRING);
$clear_input = filter_var($sanitizedInput, FILTER_SANITIZE_NUMBER_INT);
// $clear_input будет содержать только очищенные цифры из введенного значения

При передачи в БД ОБЯЗАТЕЛЬНО подготовленные выражения  Prepared Statements 

$sql = 'некая sql команда по вставке или обновлению записи';
$stmt = $pdo->prepare($sql);
$stmt->execute();

Если точно известно, что переменная будет число  is_numeric() 

Также для очистки строки от разных тегов  strip_tags()

$inp = $_POST['text'];
$clear_inp = strip_tags($inp );

 Это быстрые примеры, не пренебрегайте безопасностью

 Перебор массива без ключей. Обычный Foreach 

foreach ($array as $value) {
echo $value . "<br>";
}

 While. Итерация всегда в конце, чтобы начинался цикл с 0

$arrLength = count($array);
$i = 0;
while ($i < $arrLength) {
echo $array[$i] . "<br>";
$i++;
}

For

$arrLength = count($array);
for ($i = 0; $i < $arrLength; $i++) {
echo $array[$i] . "<br>";
}

Для массивов всегда использую Foreach. Примеры While и For можно использовать как просто пример этих циклов. Кстати, мне всегда был понятен for, который почему-то многие считают более сложным.

Пример цикла for с четными итерациями

for ($i = 0; $i <= 10; $i++) {
if ($i % 2 === 0) {
echo $i . "<br>";
}
}

Можно в for делать математические операции, например $i += 2 (прибавлять 2 к каждой итерации $i - ($i=0; $i<=10; $i +=2){};);
+=, -=, /=
В циклах можно использовать break и continue
(break - прерывает цикл, continue - пропускает одну итерацию)

for ($i = 47; $i>10; $i--){
if($i % 2 ==0)
continue;
if ($i<35)
break;
echo $i.'<br>';
}

Вернусь (вернемся) к массивам, перебор ассоциативного массива с ключами. Выводим и ключ и его значение. 

foreach ($array as $key => $value) {

echo $key . ": " . $value . "<br>";
}

 Простейший пример получения данных с БД в виде массива (используется PDO)

$query = "SELECT * FROM your_table";
$statement = $pdo->prepare($query);
$executeResult = $statement->execute();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);

 Проверим полученный массив на существования ключей

$requiredKeys = ["key1", "key2"];
if (array_diff($requiredKeys, array_keys($array))) {
// Если данные ключи в массиве отсутствуют, то выполним действие
}

С помощью  filter_var_array()  можно очищать массив вплоть до значений определенных ключей

$data = [
'name' => 'Имя',
'email' => 'его@почта',
'age' => '35',
];
// Определение фильтров для каждого значения
$filters = [
'name' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => [
'min_range' => 1,
'max_range' => 100,
],
],
];
// Применение фильтров с помощью filter_var_array()
$filteredData = filter_var_array($data, $filters);
// Проверка результатов
if ($filteredData !== false && $filteredData !== null) {
// Фильтрация прошла успешно
} else {
echo 'Ошибка валидации или фильтрации данных.';
}

Поиск в массиве

  in_array() 

if (in_array('чтоищем', $array)) {
echo 'Элемент найден!';
} else { echo 'Элемент не найден.';}

array_search():

$key = array_search('значение', $array);
if ($key !== false) {
echo 'Элемент найден ' . $key;
} else { echo 'Элемент не найден.'; }

array_key_exists() проверяет, существует ли определенный ключ в массиве. true, если ключ существует, и false если нет

 Сортировка массива.  sort() сортирует массив в порядке возрастания значений ,  rsort() сортирует массив в порядке убывания значений  ,  asort() сортирует массив по значениям в порядке возрастания, сохраняя связь между ключами и значениями,  ksort() сортирует массив по ключам в порядке возрастания, сохраняя связь между ключами и значениями. 

 Перебор многомерного массива рекурсивной функцией. Внимание, на данное решение я наткнулся недавно и не проверял. В теории функция проверяет если внутри массива. Не рискуйте при запуске :-)

function recursiveArray($array) {

foreach ($array as $key => $value) {
if (is_array($value)) {
recursiveArray($value);
} else {
echo "Ключ: $key, Значение: $value\n";
}
}
}
recursiveArray($array);

Перебор двумерного массива вложенными foreach

foreach ($array as $key_a => $subarray) {
echo "Ключ 1: $key_a \n";
foreach ($subarray as $key_b => $value) {
echo "Ключ 2: $key_b, Значение: $value \n";
}
echo "\n";
}

Сортировка внутри многомерного массива, например по возрасту

usort($array, function ($a, $b) {
return $a['age'] - $b['age'];
});

 Предположим у нас есть удаленный сервер, который по порту 1234 отдает xml файл с чем-либо и нам необходимо его получить и составить запрос для бд (обращаю внимание, тут будет специфика MODX xpdo, но в целом думаю понятная). Например это список фильмов. Мы получим ответ, разберем его, подсчитаем количество актеров, заполним столько же полей (предположим, что мы не храним в json) и используем ON DUPLICATE KEY UPDATE, если такой фильм уже существует с таким ID и просто обновим данные на него. 


//формируем url с параметрами
$url = $remoteHost.':1234/?param1='.$param1.'&Encoding=UTF-8&';
$stream = fopen($url, 'r');
//проверили подключение
if (!$stream) {
$output = 'Не смог получить доступ к серверу по следующему запросу. Проверьте. '.$url;
return $output;
die();
}
$xml_data = stream_get_contents($stream);
//проверили получение файла
if ($xml_data === false) {
$output = 'Файл не получен по адресу: '.$url;
return $output;
die();
}
fclose($stream);
//получили xml
$xml = simplexml_load_string($xml_data);
$query = '';
//создали массив с фильмами
$movies = $xml->ArrayDataTo->ListMovies->Movie;
//начали его перебирать и заполнять в БД
$output .= "Результат добавления фильмов."."\n"."Фильмы:";
foreach ($movies as $movie) {
$query .= "INSERT INTO TableName SET `id` = ?,
`name` = ?,
`pole1` = ?,
`pole2` = ?,
`pole3` = ?,
";
//очищаем полученные данные, т.к. сервер удаленный и кто его знает, что они могут нам подсунуть от злости или просто пошутить $params = [
htmlentities(strip_tags($movie['ID'])),
htmlentities(strip_tags($movie->Name)),
htmlentities(strip_tags($movie->pole1['pole1'])),
htmlentities(strip_tags($movie['pole2'])),
htmlentities(strip_tags($movie->pole->pole['pole3']))
];
//определяем какое количество у нас актеров и предположим, что в бд 8 полей, но вообще такое лучше делать в json.
$namesArray = explode(", ", $movie->Actors);
$arraySize = (!empty($namesArray)) ? count($namesArray) : 7;
for ($i = 0; $i < $arraySize; $i++) {
$query .= ", `casts{$i}_name` = ?";
$params[] = htmlentities(strip_tags($namesArray[$i]));
}
//теперь делаем проверку на дубликат ключей, при INSERT. Мы не указываем поля, которые не трогаем и проверяем, например ID - не указываем ибо он и есть Primary
$query .= " ON DUPLICATE KEY UPDATE
`pole1` = COALESCE(VALUES(`pole1`), `pole1`),
`pole2` = COALESCE(VALUES(`pole2`), `pole2`)";
for ($i = 0; $i < $arraySize; $i++) {
$query .= ", `casts{$i}_name` = COALESCE(VALUES(`casts{$i}_name`), `casts{$i}_name`)";
}
$stmt = $mysqli->stmt_init(); $stmt->prepare($query);
if ($stmt) {
$stmt->execute($params);
}

$output .= "\n".$movie->Name;
$query = '';
}
$output .= "\n"."Успешно добавлены. Мои поздравления"."\n"."\n";

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

 

Простейший класс на php который подключается в __construct к БД , а мы создав объект, экземпляр класса, делаем выборку из таблицы по своему условию 

class DBMySelect {
private $pdo;
public function __construct() {
$dsn = "mysql:host=localhost;dbname=mydatabase";
$username = "username";
$password = "password";
$this->pdo = new PDO($dsn, $username, $password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if (!$this->pdo) {
echo "Ошибка подключения к базе данных.";
}
}
public function MyCustomSelect($condition) {
$query = "SELECT * FROM table_name WHERE " . $condition;
$statement = $this->pdo->query($query);
if ($statement === false) {
echo "Ошибка выполнения запроса.";
} else {
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
}
}
$database = new DBMySelect();
$results = $database->MyCustomSelect("column_name = 'value'");
print_r($results);

Очень мечтал освоить или понять  Websocket и не вышло. 

Простейшее подключение по CURL к api серверу с авторизацией по API-KEY в заголовке, полученя данных в JSON, перебор его и очистка от html тегов

$url = "https://api.example.com/page_point";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'api-key: ' . 'my-apikey'
]);
$response = curl_exec($curl);
if ($response === false) {
echo "Ошибка при выполнении запроса: " . curl_error($curl);
} else {
$clear_resp = strip_tags($response);
$data = json_decode($clear_resp, true);
foreach ($data as $key => $value) {
echo "Ключ: $key, Значение: $value<br>";
}
}
curl_close($curl);


Подключение с помощью file_get_contents

$url = "https://api.example.com/page_point";
$response = file_get_contents($url);
$data = json_decode($response, true);

Простейшая запись строки в текстовый файл

$logtext = 'Текст, который записываем';
file_put_contents('/files/log.txt', $logtext , FILE_APPEND);

 С помощью регулярки ищем слово в тексте

 preg_match("/\b$word\b/i", $text))
//где $word - слово, а $text, вы не поверите, текст

Разбиваем, с помощью регулярки, строку по цифра и тексту в массив. Например 100рублей делим на элемент 100 и рублей

 


if (preg_match('/(\d+(?:\.\d+)?)([^\d]+)/', htmlentities($place->Sum), $matches)) {
        $number = $matches[1];
        $currency = $matches[2];
        $formattedString = $number . ' ' . $currency;        
    } 
	

 

 

 

Похожее

draw I
draw I
draw I
draw I

 quote a81ca

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

 

i

Будет осуществлен переход на сайт Yoomoney

 

draw I

 


Внимание: На сайте могут присутствовать ссылки ePN

Мини-портфолио

очередной бесполезный блог