ajax请求后php函数未收到变量 - php

我正在开发一个搜索器,并制作了一个函数,该函数可从db获取数据,将每个广告保存在一个变量中,并将分页(通过另一个函数)保存在另一个变量中,因此可以将它们返回到数组中以打印到稍后的HTML。

它的工作原理是这样的:您按下“购买”或“出租”按钮,然后转到搜索页面(/ search?do?= buy / rent),然后必须选择属性类型,还可以选择城市/区域并点击搜索。 Ajax通过发布(到同一文件search.php)发送数据,隐藏第一个容器,并显示第二个容器,该容器在页面末尾具有分页的属性列表。

这些是主要变量和用于隐藏/显示容器的脚本:

$mode           = filter_input(INPUT_GET, 'do', FILTER_SANITIZE_STRING); // buy or rent
$prop_type      = filter_input(INPUT_POST, 'prop_type', FILTER_SANITIZE_STRING); // res or com AJAX
$city           = filter_input(INPUT_POST, 'city', FILTER_SANITIZE_NUMBER_INT); // AJAX
$zone           = filter_input(INPUT_POST, 'zone', FILTER_SANITIZE_NUMBER_INT); // AJAX
$page_number    = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT);

if (isset($page_number) && $page_number >= 1) {
    $cont1 = 'display: none;';
    $cont2 = NULL;
    // need a way to get the prop_type (the checked checkbox before changing the page) without using $_GET.
} else {
    $cont1 = NULL;
    $cont2 = 'display: none;';
}

这是功能:

function get_prop_data($prop_type, $city, $zone, $page_number, $table, $targetpage) {

    if ($prop_type == 'res') {
        $table2 = 'res_prop';
    } else if ($prop_type == 'com') {
        $table2 = 'com_prop';
    }

    if ($city != 0) {
        $optional_cond = ' WHERE t2.city = ' . $city;
        $optional_cond2 = NULL;

        if ($zone != 0) {
            $optional_cond2 = ' AND t2.zone = ' . $zone;
        }
    } else $optional_cond = $optional_cond2 = NULL;

    $mysqli = new mysqli('127.0.0.1', 'db', '123456', 'name');

    // pagination
    if ($stmt = $mysqli->prepare('SELECT COUNT(id) FROM ' . $table)) {
        $stmt->execute();

        $stmt->bind_result($totalitems);

        $stmt->fetch();

        if (!isset($page)) {
            $page = (int)$page_number <= 0 ? 1 : (int)$page_number;
        }

        $limit = 4;

        if ($page > ceil($totalitems / $limit)) {
            $page = ceil($totalitems / $limit);
        }

        $start = ($page - 1) * $limit;

        $stmt->close();

        if ($stmt = $mysqli->prepare(' SELECT t1.id, t2.*
                                       FROM ' . $table . ' t1
                                       INNER JOIN ' . $table2 . ' t2 ON t2.id = t1.id
                                       ' . $optional_cond . $optional_cond2 . '
                                       LIMIT ?, ?')) {
            $stmt->bind_param('ii', $start, $limit);
            $stmt->execute();

            $stmt->bind_result($id, $id, $type, $status, $bhk, $baths, $area1, $area2, $age, $description, $price, $city, $zone, $img1, $img2, $img3, $img4);
            $test = "";
            while ($row = $stmt->fetch()) {
                if ($status === 0) {
                    $possesion = 'En construcción';
                } else if ($status === 1 || $status === 2) {
                    $possesion = 'Inmediata';
                } else $possesion = 'Desconocida';
                if ($prop_type == 'res') {
                    $is_res = '<p><span class="bath">Bed</span>: <span class="two">' . $bhk . ' BHK</span></p>
                            <p><span class="bath1">Baths</span>: <span class="two">' . $baths . '</span></p>';
                } else $is_res = NULL;
                $test .= '<div class="box-col">
                        <div class="col-sm-6 left-side ">
                            <a href="/single?id=' . $id . '"> <img class="img-responsive" src="' . $img1 . '" alt=""></a>
                        </div>
                        <div class="col-sm-6 middle-side">
                            <h4>Disponibilidad: ' . $possesion . '</h4>
                            ' . $is_res . '
                            <p><span class="bath2">Built-up Area</span>: <span class="two">' . $area1 . ' m²</span></p>
                            <p><span class="bath3">Plot Area</span>: <span class="two">' . $area2 . ' m²</span></p>
                            <p><span class="bath4">Age of property</span>: <span class="two">' . $age . ' Year(s)</span></p>
                            <p><span class="bath5">Price</span>: <span class="two">' . $price . ' €</span></p>
                            <div class="right-side">
                                <a href="/contact" class="hvr-sweep-to-right more">Contact Builder</a>
                            </div>
                        </div>
                        <div class="clearfix"> </div>
                    </div>
';
                $pagination = functions::getPaginationString($page, $totalitems, $limit, $adjacents = 1, $targetpage, $pagestring = "&page=");
            }
        } //else echo "Statement failed: " . $mysqli->error . "<br>";
    } //else echo "Statement failed: " . $mysqli->error . "<br>";

    return array($test, $pagination);
}

这是主要代码:

if (empty($_GET)) {
    echo 'under construction';
}
else if (isset($mode) && $mode == 'buy') {
    $table = 'to_sell';
    $targetpage = '/search?do=buy';;

    if (isset($prop_type)) {
        $data = get_prop_data($prop_type, $city, $zone, $page_number, $table, $targetpage);
        $test = $data[0];
        $pagination = $data[1];
    }
}
else if (isset($mode) && $mode == 'rent') {
    $table = 'to_rent';
    $targetpage = '/search?do=rent';;

    if (isset($prop_type)) {
        $data = get_prop_data($prop_type, $city, $zone, $page_number, $table, $targetpage);
        $test = $data[0];
        $pagination = $data[1];
    }
}
else {
    echo 'invalid url';
}

这是AJAX脚本,它通过post发送复选框值(它无法正常工作,我在$prop_type中没有得到未定义的错误(我不知道为什么?),但是我在$table2中得到了它,它位于if ($prop_type == '')内):

$('.search, .pagination').click(function() { // search button and change page

    if ($('#res_prop').is(':checked')) {
        $prop_type = $('#res_prop').val();
    }
    else if ($('#com_prop').is(':checked')) {
        $prop_type = $('#com_prop').val();
    }

    $.post('search.php', { // same file, maybe self
        prop_type: $prop_type,
        city: $('select[name=city]').val(), // optional
        zone: $('select[name=zone]').val(), // option value="0" by default
        success: function(){
            $('.cont-1').hide();
            $('.cont-2').show();
        }
    });

});

如果我手动设置$prop_type = 'res';,则效果很好。有任何想法吗?

另一个问题是分页按钮链接不起作用,它仅触发ajax脚本(它们需要发送数据,否则脚本将在更改页面时重新启动)。

我真的很感谢对脚本的任何优化。谢谢。

参考方案

您在这里混合使用javascript和php。

在PHP中,您使用$ varname声明了一个变量,在Javascript中,$表示jQuery运算符。因此,您说$ prop_type的代码完全无效,因为这是JavaScript代码。您要告诉jQuery执行一些不存在的称为prop_type的功能,因此,您会得到一个错误,即未定义。

if ($('#res_prop').is(':checked')) {
    var prop_type = $('#res_prop').val();
}
else if ($('#com_prop').is(':checked')) {
    var prop_type = $('#com_prop').val();
}

并将读取prop_type: $prop_type,的行更改为prop_type: prop_type,

故障排除“警告:session_start():无法发送会话高速缓存限制器-标头已发送” - php

我收到警告:session_start()[function.session-start]:无法发送会话缓存限制器-标头已发送(错误输出开始如果我将表单数据提交到其他文件进行处理,则可以正常工作。但是,如果我将表单数据提交到同一页面,则会出现此错误。请建议<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0…

使用PHP包含时的淡入淡出过渡 - php

我正在尝试使用jQuery或CSS(或其他方式!)在DIV中包含的php页面上创建淡入淡出或滑动过渡。我四处搜寻,发现了很多淡入淡出过渡的示例,这些实例彼此淡入淡出div或隐藏内容淡入淡出,但是这种情况略有不同。我有一个DIV,其内容由导航栏控制。选中后,每个页面都可以使用PHP成功地包含在div中,但我想使内容淡入和淡出。关于如何在页面更改之间进行漂亮过渡…

AJAX调用只能与$(document).on('click')一起使用 - php

我有一个显示数据库条目的表。用户能够为每一行打开一个弹出菜单。选项之一是删除数据库条目,并且该表应通过AJAX调用相应地刷新。只要有人单击#delete-toggle中的table-popup,我就会在HTML页面上进行AJAX调用(table-popup是div,当有人单击每行中存在的表中的table-edit-button时出现的表): <div …

将输入类型复选框关联到输入类型文本 - php

我有一个问题,我需要将输入类型复选框与输入类型文本关联。情况如下:从数据库中提取数据。 PK数据是复选框的值。当复选框选择输入类型的文本时,您可以在其中输入特定数字。现在的问题是,选中所有类型的复选框输入文本都会被激活。我希望通过选择复选框输入,仅启用与复选框相关联的输入。我的HTML代码(此代码创建一个输入复选框,并为数据库中的每个记录输入文本,而我要激活…

jQuery显示基于序列化哈希的隐藏选择菜单 - php

我试图通过使用Ajax和序列化的哈希值来使选择菜单显示隐藏。昨晚我有这个系统,但是我将#selector从表单更改为div,突然停止了运行。我不得不扩展表单以获取更多附加数据,并且不想为此立即序列化所有数据,因为这将给系统带来额外压力。该页面按预期工作。它显示了第一个选择,允许我选择一个选项,我可以看到AJAX发布,但是哈希值是空的,我相信这会破坏上面的PH…