PHP en AJAX wat is hier fout aan? Weet niet of dit in PHP of JS thuishoord

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Donald Boers

Donald Boers

07/06/2018 12:00:16
Quote Anchor link
Ik werk aan een blogpost pagina, met bovenaan het originele artikel, daaronder de reacties, en helemaal onderaan een reactie formulier. Om de pagina niet te hoeven te verversen probeer ik AJAX te integreren. Dit is het AJAXgedeelte
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$(function() {
    var lastChecked = '';
    
    function addResp(type, resp) {
        $("#post-reponses").append(
            "<div class='resp "+ type +"'>"+ resp +"</div>"
        );
    };
    
    function waitForResp() {
        $.ajax({
            type: "GET",
            url: "/responses?since="+lastChecked,
            async: true,
            cache: false,
            timeout:5000,
            success: function(data) {
                if (data.respons.length > 0) {
                    lastChecked = data.lastChecked;
                    data.respons.forEach(function(item) {
                        addResp("respons", item.name);
                    });
                }
                setTimeout(
                    waitForResp,
                    1000
                );
            }
        })
    };
    waitForResp();

});

In de functie responses heb ik het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public function responsesAction()
    {
        if (empty($_GET['since']))
        {
            $responses    =    $this->blog->get_responses();
        }
        else
        {
            $responses    =    $this->blog->get_responses($_GET['since']);    
        }
        
        $data    =    $responses;
        header('Content-Type: application/json');
        
        echo json_encode(array(
            'respons'        =>    $data,
            'lastChecked'     =>     time()
        ));
        
    }

En in de query het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public function get_responces($response_date)
    {
        $sql    =    "SELECT *
                       FROM `post_responses`";
                      
        $params = array();
        if ($response_date)
        {
            $sql    .=    " WHERE `response_date` > :response_date";
            $params[':response_date'] = $response_date;    
        }
        
        $stmt = $this->pdo->prepare($sql . " ORDER BY `post_id` DESC");
        $stmt->execute($params);
            
        return $stmt->fetchAll(PDO::FETCH_ASSOC);    
    }

Ik blij echter de foutmelding krijgen dat data.respons undefined is. Zit nu al een uur te staren maar zie niet waar ik er naast zit. en paar extra ogen zouden nu welkom zijn.

Alvast bedankt
Gewijzigd op 07/06/2018 12:03:57 door - Ariën -
 
PHP hulp

PHP hulp

26/04/2024 01:57:03
 
Ben van Velzen

Ben van Velzen

07/06/2018 12:04:27
Quote Anchor link
Wat gebeurt er als je de URL die je gebruikt direct oproept in de browser?
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 12:05:12
Quote Anchor link
Gooi data eens door een alert in je JavaScript. Wat geeft dit terug?
 
Donald Boers

Donald Boers

07/06/2018 12:25:24
Quote Anchor link
@Ben van Velzen en @ - Ariën - Het lijkt er sterk op dat de fout in de controller zit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public function responsesAction()
    {
        if (empty($_GET['since']))
        {
            $responses    =    $this->blog->get_responces();
        }
        else
        {
            $responses    =    $this->blog->get_responces($_GET['since']);    
        }
        
        $data    =    $responses;
        header('Content-Type: application/json');
        
        echo json_encode(array(
            'respons'        =>    $data,
            'lastChecked'     =>     time()
        ));
        
    }

Met het gebruik van een alert (zoals - Ariën -) voorsteld krijg ik namelijk de melding


<b>Fatal error</b>: Uncaught ArgumentCountError: Too few arguments to function Model_Blog::get_responces()

Dus er is iets fout in de opbouw van de query ofwel de manier hoe ik deze in de Controller verwerk


Toevoeging op 07/06/2018 12:27:53:

Ik zie alleen niet wat
Gewijzigd op 07/06/2018 12:26:43 door Donald Boers
 
Ben van Velzen

Ben van Velzen

07/06/2018 12:38:57
Quote Anchor link
Nee, de fout is dat je niet genoeg argumenten meegeeft, maar gebeurt dat alleen wanneer je geen since hebt?
 
Thomas van den Heuvel

Thomas van den Heuvel

07/06/2018 14:32:35
Quote Anchor link
Maak er
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
public function get_responces($response_date=false)

van zodat dit een optioneel argument wordt wat niet per se meegegeven hoeft te worden?
 
Donald Boers

Donald Boers

07/06/2018 18:27:49
Quote Anchor link
@Thomas van den Heuvel. Helemaal top Thomas. Dat heeft idd die fout weggenomen en de berichten worden geladen. Ik heb nu echter een ander probleem. Maar ik weet niet zo goed of dat hier thuishoort want het is duidelijk JS/AJAX gerelateerd. k vertel toch maar even wat het probleem is: Met jou hulp worden inderdaad de aanwezige reacties getoond, alleen blijft de functie zich herhalen dus het word een hele lange lijst met steeds dezelfde reacties. Dus er zit een fout in de AJAX functie

Toevoeging op 07/06/2018 19:18:51:

Ik heb dit inmiddels opgelost. In plaats van de if statement en de setTimeout function apart te hebben heb ik er nu een if/else statement van gemaakt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
                if (data.respons.length > 0) {
                    lastChecked = data.lastChecked;
                    data.respons.forEach(function(item) {
                        addResp("respons", item.name);
                        addResp("respons", item.response);
                    });
                }
                else
                {
                    setTimeout(waitForResp, 1000);
                }
 
Ben van Velzen

Ben van Velzen

07/06/2018 22:22:24
Quote Anchor link
Gooi eens een $("#post-reponses").empty(); voor de forEach. Ik vind het overigens grappig dat het op de ene plek een respons is, de andere een reponse en nog weer op een andere plek een responce. Het is response.
 
Jacco Engel

Jacco Engel

08/06/2018 12:40:53
Quote Anchor link
*Dom van mijn kant*
Gewijzigd op 08/06/2018 12:41:37 door Jacco Engel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.