[PHP] Automatisch waarde nieuwe rij in database tonen (chat)

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ONiel
  • Registratie: September 2015
  • Laatst online: 15-06 21:16
Hey

Ik heb een website gemaakt waarop een gebruiker een bericht kan sturen aan
de administrator, en de administrator aan de gebruiker in een chat-vorm.

De code werkt perfect,
de berichten komen aan.

Het probleem is enkel dat wanneer de gebruiker in de chatbox is,
en de administrator verstuurt een bericht, dan wordt dat bericht niet automatisch
getoond alhoewel ik wel AJAX gebruikt heb.

Code/Testpagina:
code:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<!-----------PHP--------->
<?php
    $conn = new mysqli("localhost", "root", "toor", "amando");
    $user = "Foobar";

                        if (!empty($_POST['msg'])) {
                                $action = 'post';
                            } else $action = 'get';

                            $date = new DateTime();
                           
                            function refreshMsg() {
                                    global $conn, $user;

                                    $stmt = $conn->prepare("SELECT sender, message, admin FROM chat WHERE sender=?");
                                    $stmt->bind_param("s", $sender_);
                                    $sender_ = $user;
                                    $stmt->execute();
                                    $stmt->bind_result($username, $msgSent, $admin);
                                    
                                    $str = "";
                                    while ($stmt->fetch()) {
                                        if ($admin == 0) {
                                            $_username = $username;
                                        } else $_username = "Admin";

                                        $str .= "<b>".htmlspecialchars($_username) . "</b>: " . htmlspecialchars($msgSent) . "<br>";
                                    }
                                    $stmt->execute();
                                    echo $str;
                                    $stmt->close();
                            }
                            
                            switch ($action) {
                                case 'post':
                                    $stmt = $conn->prepare("INSERT INTO chat (message, sender) VALUES (?, ?)");
                                    $stmt->bind_param("ss", $message_, $sender_);
                                    $message_ = $_POST['msg'];
                                    $sender_ = $user;
                                    $stmt->execute();
                                    $stmt->close();
                                    refreshMsg();
                                    break;
                                case 'get':
                                    refreshMsg();
                                    break;
                                default:
                                    break;
                            }


?>

<!---------HTML--------->
                    <form action="" method="post" id="chat">
                        <input type="text" name="msg" placeholder="Your message here..." />
                        <input type="submit" name="send" value="Verzend" />
                    </form> 


<!-----------AJAX & Javascript------------------>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script>
        function receive() {
            $.post('chat.php', {msg: ''}, function (data) {
                $('#info').prepend(data);
            });
        }

        $(document).ready(function () {
        t = setInterval(receive, 500);
        $("#sendz").click(function (event) {
            console.log("(34) Send function launched.");
            var msgValue = document.getElementById("value").value;
            event.preventDefault();
            $.post('chat.php', {msg: msgValue}, function (data) {
                $('#info').prepend(data);
            });

        });
        });
    </script>


Database:
code:
1
2
3
4
5
6
7
8
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| ID      | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| message | text         | NO   |     | NULL    |                |
| sender  | varchar(256) | NO   |     | NULL    |                |
| admin   | tinyint(4)   | NO   |     | 0       |                |
+---------+--------------+------+-----+---------+----------------+


De PHP functie refreshMsg() neemt gewoon alle berichten uit de database en
toont het aan de gebruiker waar het toe behoort. De if-statements in die functie
zijn gewoon om te kijken of het bericht van de Administrator kwam of niet.
De switch-statement dient om te kijken of er een message was verzonden vanuit de gebruiker, indien ja
voeg toe aan database en refreshMsg(), anders gewoon refreshMsg().

Het probleem is dat de case nooit 'get' is, enkel wanneer ik de pagina herlaad. Dus de chat wordt niet auto-herladen als de administrator verstuurt.

In mijn AJAX-code heb ik de functie receive(), deze zou een lege POST-statement sturen en omdat
het leeg is zou het de case 'get' moeten lanceren, maar dat doet het niet.

Een post van de administrator heb ik gesimuleerd door gewoon een rij manueel toe te voegen aan de database en de waarde in kolom 'admin' op 1 te zetten.

Wat doe ik fout?
Ik heb al veel geprobeerd, en ook de code geanalyseerd via console en web-tools.
Ik zit al lang (enkele weken) op dit probleem en heb ook al aan andere hulp gevraagd, maar kon geen antwoord vinden.

Bedankt!

Alle reacties


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Nu online
Kleine gok: msg is niet empty want je stopt er een lege string in? En daardoor gaat
if (!empty($_POST['msg']))
Niet goed.
https://www.virendrachand...sset-vs-empty-vs-is_null/

[ Voor 22% gewijzigd door sig69 op 23-11-2016 19:54 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • ONiel
  • Registratie: September 2015
  • Laatst online: 15-06 21:16
Hartelijk bedankt voor je reactie. Ik heb het uitgeprobeerd, maar dit werkte niet echt.

Acties:
  • +1 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 22:14
Waarom laat je met je Ajax niet gewoon een GET-request uitvoeren dan? Is toch veel makkelijker dan checken of je input niet bestaat/leeg is? Kan je daar weer je acties op uitvoeren, zoals het ophalen van de berichten.

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Nu online
ONiel schreef op woensdag 23 november 2016 @ 20:14:
Hartelijk bedankt voor je reactie. Ik heb het uitgeprobeerd, maar dit werkte niet echt.
En wat heb je precies geprobeerd dan? Als je dat ook even post, misschien is daar ook nog wel wat mis.

[ Voor 12% gewijzigd door sig69 op 23-11-2016 23:36 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Nu online
Merethil schreef op woensdag 23 november 2016 @ 20:42:
Waarom laat je met je Ajax niet gewoon een GET-request uitvoeren dan? Is toch veel makkelijker dan checken of je input niet bestaat/leeg is? Kan je daar weer je acties op uitvoeren, zoals het ophalen van de berichten.
Dat is ook nog een mogelijkheid. Al zijn er voor een chat functionaliteit natuurlijk veel elegantere oplossingen, maar ik ga er even van uit dat het allemaal wat om te proberen is op dit moment.
dit had een edit moeten zijn ipv een quote

[ Voor 4% gewijzigd door sig69 op 23-11-2016 23:40 ]

Roomba E5 te koop


  • Merethil
  • Registratie: December 2008
  • Laatst online: 22:14
sig69 schreef op woensdag 23 november 2016 @ 23:39:
[...]

Dat is ook nog een mogelijkheid. Al zijn er voor een chat functionaliteit natuurlijk veel elegantere oplossingen, maar ik ga er even van uit dat het allemaal wat om te proberen is op dit moment.
dit had een edit moeten zijn ipv een quote
Natuurlijk, maar als het inderdaad voor het proberen is en wat te leren van de basis ga ik niet beginnen over sockets met long-polling fallbacks :P

Eerste stap is snappen waarom een lege POST sowieso niet de juiste manier is om data op te halen, daar is de GET voor gemaakt. Tenzij je een body mee wilt sturen, wat technisch gezien ook met een GET kan maar vaak niet is geïmplementeerd in serverside frameworks. (Al gebruikt hij zo te zien geen frameworks op het moment)

  • Bloemkoolsaus
  • Registratie: Juni 2006
  • Niet online
Kijk anders eens wat er in $_POST['msg'] zit. Bijvoorbeeld met http://php.net/var_dump
Als je $action niet 'get' is, kan dat alleen maar betekenen dat $_POST['msg'] niet empty is.

Acties:
  • +2 Henk 'm!

  • finlaydag33k
  • Registratie: December 2015
  • Laatst online: 06-09 20:59
waarom gebruik je uberhaupt POST om te kijken of er nieuwe berichten zijn?
POST gebruik je om data naar de server te sturen, GET om data van de server te krijgen (obviously).

probeer anders dit in de receive functie (de Javascript)
code:
1
2
3
$.get( "chat.php", function(data){
    $('#info').prepend(data);
});


Wellicht dat je hierna je PHP code nog iets moet aanpassen.

Acties:
  • 0 Henk 'm!

  • BarôZZa
  • Registratie: Januari 2003
  • Nu online
En knal een timestamp achter je GET url, gaat je wat cachegezeur voorkomen in willekeurige browsers.

Acties:
  • 0 Henk 'm!

  • ONiel
  • Registratie: September 2015
  • Laatst online: 15-06 21:16
finlaydag33k schreef op zondag 27 november 2016 @ 13:17:
waarom gebruik je uberhaupt POST om te kijken of er nieuwe berichten zijn?
POST gebruik je om data naar de server te sturen, GET om data van de server te krijgen (obviously).

probeer anders dit in de receive functie (de Javascript)
code:
1
2
3
$.get( "chat.php", function(data){
    $('#info').prepend(data);
});


Wellicht dat je hierna je PHP code nog iets moet aanpassen.
Ik heb in AJAX get gebruikt, maar snap dan niet hoe dit in PHP te gebruiken aangezien ik nu POST en GET gemixed heb.

code:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<!-----------PHP--------->
<?php
    $conn = new mysqli("localhost", "root", "toor", "amando");
    $user = "Foobar";

                        echo "<b>1: ". $_POST['msg'] . "</b><br>";
                        if (is_null($_GET['msg']) && !is_null($_POST['msg'])) {
                                $action = 'post';
                            } else $action = 'get';

                            $date = new DateTime();
                           
                            function refreshMsg() {
                                    echo "<b>2: ". "refreshMsg function (in PHP) triggered" . "</b><br>";
                                    global $conn, $user;

                                    $stmt = $conn->prepare("SELECT sender, message, admin FROM chat WHERE sender=?");
                                    $stmt->bind_param("s", $sender_);
                                    $sender_ = $user;
                                    $stmt->execute();
                                    $stmt->bind_result($username, $msgSent, $admin);
                                    
                                    $str = "";
                                    while ($stmt->fetch()) {
                                        if ($admin == 0) {
                                            $_username = $username;
                                        } else $_username = "Admin";

                                        $str .= "<b>".htmlspecialchars($_username) . "</b>: " . htmlspecialchars($msgSent) . "<br>";
                                    }
                                    $stmt->execute();
                                    echo $str;
                                    $stmt->close();
                            }
                            
                            switch ($action) {
                                case 'post':
                                    echo "<b>3: ". "POST-action in PHP triggered" . "</b><br>";
                                    $stmt = $conn->prepare("INSERT INTO chat (message, sender) VALUES (?, ?)");
                                    $stmt->bind_param("ss", $message_, $sender_);
                                    $message_ = $_POST['msg'];
                                    $sender_ = $user;
                                    $stmt->execute();
                                    $stmt->close();
                                    refreshMsg();
                                    break;
                                case 'get':
                                    echo "<b>4: ". "GET-action in PHP triggered" . "</b><br>";
                                    refreshMsg();
                                    break;
                                default:
                                    break;
                            }


?>

<!---------HTML-------------->
                    <form action="" method="post" id="chat">
                        <input type="text" name="msg" placeholder="Your message here..." />
                        <input type="submit" name="send" value="Verzend" />
                    </form> 


<!-----------AJAX & Javascript------------------>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script>
        function receive() {
            console.log("Receive triggered");
            $.get('chat.php', function (data) {
                $('#info').prepend(data);
            });
        }

        $(document).ready(function () {
        t = setInterval(receive, 500);
        $("#sendz").click(function (event) {
            console.log("Send function launched.");
            var msgValue = document.getElementById("value").value;
            event.preventDefault();
            $.post('chat.php', {msg: msgValue}, function (data) {
                $('#info').prepend(data);
            });

        });
        });
    </script>

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 05-10 19:42
Is het niet makkelijker om een

PHP:
1
2
3
4
5
<?
if (isset($_POST['msg'])) {
    // hier je database invoeren met een redirect naar de view
}
?>


Dat is eigenlijk toch het enige wat je wilt :?

vwb het Ajax gebeuren zijn er zoveel scripts te vinden die precies doen wat jij zegt. Daar kun je ook eens in kijken hoe men het daar gedaan heeft.

[ Voor 27% gewijzigd door RedHat op 27-11-2016 19:14 ]


Acties:
  • 0 Henk 'm!

  • ONiel
  • Registratie: September 2015
  • Laatst online: 15-06 21:16
Ik heb nu ook geprobeerd over heel mijn php-code (behalve de functie) een if isset() gezet voor POST/GET['msg']. Nu heb ik al, dat als de administrator iets verzend, de chat ook wordt herladen.

Het is dus net alsof AJAX de automatische get-request niet helemaal verzendt, maar de console zegt van wel.

Acties:
  • 0 Henk 'm!

  • BarôZZa
  • Registratie: Januari 2003
  • Nu online
Check je netwerk inspector bij de dev tools, daar zie je welke requests er worden verstonden met de post/get variabelen en wat je terug krijgt.

Acties:
  • 0 Henk 'm!

  • ONiel
  • Registratie: September 2015
  • Laatst online: 15-06 21:16
Ja dat bedoelde ik met de 'console' zegt van wel.
Er worden requests verstuurd.

En de waarde van 'msg' is ""

Acties:
  • 0 Henk 'm!

  • BarôZZa
  • Registratie: Januari 2003
  • Nu online
ja dat is wat anders dan null

Gebruik http://php.net/manual/en/function.empty.php voor dat soort checks.

[ Voor 57% gewijzigd door BarôZZa op 27-11-2016 21:02 ]


Acties:
  • 0 Henk 'm!

  • finlaydag33k
  • Registratie: December 2015
  • Laatst online: 06-09 20:59
RedHat schreef op zondag 27 november 2016 @ 19:09:
Is het niet makkelijker om een

PHP:
1
2
3
4
5
<?
if (isset($_POST['msg'])) {
    // hier je database invoeren met een redirect naar de view
}
?>


Dat is eigenlijk toch het enige wat je wilt :?

vwb het Ajax gebeuren zijn er zoveel scripts te vinden die precies doen wat jij zegt. Daar kun je ook eens in kijken hoe men het daar gedaan heeft.
Nee, $_POST['msg'] is altijd gezet :p dus moet je het met empty() doen.

Acties:
  • 0 Henk 'm!

  • xleeuwx
  • Registratie: Oktober 2009
  • Laatst online: 10-10 00:29

xleeuwx

developer Tweakers Elect
Om te kijken welke methode binnenkomt (POST / GET) zou ik naar de server var kijken:
PHP:
1
$method = (isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET');


En in dit geval wil je kijken of een bericht niet leeg is wat simpel kan met
PHP:
1
2
3
4
5
6
if(!empty($_GET['msg'])) {
var_dump($_GET['msg']);
}
if(!empty($_POST['msg'])) {
var_dump($_POST['msg']);
}


Daarnaast zou ik de JS zo doen zodat (zoals al eerder genoemd) er een Timstamp in zit:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    function receive() {
        let ts = new Date().getTime();
        console.log("Receive triggered");
        $.get(`chat.php${ts}`, function (data) {
            $('#info').prepend(data);
        });
    }

    $(document).ready(function () {
        t = setInterval(receive, 500);
        $("#sendz").click(function (event) {
            console.log("Send function launched.");
            var msgValue = document.getElementById("value").value;
            event.preventDefault();
            $.post('chat.php', {msg: msgValue}, function (data) {
                $('#info').prepend(data);
            });

        });
    });

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Gezien $.post() gebruikt wordt, ga ik er stiekem vanuit dat jQuery bestaat en zou ik niet zelf de variabele ophalen, maar dat lekker via jQuery doen, dan hoef je niet verschillende code door elkaar te gebruiken.

code:
1
document.getElementById("value").value;
wordt dan bijvoorbeeld
JavaScript:
1
$('[name="msg"]').val();
Wat je dan eventueel direct als msg's waarde kan meegeven, scheelt weer een variabele instantiëren. ;)

[ Voor 11% gewijzigd door CH4OS op 27-11-2016 23:26 ]

Pagina: 1