Skip to content

Instantly share code, notes, and snippets.

@EvgenyOrekhov
Last active September 25, 2019 09:25
Show Gist options
  • Save EvgenyOrekhov/3e1526bfa8409c0f84e9 to your computer and use it in GitHub Desktop.
Save EvgenyOrekhov/3e1526bfa8409c0f84e9 to your computer and use it in GitHub Desktop.
PHP test tasks
<?php
/**
* # Работа с DOM
*
* Написать скрипт закачивания страницы www.bills.ru, из страницы извлечь даты,
* заголовки, ссылки в блоке "события на долговом рынке", сохранить в таблицу
* bills_ru_events, имеющую такую структуру:
* * id — целое, автоинкрементарное
* * date — в формате год-месяц-день часы:минуты:секунды
* * title — строковое, не более 230 символов
* * url — строковое, не более 240 символов, уникальное
*
* Вывести таблицу на экран.
*/
libxml_use_internal_errors(true);
$html = file_get_contents('http://bills.ru');
$document = new DOMDocument();
$document->loadHTML($html);
$news = $document->getElementById('bizon_api_news_list');
$dates = [];
$urls = [];
$titles = [];
$months = [
'янв' => 'Jan',
'фев' => 'Feb',
'мар' => 'Mar',
'апр' => 'Apr',
'мая' => 'May',
'июн' => 'Jun',
'июл' => 'Jul',
'авг' => 'Aug',
'сен' => 'Sep',
'окт' => 'Oct',
'ноя' => 'Nov',
'дек' => 'Dec',
];
foreach ($news->childNodes as $child) {
$nodeValue = trim($child->childNodes->item(0)->nodeValue);
$date = str_ireplace(
array_keys($months),
array_values($months),
$nodeValue
);
if (strlen($date) < 11) {
$date .= ' ' . date('Y');
}
$timestamp = strtotime($date);
$dates[] = date('Y-m-d H:i:s', $timestamp);
}
foreach ($news->getElementsByTagName('a') as $link) {
$urls[] = $link->getAttribute('href');
$titles[] = $link->nodeValue;
}
$host = 'localhost';
$dbName = 'tasks';
$tableName = 'bills_ru_events';
$user = 'root';
$pass = 'root';
try {
$dbh = new PDO("mysql:host=$host", $user, $pass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec(
"CREATE DATABASE IF NOT EXISTS $dbName
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;"
);
$dbh->exec("use $dbName;");
$dbh->exec(
"CREATE TABLE IF NOT EXISTS $tableName (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
date DATETIME NOT NULL,
title VARCHAR(230) NOT NULL,
url VARCHAR(240) NOT NULL UNIQUE
);"
);
foreach ($urls as $key => $value) {
$sth = $dbh->prepare(
"INSERT IGNORE INTO $tableName
(date, title, url)
VALUES (:date, :title, :url);"
);
$sth->bindParam(':date', $dates[$key]);
$sth->bindParam(':title', $titles[$key]);
$sth->bindParam(':url', $urls[$key]);
$sth->execute();
}
$sth = $dbh->query("SELECT * FROM $tableName;");
$sth->setFetchMode(PDO::FETCH_ASSOC);
$result = $sth->fetchAll();
$dbh = null;
} catch (PDOException $e) {
echo $e->getMessage();
}
echo '<table border="1">';
foreach ($result as $record) {
echo '<tr>';
foreach ($record as $field) {
echo "<td>{$field}</td>";
}
echo '</tr>';
}
echo '</table>';
<?php
/**
* # Файловая система и регулярные выражения
*
* Создать скрипт, который в папке datafiles найдет все файлы, имена которых
* состоят из цифр и букв латинского алфавита и имеют расширение ixt, и выведет
* на экран имена этих файлов, упорядоченных по имени.
*
* Задание должно быть выполнено с использованием регулярных выражений.
*/
$allFiles = scandir('datafiles');
$files = array_filter($allFiles, function ($file) {
return preg_match('/^[0-9a-z]+\.ixt$/i', $file);
});
foreach ($files as $file) {
echo $file . '<br>';
}
<?php
/**
* # Счётчик посещений
*
* Создать скрипт, который выводит количество уникальных посетителей
* (visitors), заходов (visits) и обращений к нему (hits).
*
* Данные хранить в реляционной базе данных.
*/
session_start();
$host = 'localhost';
$dsn = "mysql:host=$host";
$username = 'root';
$password = 'root';
$dbName = 'tasks';
$tableName = 'hits';
try {
$dbh = new PDO($dsn, $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec(
"CREATE DATABASE IF NOT EXISTS $dbName
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;"
);
$dbh->exec("use $dbName;");
$dbh->exec(
"CREATE TABLE IF NOT EXISTS $tableName (
ip VARCHAR(45) PRIMARY KEY,
visits INT NOT NULL DEFAULT 1,
hits INT NOT NULL DEFAULT 1
);"
);
$updateVisits = '';
if (!isset($_SESSION['isLogged'])) {
$_SESSION['isLogged'] = true;
$updateVisits = 'visits = visits + 1,';
}
$ip = $_SERVER['REMOTE_ADDR'];
$dbh->exec(
"INSERT INTO $tableName (ip) VALUES ('$ip')
ON DUPLICATE KEY UPDATE
$updateVisits
hits = hits + 1;"
);
$sth = $dbh->query(
"SELECT SUM(hits) AS hits,
SUM(visits) AS visits,
COUNT(*) AS users
FROM $tableName"
);
$sth->setFetchMode(PDO::FETCH_ASSOC);
$result = $sth->fetch();
$dbh = null;
} catch (PDOException $e) {
echo $e->getMessage();
}
foreach ($result as $key => $value) {
echo $key . ': ' . $value . '<br>';
}
<?php
/**
* # Матрицы
*
* Сгенерировать матрицу размером 3x3, заполненную случайными числами от 0 до
* 10, вывести на экран в виде таблицы.
*
* Преобразовать матрицу в одномерный массив, результат вывести на экран.
*
* Найти уникальные элементы в матрице, результат вывести на экран.
*
* Найти суммы элементов матрицы построчно, результат вывести на экран.
*
* Умножить матрицу на 2, результат вывести на экран в виде таблицы.
*
* Найти максимальные значения среди элементов матрицы построчно, результат
* вывести на экран.
*
* Транспонировать матрицу, результат вывести на экран в виде таблицы.
*/
// The matrix
for ($i = 0; $i < 3; $i += 1) {
for ($j = 0; $j < 3; $j += 1) {
$matrix[$i][] = mt_rand(0, 10);
}
}
// Flattened matrix
$flattenedMatrix = call_user_func_array('array_merge', $matrix);
// Unique elements of the flattened matrix
$uniqueElements = array_unique($flattenedMatrix);
// Sums
$sums = array_map('array_sum', $matrix);
// Multiply by 2
$doubledMatrix = array_map(function ($row) {
return array_map(function ($value) {
return $value * 2;
}, $row);
}, $matrix);
// Max in each row
$maxes = array_map('max', $matrix);
// Transpose
$transposedMatrix = array_reduce($matrix, function ($carry, $row) {
foreach ($row as $columnIndex => $value) {
$carry[$columnIndex][] = $value;
}
return $carry;
}, []);
/*----------------------------------------------------------------------------*/
function drawTable($title, $matrix) {
echo $title;
echo '<table border="1">';
foreach ($matrix as $row) {
echo '<tr>';
foreach ($row as $value) {
echo '<td>' . $value;
}
}
echo '</table><hr>';
}
function printArray($title, $array) {
echo $title;
echo '<pre>';
print_r($array);
echo '</pre><hr>';
}
/*----------------------------------------------------------------------------*/
drawTable('Original', $matrix);
printArray('Flattened matrix', $flattenedMatrix);
printArray('Unique elements', $uniqueElements);
printArray('Sums', $sums);
drawTable('Doubled values', $doubledMatrix);
printArray('Max in each row', $maxes);
drawTable('Transposed matrix', $transposedMatrix);
<?php
/**
* # ООП
*
* Написать класс Init, от которого нельзя сделать наследника, состоящий из
* трёх методов:
* * create() — доступен только для методов класса, создает таблицу test,
* содержащую 5 полей:
* * id — целое, автоинкрементарное
* * script_name — строковое, длиной 25 символов
* * start_time — целое
* * end_time — целое
* * result — один вариант из 'normal', 'illegal', 'failed', 'success'
* * fill() — доступен только для методов класса, заполняет таблицу случайными
* данными
* * get() — доступен извне класса, выбирает данные из таблицы test по критерию:
* result среди значений 'normal' и 'success'
*
* В конструкторе выполняются методы create() и fill().
*/
final class Init
{
private $dbh;
private $tableName = 'test';
private function create()
{
try {
$this->dbh->exec(
"CREATE TABLE IF NOT EXISTS $this->tableName (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
script_name VARCHAR(25) NOT NULL,
start_time INT UNSIGNED NOT NULL,
end_time INT UNSIGNED NOT NULL,
result ENUM(
'normal', 'illegal', 'failed', 'success'
) NOT NULL
);"
);
} catch (PDOException $e) {
echo $e->getMessage();
}
}
private function fill()
{
$scriptName = substr(
str_shuffle(
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
),
0,
25
);
$startTime = mt_rand();
$endTime = mt_rand();
$result = mt_rand(1, 4);
try {
$this->dbh->exec(
"INSERT INTO $this->tableName (
script_name,
start_time,
end_time,
result
) VALUES (
'$scriptName',
$startTime,
$endTime,
$result
);"
);
} catch (PDOException $e) {
echo $e->getMessage();
}
}
public function __construct()
{
$host = 'localhost';
$dbName = 'tasks';
$user = 'root';
$pass = 'root';
try {
$this->dbh = new PDO("mysql:host=$host", $user, $pass);
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->dbh->exec(
"CREATE DATABASE IF NOT EXISTS $dbName
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;"
);
$this->dbh->exec("use $dbName;");
} catch (PDOException $e) {
echo $e->getMessage();
}
$this->create();
$this->fill();
}
public function get()
{
try {
$sth = $this->dbh->query(
"SELECT * FROM $this->tableName
WHERE result in (1, 4);"
);
$sth->setFetchMode(PDO::FETCH_ASSOC);
$result = $sth->fetchAll();
} catch (PDOException $e) {
echo $e->getMessage();
}
return $result;
}
public function __destruct()
{
$this->dbh = null;
}
}
$init = new Init();
echo '<pre>';
print_r($init->get());
echo '</pre>';
<?php
/**
* # Виды отношений в реляционной модели
*
* Разработать структуру таблиц для базы данных библиотеки.
* В базе необходимо хранить названия книг и имена авторов.
* Написать запрос для вывода названий книг и количества авторов для всех книг,
* написанных в соавторстве.
*
* Пример данных для наполнения базы:
* * "JavaScript: The Good Parts" by Douglas Crockford
* * "Design Patterns: Elements of Reusable Object-Oriented Software"
* by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides
* * "The Pragmatic Programmer: From Journeyman to Master"
* by Andrew Hunt and David Thomas
* * "Pragmatic Thinking and Learning: Refactor Your Wetware"
* by Andrew Hunt
*/
$host = 'localhost';
$dbName = 'tasks';
$user = 'root';
$pass = 'root';
try {
$dbh = new PDO("mysql:host=$host", $user, $pass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec(
"CREATE DATABASE IF NOT EXISTS $dbName
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;"
);
$dbh->exec("use $dbName;");
$dbh->exec(
'CREATE TABLE IF NOT EXISTS books (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
book VARCHAR(255) NOT NULL
);'
);
$dbh->exec(
'CREATE TABLE IF NOT EXISTS authors (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
author VARCHAR(255) NOT NULL
);'
);
$dbh->exec(
'CREATE TABLE IF NOT EXISTS books_authors (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
book_id VARCHAR(255) NOT NULL,
author_id VARCHAR(255) NOT NULL
);'
);
/*
$dbh->exec(
'INSERT INTO books (book) VALUES
("JavaScript: The Good Parts"),
("Design Patterns: Elements of Reusable Object-Oriented Software"),
("The Pragmatic Programmer: From Journeyman to Master"),
("Pragmatic Thinking and Learning: Refactor Your Wetware");'
);
$dbh->exec(
'INSERT INTO authors (author) VALUES
("Douglas Crockford"),
("Erich Gamma"),
("Richard Helm"),
("Ralph Johnson"),
("John Vlissides"),
("Andrew Hunt"),
("David Thomas");'
);
$dbh->exec(
'INSERT INTO books_authors (book_id, author_id) VALUES
(1, 1),
(2, 2),
(2, 3),
(2, 4),
(2, 5),
(3, 6),
(3, 7),
(4, 6);'
);
*/
// get book name and authors number for books with coauthors
$sth = $dbh->query(
'SELECT books.book, (
SELECT COUNT(*)
FROM books_authors
WHERE book_id = books_authors_count.book_id
) AS authors_number
FROM books_authors AS books_authors_count
JOIN books
ON books_authors_count.book_id = books.id
GROUP BY book, authors_number
HAVING authors_number > 1;'
);
$sth->setFetchMode(PDO::FETCH_ASSOC);
$result = $sth->fetchAll();
$dbh = null;
} catch (PDOException $e) {
echo $e->getMessage();
}
echo '<ul>';
foreach ($result as $record) {
echo '<li>' .
$record['book'] . ' (' . $record['authors_number'] . ' authors)</li>';
}
echo '</ul>';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment