【问题标题】:Json foreach loop is outputting the word object instead of its contentsJson foreach 循环正在输出单词对象而不是其内容
【发布时间】:2019-08-09 14:47:10
【问题描述】:

我正在尝试通过 json 发送 foreach 循环,然后使用 innerHTML 显示。没有任何错误。我遇到的问题是输出是显示:

[对象对象]

而不是 foreach 循环中的内容。

如何让输出成为foreach 循环内的$html 行?

try {
    $sql_recentProjects = "
        SELECT *
        FROM project_gallery
        ORDER BY date_added ASC
        LIMIT 5
    ";
    if ($recentProjects_stmt = $con->prepare($sql_recentProjects)) {
        $recentProjects_stmt->execute();
        $recentProjects_rows = $recentProjects_stmt->fetchAll(PDO::FETCH_ASSOC);
        $recProj_arr = array();
        foreach ($recentProjects_rows as $recentProjects_row) {
            $precProjName = $recentProjects_row['p_name'];
            $recProjImg = $recentProjects_row['p_img'];
            //$project_img = substr($project_img, 2);
            $displayRecProjImg = '<img src="/php'.$recProjImg.'" alt="'. $precProjAlt .'" class="projectDisplayImg">';
            $html = '';
            $html .= '<div class="recentProjectCont">';
            $html .= '<div class="recentProjectImg">';
            $html .= $displayRecProjImg;
            $html .= '</div>';
            $html .= '<div class="recProjInfoCont">';
            $html .= '<div class="">';
            $html .= $precProjName;
            $html .= '</div>';
            $html .= '</div>';
            $html .= '</div>';
            $recentProjData = array('html' => $html);
            //$proj_arr[] = $data;
        }
    }
}
catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
echo json_encode(['recentProjectData' => $recentProjData]);

JS

function ajaxCallCatalogs() {
    $.ajax({
        url: 'php/projects/projectGallerySelect.php',
        datatype: 'json',
        success: function (data) {
            //console.log(data);
            obj = JSON.parse(data);
            recentProjectData = obj.recentProjectData; //Recent 5 Projects submitted to gallery

            document.getElementById('recentProjectWrap').innerHTML = recentProjectData;
        }
    });
}
ajaxCallCatalogs();
setInterval(ajaxCallCatalogs, 150000);

【问题讨论】:

  • 因为你有$recentProjData = array('html' =&gt; $html)。所以recentProjectData 是一个带有html 元素的对象
  • 你为什么不只是发送 html 字符串而不是尝试作为 json 发送?
  • 如果你去掉评论,看看你收到的数据的结构://console.log(data);
  • document.getElementById('recentProjectWrap').innerHTML = recentProjectData.html;document.getElementById('recentProjectWrap').innerHTML = recentProjectData['html'];
  • 作为答案发布...

标签: javascript php arrays json ajax


【解决方案1】:

(阅读 OP 的 cmets 以了解我发布此答案的原因)

您有两种选择...最简单但更具限制性的方法是:

try {
    $sql_recentProjects = "
        SELECT *
        FROM project_gallery
        ORDER BY date_added ASC
        LIMIT 5
    ";
    if ($recentProjects_stmt = $con->prepare($sql_recentProjects)) {
        $recentProjects_stmt->execute();
        $recentProjects_rows = $recentProjects_stmt->fetchAll(PDO::FETCH_ASSOC);
        $recProj_arr = array();
        $html = '';  // MOVE THIS OUTSIDE THE LOOP
        foreach ($recentProjects_rows as $recentProjects_row) {
            $precProjName = $recentProjects_row['p_name'];
            $recProjImg = $recentProjects_row['p_img'];
            //$project_img = substr($project_img, 2);
            $displayRecProjImg = '<img src="/php'.$recProjImg.'" alt="'. $precProjAlt .'" class="projectDisplayImg">';
            $html .= '<div class="recentProjectCont">';
            $html .= '<div class="recentProjectImg">';
            $html .= $displayRecProjImg;
            $html .= '</div>';
            $html .= '<div class="recProjInfoCont">';
            $html .= '<div class="">';
            $html .= $precProjName;
            $html .= '</div>';
            $html .= '</div>';
            $html .= '</div>';
            //$proj_arr[] = $data;
        }
        // SET THIS AFTER YOU GET ALL ROWS INTO THE STRING
        $recentProjData = array('html' => $html);
    }
}
catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
echo json_encode(['recentProjectData' => $recentProjData]);

或者,您可以这样做,这将真正将行分成更多可消耗的数据,但这意味着您需要重新编码您的 JS 以正确输出它(通过 JS 循环数据):

try {
    $sql_recentProjects = "
        SELECT *
        FROM project_gallery
        ORDER BY date_added ASC
        LIMIT 5
    ";
    if ($recentProjects_stmt = $con->prepare($sql_recentProjects)) {
        $recentProjects_stmt->execute();
        $recentProjects_rows = $recentProjects_stmt->fetchAll(PDO::FETCH_ASSOC);
        $recProj_arr = array( 'html' => array() );  // SET UP THE ARRAY
        foreach ($recentProjects_rows as $recentProjects_row) {
            $precProjName = $recentProjects_row['p_name'];
            $recProjImg = $recentProjects_row['p_img'];
            //$project_img = substr($project_img, 2);
            $displayRecProjImg = '<img src="/php'.$recProjImg.'" alt="'. $precProjAlt .'" class="projectDisplayImg">';
            $html = '';
            $html .= '<div class="recentProjectCont">';
            $html .= '<div class="recentProjectImg">';
            $html .= $displayRecProjImg;
            $html .= '</div>';
            $html .= '<div class="recProjInfoCont">';
            $html .= '<div class="">';
            $html .= $precProjName;
            $html .= '</div>';
            $html .= '</div>';
            $html .= '</div>';
            $recentProjData['html'][] = $html; //ADD TO THE ARRAY, INSTEAD OF OVERWRITING IT
            //$proj_arr[] = $data;
        }
    }
}
catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
echo json_encode(['recentProjectData' => $recentProjData]);

【讨论】:

  • 谢谢!为什么通过JS循环这个方法会更好?
  • 循环遍历 JS 的方法会更好,因为它可以让您更好地控制如何显示行,因为每一行的代码都被分隔成一个数组,而不是一个长字符串.假设由于某种原因,您只需要在一个页面中显示两行,但在另一页中显示所有 5 行……或者您需要按照老板的要求重新排序行。你可以通过 JS 循环来控制它。否则,您需要在字符串中进行更复杂的搜索/替换。
  • 如果你想获得真正的技术,你正在做一种 RESTful API,所以根据你想要实现的可重用性,你最好将数据与标记分开.您实际上应该只返回所有数据的对象。这样,您可以在不同的页面/网站上使用数据,但可以更改其外观,因为您可以为每个用例独立创建标记。通过添加标记,您将强制任何人使用您分配的布局和类。如果它只适合您,这没什么大不了的,但会破坏 RESTful API 的意义。
  • 那么通过将JS方法添加到数组中,我该怎么做呢?我定义每条循环线是$html
  • @Paul 我不确定我是否理解您的问题。你是什​​么意思“定义每个循环的行是 $html”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多