@green176

Как правильно организовать вывод в шаблоне php?

Не могу додуматься, как организовать вывод в шаблоне. Есть таблица с сообщениями, и таблица с лайками.
+-------------+ +------------+
|message.......| |likes............|
+-------------+ +------------+
|id....................| | lid...............|
|name.............| | mid............|
|message......| | name.........|
|date...............| +------------+
---------------
В модели поиск всех сообщений
function messages_all($connect){
    $query = "SELECT * FROM `message` ORDER BY `message`.`id` DESC";
    $result = mysqli_query($connect, $query);
    
    if (!$result)
        die(mysqli_error($connect));
    
    $count = mysqli_num_rows($result);
    $messages = array();
    
    for ($i=0; $i<$count; $i++){
        $row = mysqli_fetch_assoc($result);
        $messages[] = $row;
    }
    return $messages;
}


В шаблоне вывод
<div class="main">
               
                <?php foreach($messages as $p): ?>
                    <div class="row message">
                       <div class="col-md-6 ">
                            <p><?=$p['name']?> say: </p>
                            <p><?=$p['message']?> At <?= date ('H:i ', strtotime($p['date']))?></p>
                       </div>
                        <div class="col-md-6">
                            <a class="btn btn-info pull-right" href="index.php?action=like&id=<?=$p['id']?>">like </a>
                            <a class="btn btn-info  <?php ($name != $p['name'] ? print "disabled" : "") ?> pull-right" href="index.php?action=delete&id=<?=$p['id']?>">delete</a>
                        </div>
                        
                    </div>
                <?php endforeach ?>
            </div>

Ну в контроллере просто вызываю функцию
$message = messages_all($connect);
        include("view/main.php");

далее лайки
при нажатии кнопки like выполняю функцию like_add($connect, $id, $name); в которую передаю id лайкнутого сообщения и имя того, кто лайкнул
функция like_add
function like_add ($connect, $id, $name){
    $name = trim($name);
    $id = (int)$id;
    if ($id == 0)
        return false;
    $sql = "INSERT INTO `likes` (mid, name) VALUES ('%d','%s')";
    $query = sprintf ($sql, $id, mysqli_real_escape_string($connect, $name)); 
    $result = mysqli_query($connect, $query);
    
    if (!$result)
        die(mysqli_error($connect));
    return true;
}

Т.е. при каждом нажатии на кнопку, создается запись с id сообщением и именем того, кто тыкнул кнопку.
Далее что бы узнать количество лайков у сообщения я просто считаю количество записей в бд с id сообщения
function like_count ($connect, $mid){
    $query = sprintf ("SELECT * FROM `likes` WHERE mid=%d", (int)$mid);
    $result = mysqli_query($connect, $query);
    
    if(!$result)
        die(mysqli_error($connect));
    
    $likes = mysqli_num_rows($result);
    
    return $likes;    
}

теперь собственно вопрос: как вывести количество лайков для сообщения? На данном этапе я просто в шаблоне выполняю функцию like_count, выглядит как то так
<div class="main">
               
                <?php foreach($messages as $p): ?>
                    <div class="row message">
                       <div class="col-md-6 ">
                            <p><?=$p['name']?> say: </p>
                            <p><?=$p['message']?> At <?= date ('H:i ', strtotime($p['date']))?></p>
                       </div>
                        <div class="col-md-6">
 <!-- ВОТ ЗДЕСЬ -->                           <a class="btn btn-info pull-right" href="index.php?action=like&id=<?=$p['id']?>">like <?=like_count ($connect, $p['id']) ?></a>
                            <a class="btn btn-info  <?php ($name != $p['name'] ? print "disabled" : "") ?> pull-right" href="index.php?action=delete&id=<?=$p['id']?>">delete</a>
                        </div>
                        
                    </div>
                <?php endforeach ?>
            </div>


но считаю, что это не правильно. Как быть?
  • Вопрос задан
  • 382 просмотра
Решения вопроса 1
Stalker_RED
@Stalker_RED
По хорошему, из шаблона логика вызываться не должна. Разве что какие-то виджеты подключать.
Считать лайки лучше еще в первом запросе.
Как-то так
SELECT m.message_id. m.user_id, m.text, count(like.id) as likes_cnt
FROM message as m
LEFT JOIN like ON m.message_id = like.message_id
GROUP BY m.message_id

message_id | user_id  | text  | likes_cnt
1          | 1        | test  | 0 
2          | 1        | hello | 12
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы