【问题标题】:AJAX call the PHP script not outputting any resultsAJAX 调用 PHP 脚本不输出任何结果
【发布时间】:2015-11-10 11:07:24
【问题描述】:

我正在尝试通过 AJAX 更新我的推文列表。我已经在页面上运行了脚本并且知道该脚本有效,并且我的 ajax 调用中有一个 console.log 行,所以我知道它也会受到影响。

    setInterval(function () {sendRequest()}, 5000);

    function sendRequest(){
        var xmlhttp;

        if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        } else { // code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.onreadystatechange=function(){
            if (xmlhttp.readyState==4 && xmlhttp.status==200){
                console.log("yay");
            }
        }

        xmlhttp.open("GET","getTweets.php",true);
        xmlhttp.send();

    }

我的 AJAX 应该每 5 秒运行一次,然后点击 PHP 脚本返回已存储在数据库中的新结果。我的 PHP 看起来像:

$conn = mysqli_connect("localhost", "*", "*", "*");

if (!$conn) {
    echo("Connection failed: " . mysqli_connect_error());
}

$query = "SELECT * FROM tweets;";

$results = mysqli_query($conn, $query);

while($list = mysqli_fetch_assoc($results)){

echo '<div class="tweet-containter">';

echo '<img class="user-img" alt="user-img" src="images/gb.png">';
echo '<h3 class="tweet-username">@'.$list['username'].'</h3>';
echo '<p class="tweet-body">'.$list['tweetBody'].'</p>';   
echo '<p class="tweet-body">Tweeted: '.$list['datePosted'].'Retweet: <i class="fa fa-retweet" id="retweet4" onclick="retweetAJAX()"></i> Like: <i class="fa fa-thumbs-up" id="likes4" onclick="likeAJAX()"></i> Dislike: <i class="fa fa-thumbs-down" id="dislikes4" onclick="dislikeAJAX()"></i></p>';

echo '</div>';

}

【问题讨论】:

  • 可能是它出错了,所以当 xmlhttp.readyState==4 但 xmlhttp.status 为 not 200 时,您应该有一个分支来处理并打印出该状态,以便您可以解决问题
  • @developerwjk 我不确定我理解你的意思。我的 if 语句检查以确保它们都是我想要的。我的“yay”字符串正在打印到控制台。所以readystate是4,status是200。
  • 如果服务器出现内部错误并返回状态 500 会怎样。您会得到 readystate 4 状态 500,并且您没有在上面打印任何内容,所以您不会知道
  • @developerwjk 是有道理的。我修改了我的声明,看起来像 if (xmlhttp.readyState==4 &amp;&amp; xmlhttp.status==200){ console.log("yay"); } else if (xmlhttp.status==500){ console.log("Internal error"); } else { console.log("Unknown error"); }
  • 对于用于 AJAX 的 PHP 文件,您不应该使用 mysqli 错误报告。我想我应该提一下。

标签: javascript php ajax


【解决方案1】:

ryandonohue,

PHP 是一个超文本处理器。 PHP 在您的服务器上运行,并在页面加载之前生成结果。您不应该使用 PHP 来输出 HTML 元素之类的结果,如果您使用 JavaScript 来操作文档对象模型 (DOM) 会更受欢迎。

不过,出于您的中间目的,您可能不会立即注意到差异。

对于 PHP5,您应该查看 PHP-PDO http://php.net/manual/en/class.pdo.php 的用法以防止 SQL 注入。

修改:

function getall($table, $values, $conditions = null, $limit = null, $ascdesc = null){
        $values_str = "";
        foreach($values as $key => $value){
            $values_str .= $value . ", ";
        }
        $cond_str = "";
        $hascond = false;
        if($conditions != null){
            $hascond = true;
            foreach($conditions as $key => $value){
                $cond_str .= $key . "='" . $value . "' AND ";
            }
            $cond_str = rtrim($cond_str, " AND ");
        }
        $values_str = rtrim($values_str, ", ");
        $cond_str = " WHERE (" . $cond_str . ")";


        $orderby = "";
        $hasorder = false;
        if($ascdesc != null){
            $hasorder = true;
            foreach($ascdesc as $key => $value){
                $orderby = " ORDER BY " . $value . " " . $key;
                break;
            }
        }


        $sql = "SELECT " . $values_str . " FROM " . $table . " " . (($hascond)? $cond_str: "") . (($hasorder)? $orderby: "") . (($limit)? " LIMIT " . $limit: "");
        //echo $sql;
        $sql_prep = (new PDO('mysql:host=localhost;dbname=' . 'database', 'username', 'Password'))->prepare($sql);
        $sql_prep->execute();
        return $result = $sql_prep->fetchAll(PDO::FETCH_ASSOC);

    }

初始化:(返回一个数组所以需要json编码)

getall('table',
    Array(
          '*'
     ),
     null, 5, null);

AJAX:

function ajax(file,type, params, func){
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                //xmlhttp.responseText
                func(xmlhttp.responseText);
            }
        }
        if(type.toLowerCase() != "post"){
            xmlhttp.open(
                type, file + "?" + params_to_get(params),
                true
            );
            xmlhttp.send();
        }else{
            xmlhttp.open(
                type, file,
                true
            );
            xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            xmlhttp.send(params_to_get(params));

由于您的错误代码为 4 且状态为 500,我会说问题更多在于 MYSQLi 的兼容性或您的表与数据库的设置方式。

查看此 POST 以获取有关标头的更多信息: Ajax call to PHP is returning nothing

【讨论】:

    【解决方案2】:

    这适用于那些不了解 ReadyState 代码的人。您应该知道 ReadyState 的以下代码:

    0: request not initialized 
    1: server connection established
    2: request received 
    3: processing request 
    4: request finished and response is ready
    

    和状态码

    200: "OK"
    404: Page not found
    

    话虽如此,请尝试这样做:

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == XMLHttpRequest.DONE ) {
           if(xmlhttp.status == 200){
               console.log(xmlhttp.responseText);
           } else if(xmlhttp.status == 400) {
              alert('There was an error 400')
           } else {
               alert('something else other than 200')
           }
        }
    }
    

    【讨论】:

    • 好吧,不过在我的 PHP 脚本中,你会看到我想如何创建一个 div。但是我从服务器得到的响应只是纯文本,例如:

      如果我将 PHP 嵌入到页面中,如何让它输出类似的输出?

    • 您所要做的就是设置您的内容类型:xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签