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

1. Получение учетных данных для подключения к базе данных

FreePBX хранит свои данные в базе данных MySQL (MariaDB). Учетные данные для подключения к базе данных хранятся в файле /etc/freepbx.conf. Обычно этот файл содержит информацию в следующем формате:

<?php
// …
$amp_conf[‘AMPDBUSER’] = ‘freepbxuser’;
$amp_conf[‘AMPDBPASS’] = ‘yourpassword’;
$amp_conf[‘AMPDBHOST’] = ‘localhost’;
$amp_conf[‘AMPDBNAME’] = ‘asterisk’;
$amp_conf[‘AMPDBENGINE’] = ‘mysql’;
// …
?>

2. Создаем файл конфигурации с данными для подключения к БД.

Создаем по пути /etc/asterisk/db_config.php файл с данными для подключения:

<?php
$dbhost = ‘localhost’;
$dbuser = ‘freepbxuser’;
$dbpass = ‘ваш_пароль’;
$dbname = ‘asterisk’;
?>

3. Создание файла php-скрипта phonebook.php

Создайте PHP-файл на вашем сервере. Например, /var/www/html/phonebook.php

<?php
// Отключаем отображение ошибок в продакшен-среде
ini_set(‘display_errors’, 0);
error_reporting(E_ALL);
ini_set(‘log_errors’, 1);
ini_set(‘error_log’, ‘/var/log/php_errors.log’);

// Подключаем файл конфигурации с параметрами подключения к БД
require_once ‘/etc/asterisk/db_config.php’;

// Подключение к базе данных
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($mysqli->connect_errno) {
error_log(«Ошибка подключения к MySQL: (» . $mysqli->connect_errno . «) » . $mysqli->connect_error);
echo «Извините, возникла проблема с подключением к базе данных.»;
exit;
}

// Устанавливаем кодировку
$mysqli->set_charset(«utf8»);

// Получаем значение поиска и сортировки из GET-параметров
$search = $_GET[‘search’] ?? »;
$sort = $_GET[‘sort’] ?? ‘extension’;
$order = $_GET[‘order’] ?? ‘asc’;

// Допустимые поля для сортировки и порядок
$allowedSortFields = [‘extension’, ‘name’];
$allowedOrder = [‘asc’, ‘desc’];

// Валидация параметров сортировки
if (!in_array($sort, $allowedSortFields)) {
$sort = ‘extension’;
}
if (!in_array($order, $allowedOrder)) {
$order = ‘asc’;
}

// Инициализируем массив для хранения результатов
$extensions = [];

// Подготавливаем SQL-запрос с учетом поиска и сортировки
if ($search) {
// Используем подготовленные выражения для предотвращения SQL-инъекций
$stmt = $mysqli->prepare(«SELECT extension, name FROM users WHERE extension LIKE CONCAT(‘%’, ?, ‘%’) OR name LIKE CONCAT(‘%’, ?, ‘%’) ORDER BY $sort $order»);
$stmt->bind_param(‘ss’, $search, $search);
} else {
$stmt = $mysqli->prepare(«SELECT extension, name FROM users ORDER BY $sort $order»);
}

// Выполняем запрос
if ($stmt->execute()) {
$result = $stmt->get_result();
$extensions = $result->fetch_all(MYSQLI_ASSOC);
$stmt->close();
} else {
error_log(«Ошибка выполнения запроса: (» . $stmt->errno . «) » . $stmt->error);
echo «Извините, возникла проблема при получении данных.»;
exit;
}

$mysqli->close();
?>
<!DOCTYPE html>
<html>
<head>
<title>Адресная книга</title>
<meta charset=»UTF-8″>
<!— Подключаем Bootstrap CSS —>
<link rel=»stylesheet» href=»https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css»>
</head>
<body>
<div class=»container mt-5″>
<!— Центрируем заголовок с помощью класса text-center —>
<h1 class=»mb-4 text-center»>Адресная книга</h1>

<!— Форма поиска —>
<form method=»GET» class=»form-inline mb-4 justify-content-center»>
<input type=»text» name=»search» class=»form-control mr-2″ placeholder=»Поиск…» value=»<?php echo htmlspecialchars($search); ?>»>
<button type=»submit» class=»btn btn-primary»>Найти</button>
<?php if ($search || $sort !== ‘extension’ || $order !== ‘asc’): ?>
<a href=»?» class=»btn btn-secondary ml-2″>Сбросить</a>
<?php endif; ?>
<!— Скрытые поля для сохранения параметров сортировки при поиске —>
<input type=»hidden» name=»sort» value=»<?php echo htmlspecialchars($sort); ?>»>
<input type=»hidden» name=»order» value=»<?php echo htmlspecialchars($order); ?>»>
</form>

<?php if (!empty($extensions)): ?>
<table class=»table table-striped table-bordered»>
<thead class=»thead-dark»>
<tr>
<?php
// Функция для генерации URL с новыми параметрами сортировки
function sortUrl($field, $currentSort, $currentOrder) {
$order = ‘asc’;
if ($currentSort === $field && $currentOrder === ‘asc’) {
$order = ‘desc’;
}
$params = $_GET;
$params[‘sort’] = $field;
$params[‘order’] = $order;
return ‘?’ . http_build_query($params);
}
?>

<th>
<a href=»<?php echo sortUrl(‘extension’, $sort, $order); ?>» class=»text-white»>
Номер
<?php if ($sort === ‘extension’): ?>
<?php if ($order === ‘asc’): ?>

<?php else: ?>

<?php endif; ?>
<?php endif; ?>
</a>
</th>
<th>
<a href=»<?php echo sortUrl(‘name’, $sort, $order); ?>» class=»text-white»>
Имя
<?php if ($sort === ‘name’): ?>
<?php if ($order === ‘asc’): ?>

<?php else: ?>

<?php endif; ?>
<?php endif; ?>
</a>
</th>
</tr>
</thead>
<tbody>
<?php foreach ($extensions as $ext): ?>
<tr>
<td><?php echo htmlspecialchars($ext[‘extension’]); ?></td>
<td><?php echo htmlspecialchars($ext[‘name’]); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php else: ?>
<div class=»alert alert-warning» role=»alert»>
<?php if ($search): ?>
По вашему запросу «<strong><?php echo htmlspecialchars($search); ?></strong>» ничего не найдено.
<?php else: ?>
Данные не найдены.
<?php endif; ?>
</div>
<?php endif; ?>
</div>

<!— Подвал с копирайтом —>
<footer class=»text-center mt-5 mb-3″>
<p>&copy; <?php echo date(«Y»); ?> <a href=»https://it-crowd.by» target=»_blank»>it-crowd.by</a></p>
</footer>

<!— Подключаем Bootstrap JS и зависимости —>
<script src=»https://code.jquery.com/jquery-3.5.1.slim.min.js»></script>
<script src=»https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.min.js»></script>
</body>
</html>

Теперь ваша адресная книга имеет функцию поиска, позволяя пользователям быстро находить необходимые контакты. Использование подготовленных выражений обеспечивает безопасность приложения, предотвращая SQL-инъекции.

Адресная книга для FreePBX

4 мыслей о “Адресная книга для FreePBX

  • 09.10.2025 в 10:50
    Постоянная ссылка

    I must say this article is extremely well written, insightful, and packed with valuable knowledge that shows the author’s deep expertise on the subject, and I truly appreciate the time and effort that has gone into creating such high-quality content because it is not only helpful but also inspiring for readers like me who are always looking for trustworthy resources online. Keep up the good work and write more. i am a follower.

  • 09.10.2025 в 10:58
    Постоянная ссылка

    Great article, thank you for sharing these insights! I’ve tested many methods for building backlinks, and what really worked for me was using AI-powered automation. With us, we can scale link building in a safe and efficient way. It’s amazing to see how much time this saves compared to manual outreach.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *