Отображение результатов поиска при вводе AJAX и PHP

#javascript #php #jquery #ajax

#javascript #php #jquery #ajax

Вопрос:

Я пытаюсь выполнить какой-то поиск в реальном времени с помощью ajax, чтобы показывать список пользователей при вводе в строке поиска. Я изо всех сил пытаюсь вернуть данные и отобразить их в моем представлении.

что я пробовал до сих пор:

Мой скрипт jQuery:

 $(document).ready(function (){
        const base_url = '<?php echo base_url();?>';
        $("#search_user").keyup(function (e){
            e.preventDefault();
            const val = $(this).value;
            $.ajax({
                type: "POST",
                url: base_url   "/public/Friendcontroller/search", // the method we are calling
                data: {search:val},
                dataType: "json",
                success: function (result) {
                    response(result);
                    console.log("Success",result);
                },
                error: function (result) {
                    console.error("unsuccessful",result);
                }
            });
        });
});
 

Моя функция контроллера и функция модели:

Функция поиска контроллера

 public function search(): array
    {
       return $this->friend_model->liveSearch($_POST['search']);
    }
 

Функция модели

 public function liveSearch($val) {
        $search = array();
        $result = $val;

        $getUser = "SELECT * FROM users WHERE userName LIKE '%$result%' OR firstName LIKE '%$result%'
                        OR lastName LIKE '%$result%'";

        $query = $this->db->query($getUser);

        foreach ($query->getResult() as $row) {
            $userID = $row->userID;
            $firstName = $row->firstName;
            $lastName = $row->lastName;
            $userName = $row->userName;
            $avatar = $row->avatarUrl;
            array_push($search, array('userID' => $userID, 'firstName' => $firstName,
                'lastName' => $lastName, 'userName' => $userName, 'avatarUrl' => $avatar));
        }
        return $search;
    }
 

HTML, в котором я хочу отобразить результаты:

 <div style="height: 32px"></div>
    <?php foreach (//Result from AJAX call here): ?>
        <div class="tabs-stage">
            <div class="container">
                <div class="person">
                    <div class="personHead">
                        <div class="profile">
                            <img id="avatar" class="head3" src="<?=base_url()?>/public/uploads/avatars/<?=$result['avatarUrl']?>">
                        </div>
                        <div class="personName">
                            <h2><?= $result['userName'] ?></h2>
                            <h4><?= $result['firstName'] . " " . $result['lastName'] ?></h4>
                        </div>
                    </div>
                </div>
            </div>
        </div>
 

Комментарии:

1. Вам нужно перенести ваши результаты в success обработчик и поместить содержимое внутри элемента, где вы их хотите. В настоящее время не похоже, что вы делаете что-то подобное. Чего response(result) предполагается достичь?

2. в чем ошибка?

3. @El_Vanja Я попробовал это таким образом (что, очевидно, не сработало) после поиска в Интернете

4. @cssBlaster21895 Я получаю неудачную ошибку в консоли

Ответ №1:

Я думаю, вам следует либо вернуть массив в кодировке json, либо «построить» и вернуть строку html, чтобы добавить ее туда, куда вы хотите, в случае успеха

Если вы возвращаете строку html, вы можете сделать это при успешном завершении

 success: function (result) {
                $("your div").html(result);
                console.log("Success",result);
            }
 

Если вы возвращаете json return json_encode($search); , вам необходимо выполнить итерацию по каждой строке и создать / добавить нужные элементы.

Комментарии:

1. Я изменил свою функцию контроллера на return json_encode , и у меня все еще есть неудачная ошибка в моей консоли

2. о, может быть, проблема в const val = $(this).value; . Это должно быть либо const val = $(this)[0].value; или const val = $(this).val();

3. также я думаю, что вы должны повторить результат, а не возвращать его (в функции search() )

Ответ №2:

Вы больше не можете использовать php в html, потому что он уже запущен на сервере,

вам нужно перестроить html с помощью javascript, что-то вроде:

 success: function (result) {
    var $container = $('#resultContainer');
    $.each(result,function(i,res){
        $container.append('<div class="person"><h2>' res.userName '</h2></div>');
    });
},
 

Комментарии:

1. Я в замешательстве, потому что я показал только небольшую часть своего HTML, но то, что я делал, это передавал данные в мое представление с помощью PHP, например, массив людей, с которыми вы уже дружите, людей, которым вы отправили запрос, и показывали разные кнопки в зависимости от статуса дружбы. На мой взгляд, я делаю это с помощью PHP if -операторов, но как я могу заменить все это if при использовании AJAX, чтобы получить желаемый результат?

2. когда вы используете ajax, вы фактически передаете данные с помощью javascript в html, php запускается только на стороне сервера, поэтому либо вы возвращаете сгенерированную строку html с сервера, либо создаете ее на основе данных в javascript на стороне клиента.