Hey,
nach langem ausprobieren und Tutorials durchmachen, welche zum Teil nicht so ganz gut sind, habe ich es geschaft.
Jedoch was ich nicht gut finde ist, dass Javascript keine Tage und Monate mit einer 0 vornedran supportet. Also 06 zum Beispiel.
Habe dies jedenfalls nicht gefunden.
Ich verstehe aber dieses Polling noch nicht so richtig.
Dies ist der Code:
function refresh(){
var date = new Date();
var day = date.getDate();
var month = date.getMonth();
var year = date.getFullYear();
var hour = date.getHours();
var minute = date.getMinutes();
var seconds = date.getSeconds();
var datetime = year + "-0" + month + "-0" + day + " " + hour + ":" + minute + ":" + seconds;
$.ajax({
url: "allMessages.php",
type: "GET",
data: {datetime:datetime},
async: true,
cache: false,
success: function (data, textStatus) {
$("#allMessages").html(data);
var datetime = year + "-0" + month + "-0" + day + " " + hour + ":" + minute + ":" + seconds;
refresh();
},
})
.done(function() {
console.log("Polling erfolgreich");
})
.fail(function(error) {
refresh();
console.log('Error: ' + error.statusText);
});
}
refresh();
Alles anzeigen
$currentDatetime = isset($_GET["datetime"]) ? $_GET["datetime"] : null;
try{
$dbv = new PDO("mysql:host=127.0.0.1;dbname=chat;charset=utf8", "root", "");
//Select and Fetch all Messages
$selectStmt = $dbv->prepare("SELECT username, message, created_at FROM messages");
$selectStmt->execute();
$messages = $selectStmt->fetchAll(PDO::FETCH_ASSOC);
function getLastModifiedDatetime($dbv){
$getDatetime = $dbv->prepare("SELECT created_at FROM messages");
$getDatetime->execute();
return $getDatetime->fetch(PDO::FETCH_ASSOC);
}
function newItems($dbv, $currentDatetime){
$getNewItem = $dbv->prepare("SELECT messageId FROM messages WHERE created_at >= :currentDatetime");
$getNewItem->execute(array(":currentDatetime" => $currentDatetime));
$result = $getNewItem->fetch(PDO::FETCH_ASSOC);
if(count($result) > 0){
return true;
} else{
return false;
}
}
$datetime = getLastModifiedDatetime($dbv);
if(isset($currentDatetime)){
while ($datetime <= $currentDatetime) {
usleep(2000000);
clearstatcache();
$datetime = getLastModifiedDatetime($dbv);
if(newItems($dbv, $currentDatetime)){
break;
}
}
}
// Output
foreach ($messages as $key => $value) {
$date = $value["created_at"];
$date = explode(" ", $date);
$time = $date[1];
$time = substr($time, 0, 8);
echo "<div class='row' id='showMessages'>";
echo "<div class='col-sm-3 border border-primary'>";
echo htmlspecialchars($value["username"]);
echo "</div>";
echo "<div class='col-sm-7 border border-primary'>";
echo htmlspecialchars($value["message"]);
echo "</div>";
echo "<div class='col-sm-2 border border-primary'>";
echo $time;
echo "</div>";
echo "</div>";
}
}catch(EXCEPTION $a){
echo "Ein Fehler ist aufgetreten: " . $a->getMessage();
exit();
}
Alles anzeigen
Ich möchte mal versuchen es zu erklären, wenn ich wo falsch liege, dann bitte ich um Korrektur.
Über Ajax wird die aktuelle Datetime an das PHP-Script übergeben. Wenn dies erfolgreich war oder ein Fehler auftrat wird die Funktion wieder von neu gestartet. Im PHP-Script überprüfen wir ob diese übergebende Variable auch vorhanden ist und weißen diese einer Variable zu. Zum Ausführen des Pollings benötigen wir die Datetime des letzten Datensatzes in der DB sowie eine Abfrage ob neue Datensätze dazu kamen. Diese 2 Abfragen werden in Funktionen aufgeteilt. Dann wird eine while-schleife erstellt und es wird solange die datetime des letzen Datensatzes kleiner, gleich der Datetime, welche durch Ajaxx übergeben wird, der Cache geleert, und die Funktion um den letzten Datensatz zu erhalten ausgeführt. Davor wird die Funktion usleep ausgeführt, damit da auch etwas Pause dazwischen ist und die Datenbank nicht dauerhaft arbeitet. Darüberhinaus wird überprüft ob es ein neuer Datensatz gibt und wenn ja wird die while schleife abgebrochen. Und dann wird die beim Funktionaufruf der refresh Funktion in Javascript wieder gestartet.
Trotzdem verstehe ich ehrlich gesagt nicht wie es auch andere angezeigt bekommen.
Warum gibt die Funktion newItem() immer true zurück? Auch wenn created_at kleiner als die aktuelle Datetime ist.
Grüße,
Stef