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;
}