javascript - 返回到 ajaxrequest 的 PHP 对象有 boolean == true 而不是 data

标签 javascript php jquery ajax

我正在尝试使用 laravel、php 和 jquery ajax 创建动态 View 。 当点击导航栏按钮时,它将向 Controller 发送一个 ajax 请求, Controller 将验证发送的 id、获取数据并以 html 格式返回。

因为可能会发送回多个值,这些值需要它们自己的 html div。所以我用一个对象尝试过这个。

buttonclicked => ajax请求 Controller =>获取数据=>用html格式化数据=>将其放入对象=>返回对象到ajax请求成功:。

我现在遇到的问题是该对象确实返回,但不是 html 格式的数据,而是一个 bool 值设置为 true,如 firebug 中所示。

我对 Ajax 和 Jquery 还很陌生,如果这个问题以前被问过很多次,我很抱歉。

Ajax :

function onclickNavbar(id) {
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    $.ajax({
        url:'/controller/AjaxController',
        type: "POST",
        dataType: "json",
        beforeSend: function (xhr) {
            var token = $('meta[name="csrf_token"]').attr('content');
            if (token) {
                return xhr.setRequestHeader('X-CSRF-TOKEN', token);
            }
        },
        data: {identifier: id},
        success: function(data){
            var $Htmlselector = $("#contenthtml");
            console.log('succes');
            jQuery.each(data.html, function(key, value){
                console.log(key + ' : ' + value);
                $($Htmlselector).html(value);
            });

        },
        error: function(data){
            console.log('Error something went wrong. See response output:');
            console.log(data);
        }
    });
}

Controller :

public function processor(){
    if(isset($_POST['identifier'])){
        $id = $_POST['identifier'];
        $db = new DatabaseController();

        $diensten = $db->GetAllDiensten()->where('parentcategory_id', '=', $id);
        $htmlObject = array();
        $counter = 0;
        foreach($diensten as $dienst){
            $htmlObject[$counter++] = "
            <div class='col-xs-2half card-column'>
                <div class='article-list header-card'>
                    <a href='/dienst/" . $dienst->shortname . "'>
                        <img src=" . asset( 'assets/img' . $dienst->image ) . "/>
                    </a>
                </div>
                <div class=".'article-list'." class=".'body-card'.">
                    <hr class=".'hr-card'." >
                    @if(" . strlen($dienst->name) <= 20 . ")
                        <h3 class='name text-card'>" . $dienst->name . "</h3>
                    @else
                        <h3 class='name text-card'>" . $dienst->name . "</h3>
                    @endif
                    <hr>
                    <p class='description idtagA text-card'>" . $dienst->shortdesc . "</p> 
                </div>
                <div class='article-list footer-card'>
                    <a href='/dienst/". $dienst->shortname ."'>
                        <button class='btn btn-danger btn-card' type='button' style='padding-bottom:10px;'>
                            <span>". $dienst->shortname ."</span>
                        </button>
                    </a>
                </div>
            </div>";
        }
        $htmlObject = json_encode((object)$htmlObject);
        return response()->json(['html'=> $htmlObject]);
        //return json_encode($html, true);

    }else{
        return 'Value Identifier not set!';
    }
}

注意:我使用的是 Laravel 5.6.3,@if @foreach 等是blade 的语法。

更新:##根据@SmitRaval的代码出错

{"html":[true]}Array{
"message": "Array to string conversion",
"exception": "ErrorException",
"file": "C:\\xampp\\htdocs\\Development Entric\\Entric_website\\app\\Http\\Controllers\\AJAXController.php",
"line": 49,
"trace": [
    {
        "file": "C:\\xampp\\htdocs\\Development Entric\\Entric_website\\app\\Http\\Controllers\\AJAXController.php",
        "line": 49,
        "function": "handleError",
        "class": "Illuminate\\Foundation\\Bootstrap\\HandleExceptions",
        "type": "->"
    },
    {
        "function": "processor",
        "class": "App\\Http\\Controllers\\AJAXController",
        "type": "->"
    },
    {
     .... It goes on for a while...

更新2:

现在有更多这样的函数,因此当某些查询更频繁地与 ->where 或 ->find 一起使用时,我可以使用不同的参数扩展这些函数。 迪恩斯坦 Controller :

use App\diensten; // This is the model.
class DatabaseController extends Controller
{

function GetAllDiensten(){
    return $diensten = diensten::all();
}

最佳答案

为什么要对 json 进行两次编码?

$htmlObject = json_encode((object)$htmlObject);
return response()->json(['html'=> $htmlObject]);

可以直接使用

return response()->json(['html'=> (object)$htmlObject]);

请在您的代码中尝试此操作。

编辑

ajax 调用从服务器读取响应,并且该响应必须呈现为某种类型的可读数据,例如 application/jsontext/html

为了写入该数据,您需要使用 PHP 从服务器回显它。

return 语句不写入数据,它只是在服务器级别返回。

试试这个

echo json_encode(['html'=> (object)$htmlObject]);
die;

更新

foreach($diensten as $dienst){
            $htmlObject[] = "
            <div class='col-xs-2half card-column'>
                <div class='article-list header-card'>
                    <a href='/dienst/" . $dienst->shortname . "'>
                        <img src=" . asset( 'assets/img' . $dienst->image ) . "/>
                    </a>
                </div>
                <div class=".'article-list'." class=".'body-card'.">
                    <hr class=".'hr-card'." >
                    @if(" . strlen($dienst->name) <= 20 . ")
                        <h3 class='name text-card'>" . $dienst->name . "</h3>
                    @else
                        <h3 class='name text-card'>" . $dienst->name . "</h3>
                    @endif
                    <hr>
                    <p class='description idtagA text-card'>" . $dienst->shortdesc . "</p> 
                </div>
                <div class='article-list footer-card'>
                    <a href='/dienst/". $dienst->shortname ."'>
                        <button class='btn btn-danger btn-card' type='button' style='padding-bottom:10px;'>
                            <span>". $dienst->shortname ."</span>
                        </button>
                    </a>
                </div>
            </div>";
        }

无需提供 key $counter++,您只需使用$htmlObject[]

更新2

您并没有真正从数据库获取数据。

$diensten = $db->GetAllDiensten()->where('parentcategory_id', '=', $id)->get();

使用get()获取行并存储在$diensten

更新3

 $diensten = diensten::where('parentcategory_id', '=', $id)->get();

在 Controller 中添加 App/diensten 并直接使用模型。它应该会给你想要的结果。

关于javascript - 返回到 ajaxrequest 的 PHP 对象有 boolean == true 而不是 data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49534100/

相关文章:

javascript - 使用 jquery 将 div 类定位在另一个 div 旁边

javascript - 通过 jquery corrupt carousel 添加 css 样式

javascript - 如何设计放大的ajax弹出窗口的样式

php - 如何在不提交的情况下上传和阅读文本/csv 文件?

php - Apache 显示默认测试站点而不是 index.php 它被指示显示

javascript - Ajax 无法在 Codeigniter 3 中工作

Javascript:向表的 "select"行添加功能,使用参数调用事件监听器

javascript - 使带有文本的 div 从左到右滚动,而不是从上到下滚动。

php - 更新查询几乎有 10 次失败

javascript - jQuery 在使用 ajax 验证后提交表单