я делаю вид монитора, который показывает изменения в базе данных, созданные другим веб-приложением, я перезагружал страницу каждые 10 секунд, чтобы показать изменения, но, я думаю, что это не «способ» сделать это, поэтому Я сделал некоторые исследования, и я обнаружил, что ajax может это сделать, вызывая функцию, которая проверяет, что изменения, поэтому я написал свой код, но что-то не хватает, поэтому я вызываю экспертов, основная идея заключается в том, что при загрузке страницы id (число) этой последней строки, которая была вставлена и затем сохранена в переменной с именем $ resultado, затем вызовите функцию, называемую check_changes, которая выполняет тот же запрос и проверяет результаты, если обе переменные равны, а не изменения, если они другая страница перезагрузки.
monitor.php
<head> <script type="text/javascript" src="./js/prototype.js"></script> <script type="text/javascript" src="./js/jquery-1.8.3.min.js"></script> </head> <? //code that makes and print the query. // here i check the last id(number) and saved on $resultado variable $qry0="SELECT emergencia.id FROM emergencia ORDER BY emergencia.id DESC LIMIT 0,1"; $qry1=db_query($qry0,$conn); while($row=$qry1->fetch_array()) { $resultado=$row['id']; } //here i call check_changes every 30 seconds echo "<script>setTimeout('check_changes()',30);"; //ajax function that check the status of database echo "function check_changes(){ $.ajax({ type: 'POST', data: {'data':$resultado}, //here am sending the value of result via post url: './checker.php', //to checker.php success: function(data) { if(data.result==true){ window.location = window.location.pathname; } } }) }"; echo "</script>"; ?>
checker.php
<? $result4 = $_POST['data']; include( "/home/ocelas/proyecto/include/inter_dbc_innodb.php" ); $dbc=connect_db("seguridad"); // here i check the last id(number) and saved on $result3 variable $qry0="SELECT emergencia.id FROM emergencia ORDER BY emergencia.id DESC LIMIT 0,1"; $qry1=$dbc->query($qry0); while($row=$qry1->fetch_array()) { $result3=$row['id']; } //here i check if both are equal send false to monitor.php if ($result4==$result3){ $result=false echo json_encode($result); } else { // a new row has been inserted, send true to monitor.php an reload page $result=true echo json_encode($result); } ?>
в<? $result4 = $_POST['data']; include( "/home/ocelas/proyecto/include/inter_dbc_innodb.php" ); $dbc=connect_db("seguridad"); // here i check the last id(number) and saved on $result3 variable $qry0="SELECT emergencia.id FROM emergencia ORDER BY emergencia.id DESC LIMIT 0,1"; $qry1=$dbc->query($qry0); while($row=$qry1->fetch_array()) { $result3=$row['id']; } //here i check if both are equal send false to monitor.php if ($result4==$result3){ $result=false echo json_encode($result); } else { // a new row has been inserted, send true to monitor.php an reload page $result=true echo json_encode($result); } ?>
<script type="text/javascript"> var pollTimeout; var observeChange = { 'poll' : function() { $.ajax({ type: "POST", url: 'checker.php', data:"data=<?php echo $resultado; ?>", dataType:"json", async:true, success:function(response){ // we have success fully received response,clear the timeout clearTimeout(pollTimeout); observeChange.update(response); }, error: function(XMLHttpRequest,textStatus){ //some error has occured please try after 5 seconds pollTimeout = setTimeout(function() { observeChange.poll(); }, 1000); } }); }, 'update' : function(json) { //check whether change is there from serever or not if yes than reload page else do poll request again if(json.changed=="yes"){ window.location.reload(); } else{ observeChange.poll(); } } }; $(document).ready(function(){ observeChange.poll(); }); </script>
вы можете легко сделать это с помощью кометы, не рекомендуется запрашивать сервер каждые 10 секунд, вы должны увеличить время ожидания на сервере Apache, если используете apache
Предполагаемые конфигурации Apache:
Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 240 MaxClients 150 MaxRequestsPerChild 4
checker.php
<? $result4 = $_POST['data']; $response=array("changed"=>"no"); include( "/home/ocelas/proyecto/include/inter_dbc_innodb.php" ); $dbc=connect_db("seguridad"); // here i check the last id(number) and saved on $result3 variable $qry0="SELECT emergencia.id FROM emergencia ORDER BY emergencia.id DESC LIMIT 0,1"; $qry1=$dbc->query($qry0); while($row=$qry1->fetch_array()) { $result3=$row['id']; } if ($result4==$result3){ $response['changed']="yes"; } echo json_encode($response); exit; ?>
в<? $result4 = $_POST['data']; $response=array("changed"=>"no"); include( "/home/ocelas/proyecto/include/inter_dbc_innodb.php" ); $dbc=connect_db("seguridad"); // here i check the last id(number) and saved on $result3 variable $qry0="SELECT emergencia.id FROM emergencia ORDER BY emergencia.id DESC LIMIT 0,1"; $qry1=$dbc->query($qry0); while($row=$qry1->fetch_array()) { $result3=$row['id']; } if ($result4==$result3){ $response['changed']="yes"; } echo json_encode($response); exit; ?>
Вам не хватает точек с запятой в вашем php-коде. Я не думаю, что это работает вообще. Вы должны проверить сообщения об ошибках php, сгенерированные в вашем сценарии обратной передачи.
В вашем javascript вы сравниваете результат с логическим значением. Возвращенные данные будут строкой. Это правильный путь, обратите внимание на одинарные кавычки.
if(data.result=='true'){ window.location = window.location.pathname; }
в checker.php вы отправляете данные после преобразования в формат JSON ,
но в запросе ajax вы вообще не определили тип данных ,
также, если данные, поступающие с успехом ajax, являются JSON, тогда вы должны сначала разобрать его.
$.ajax({ type: "GET", url: 'checker.php', data:{'ata:$resultado}, dataType:"json", success:function(data){ if( JSON.parseQuery(data)) //this will run if the result is true. { window.location = window.location.pathname; } } });