Skip to content

Instantly share code, notes, and snippets.

@fesor
Created December 3, 2013 21:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fesor/7777780 to your computer and use it in GitHub Desktop.
Save fesor/7777780 to your computer and use it in GitHub Desktop.
Sort table
<?php
// подключение нам не интересно
$link = new mysqli ($host, $username, $password, $db);
if ($mysqli->connect_errno) {
die ('Ошибка! Не удалось подключиться к базе данных!' . $mysqli->connect_errno);
}
/**
* Простенький провайдер данных
* если вы используете php5.5 то можно даже генератор соорудить
* но для 5-ти записей это не имеет смысла,
* хотя тогда можно было бы не париться по поводу количества элементов
*
* @param array $options нашего запроса
* @return array
*/
function dataProvider(array $options, $link)
{
// подготавливаем лимиты
$start_from = (options['page'] - 1) * $options['perPage'];
$sql = "SELECT `username`, `email`, `homepage`, `msg`, `send_time`
FROM `user_data`
ORDER BY $options['perPage'] $d LIMIT $start_from, {$options['perPage']}";
$result = mysqli_query($link, $sql);
if (!$result) {
// тут просто скопипащу но вообще это нехорошо
die('Error: ' . mysqli_error($mysqli));
}
// так как после die уже точно ничего не будет отрабатывать, лишний else можно выпилить
$data = [];
while ($row = mysqli_fetch_array($result)) {
// что бы переделать под генератор, достаточно вместо сборки массива
// добавить строку
// yield $row;
// и при каждом вызове функции вам будет возвращаться очередной ряд,
// код останется красивым и не будет жрать лишнюю память
$data[] = $row;
}
return $data;
}
function getSoftLink($field, $currentDirection) {
$direction = 'ASC' === $currentDirection ? 'DESC' : 'ASC';
// тут еще по феншую если нужно бы переменные эти
// через urlencode прогнать но в нашем случае не обязательно...
return sprintf('?sortBy=%s&dir=%s', $field, $direction);
}
// собираем данные из запроса
// эта куча проверок нужны только что бы ничего не поломать
// если вам нужно это для, то так заморачиваться не обязательно
// но хорошо бы
$options = [
// задаем текущую страницу
'page' => empty($_GET['page']) ?
// если страница не найдена - задаем страницу по умолчанию,
// если переменная содержит треш и на выходе у нас 0 или отрицательное число
// то вернем опять же дефолтное значение
1 : max(1, intval($_GET['page'])),
// тут стоит прогнать через mysql_real_escape_string или что-то в этом духе
// хотя достаточно проверять какие именно поля нам доступны для сортировки
'sortBy' => empty($_GET['sortBy']) || in_array(strtolower($_GET['sortBy']), ['username', 'email', 'homepage', 'send_time']) ?
'' : $_GET['sortBy'],
// принимаем от клиента только два возможных значения, доверять этим клиентам нельзя...
'direction' => empty($_GET['dir']) || strtolower($_GET['dir']) == 'ask' ? 'ASС' : 'DESС',
'perPage' => 5
];
// отображаем
include __DIR__ . '/view.php';
<table border = '1'>
<thead>
<tr>
<th><a href="index.php<?= getSortLink('username', $options['direction']); ?>">имя пользователя</a></th>
<th><a href="index.php<?= getSortLink('email', $options['direction']); ?>">E-mail</a></th>
<th><a href="index.php<?= getSortLink('homepage', $options['direction']); ?>">Homepage</a></th>
<th>Комментарий</th>
<th><a href="index.php<?= getSortLink('send_time', $options['direction']); ?>">Дата добавления</a></th>
</tr>
<thead>
<tbody>
<?php foreach (dataProvider($options) as $row) { ?>
<tr>
<td><?= $row['username']; ?></td>
<td><?= $row['email']; ?></td>
<td><?= $row['homepage']; ?></td>
<td><?= $row['msg']; ?></td>
<td><?= $row['send_time']; ?></td>
</tr>
<?php } ?>
</tbody>
</table>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment