2013-07-12 6 views
0

У меня есть этот код jQuery, который должен только показывать предупреждение для нового сообщения, когда запись найдена в базе данных.jQuery Code работает независимо от того, что

index.html (JQuery код)

<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script> 

<script> 

$(document).ready(function(){ 
    var count = 0; 
    setInterval(function() { 
     $.post("messagecheck.php", { countOld: count }, 
     function(data){ 
      if(data == 0) { 
       alert("No New Messages"); 
       return; 
     } else { 
       count = data; // This will change the count for each run, you could store this in div with .data() ... 
       alert("New Message!"); 
       return;   
     } 
      }); 
     }, 1000); 
    }); 
</script> 

messagecheck.php

<?php 

    if($uid == 0) { 
     die(); // not logged in 
    } else { 
     $sql = 'SELECT messagecount FROM Users WHERE uid = $uid AND messagecount >= 1'; 
     $result = mysql_query($sql);   
     if(!$result) { 
      // Kill SQL and return error 
     } else { 
      // We will be sending an Old Count via POST 
      $numRows = mysql_num_rows($result); 
      echo $numRows; 
      if($numRows == $_POST['countOld']) { 
       // No change 
       echo 'No change: 0';  
      } else 
       echo $numRows; 
     } 
    } 

?> 

Даже если $ UID является 0 (пользователь не вошел в систему) предупреждение для New Сообщение! показывает.

Что можно сделать, чтобы исправить это?

Спасибо.

ответ

7

Вот ваш условный:

if(data == 0) { 

А вот то, что ваши AJAX вызов возвращает:

echo 'No change: 0'; 

условные принимает значение false потому что 'No change: 0' не равна 0.

+0

Я изменил это сейчас, но по-прежнему та же проблема, я даже удалил весь код PHP раньше и новое сообщение! предупреждение все еще отображается. – Koala

+1

Попробуйте выполнить 'console.log (data)', чтобы увидеть, что возвращается. –

+0

@ user1626410: Похоже, у вас также есть код на стороне сервера, который не возвращает никакого значения. Проверьте фактические значения, возвращаемые вашим серверным кодом, и используйте эти фактические значения в условном условном выражении на стороне клиента. В настоящее время они не совпадают. – David

2

Если $uid - 0, тогда не будет никаких данных, отправленных с сервера. data будет emtpy, поэтому data == 0 будет оцениваться как false. Попробуйте следующее:

if (!data) { 
    alert("No New Messages"); 
    return; 
} else { 
    count = data; 
    alert("New Message!"); 
    return; 
} 
+0

Просто попробовал это, еще новое сообщение, даже когда вышло из системы – Koala

+0

Попробуйте 'console.log (data);' или 'alert (data);' как самую первую команду в функции обратного вызова, чтобы увидеть, что фактически возвращается с сервера , Я не уверен, как работает 'die()' и выводит ли он какой-либо вывод или нет. – mishik

+0

Я пробовал работать через firebug, и я получаю 403 Запрещено на messagecheck.php POST – Koala

4

У вас много логических проблем.

  1. Если идентификатор пользователя равен 0 (не вошел в систему), вы убьете PHP-скрипт; ничего не возвращается. Это не так же, как false, он будет оцениваться как '' и '' !== 0.

  2. Если инструкция SQL не работает, то проблема.

Вам нужно перефразировать ваш PHP-скрипт, чтобы либо получить согласованный результат независимо от того, что. Что-то вроде этого:

<?php 
$new_messages = false; 

if ($uid > 0) { 
    $sql = 'SELECT messagecount FROM Users WHERE uid = ? AND messagecount >= 1'; 

    $stmt = $db->prepare($sql); 
    $stmt->execute(array($uid)); 
    $row = $stmt->fetchObject(); 

    if (is_object($row) && intval($row->messagecount) !== intval($_POST['countOld'])) { 
     $new_messages = true; 
    } 
} 

header('Content-Type: application/json'); 

print json_encode(array(
    'new_messages' => $new_messages 
)); 

Это возвращает логическое значение (true или false) значение независимо от того, что вы можете тест на вашей JavaScript:

$.post('messagecheck.php', { countOld: count }, function(result) { 
    if (result && result.new_messages) { 
     if (result.new_messages === true) { 
      alert('You have a new message.'); 
     } 
    } 
}); 

Кроме того, не используйте mysql_ функции, они устарели в соответствии с предупреждением на странице руководства PHP.net: http://php.net/manual/en/function.mysql-query.php. Используйте вместо этого PDO или MySQLi.

+0

Когда я пытаюсь это сделать, я получаю эту ошибку: Ошибка синтаксиса: ошибка синтаксиса, неожиданный T_PRINT в messagecheck.php в строке 43 – Koala

+0

Отсутствует; в конце заголовка(), но теперь я получаю это предупреждение: не могу изменить информацию заголовка - заголовки, уже отправленные (вывод запущен на functions.php: 61) functions.php включен в начало – Koala

+0

Сообщение об ошибке сообщает вам о проблеме: где-то в ** functions.php ** у вас есть код, который отправляет вывод, является ли это 'print()' statement или 'echo()' statement или что-то вроде этого. –

1

Есть в основном шесть вещей, которые могли бы быть вопрос - что я могу думать:

  • В PHP вы выводите из «Без изменений: 0».
  • Вы используете die(); как возвращаемое значение
  • Вы повторяете одно и то же число дважды.
  • $numRows и/или $_POST['countOld'] не возвращаются ожидается значения
  • В JQuery вы используете ==. Этот оператор вычисляет значение,
  • Вы выполнения Ajax-кода один раз второй и JQuery делает асинхр - звонки

Изменить часть PHP:

} else { 
     // We will be sending an Old Count via POST 
     $numRows = mysql_num_rows($result); 
     echo $numRows; 
     if($numRows == $_POST['countOld']) { 
      // No change 
      echo 'No change: 0';  
     } else 
      echo $numRows; 
    } 

к:

} else { 
     // We will be sending an Old Count via POST 
     $numRows = mysql_num_rows($result); 
     //Before you hade echo $numRows. This would make numRows echo out twice 
     //because it's echoed it down below also 
     if($numRows == $_POST['countOld']) { 
      // No change 
      echo 0; //Echo out 0.  
     } else 
      echo $numRows; 
    } 

Почему? Поскольку echo 'No change: 0'; evaulates к ложным и не значением 0.

в JQuery (JavaScript) - использование TypeOf проверить фактическое значение, как это:

<script> 
    $(document).ready(function(){ 
     var count = 0; 
     setInterval(function() { 
      $.post("messagecheck.php", { countOld: count }, 
      function(data){ 
       if(typeof data == 0) { 
        alert("No New Messages"); 
        return; 
      } else { 
        count = data; // This will change the count for each run, you could store this in div with .data() ... 
        alert("New Message!"); 
        return;   
      } 
       }); 
      }, 1000); 
     }); 
    </script> 

Вход/Проверьте значения $ numRows и $ _POST ['countOld'] и посмотреть, получаете ли вы то, что ожидаете.

Выполняется ajax-код один раз в секунду, а jQuery выполняет асинхронные вызовы. Если вы делаете eveything выше и все кажется прекрасным, Я бы сменил интервал на большее число, чтобы быть уверенным, что сами звонки не завинчивают вещи. Я не уверен, что вы должны проверять так часто, как секунду?

Вместо использованияdie() при Идентификатор_пользователя = 0, просто эхо из 0 с echo '0';. (То сценарий не подведет)

И конечно - не используют mysql_ - функций * если вы абсолютно не нужны, потому что они устарели. И в этом случае он открыт для SQL-инъекций и т. Д., Но это еще одна проблема.

Смежные вопросы