ajax请求后php函数未接收变量

ajax请求后php函数未接收变量,php,jquery,ajax,Php,Jquery,Ajax,我正在开发一个搜索程序,我制作了一个函数,可以从数据库中获取数据,将每个广告保存在一个变量中,并将分页(来自另一个函数)保存在另一个变量中,这样它们就可以在数组中返回,以便稍后在html中打印 它的工作原理是这样的:点击“购买”或“租赁”按钮,进入搜索页面(/search?do?=buy/rent),然后选择房产类型(可选城市/区域)并点击搜索。Ajax通过post(到search.php,同一个文件)发送数据,隐藏第一个容器并显示第二个容器,该容器具有属性列表,页面末尾带有分页 以下是隐藏/显

我正在开发一个搜索程序,我制作了一个函数,可以从数据库中获取数据,将每个广告保存在一个变量中,并将分页(来自另一个函数)保存在另一个变量中,这样它们就可以在数组中返回,以便稍后在html中打印

它的工作原理是这样的:点击“购买”或“租赁”按钮,进入搜索页面(/search?do?=buy/rent),然后选择房产类型(可选城市/区域)并点击搜索。Ajax通过post(到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);
}
这是通过post发送复选框值的AJAX脚本(它工作不正常,我在
$prop_type
中没有得到未定义的错误(我不知道为什么??),但我在
$table2
中得到它,它在
if($prop_type='')
中:

如果我手动设置
$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();
}

如果要使用ajax导入
容器,请将读取
prop\u-type:$prop\u-type,
的行更改为
prop\u-type:prop\u-type,

您应该使用以下经过测试的工作代码:

$(document).ready(function(){
    $('.search, .pagination').click(function() { // search button and change page
        $prop_type = '';

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

        $.ajax({
            method: "POST",
            url: "go.php",
            data: { 
                'prop_type': $prop_type, 
                'city': $('select[name="city"]').val(),
                'zone': $('select[name="zone"]').val() 
            }
        }).done(function(data) {
            var _html = $.parseHTML(data);
            $('.cont-1').hide();
            $('.cont-2').show();
            $(_html).each(function(i, el) {
                if (el.className == 'results') {
                    $('.results').html($(el).html());
                };
            });
        });

        return false;
    });
});

看起来您的语法与关闭了,这是否意味着我不能将
prop\u type
发送到
search.php
并在不重新加载的情况下再次执行整个php脚本?对不起,我从来没有使用过ajax,我完全迷路了。不,这不是那个意思。我没有为您查看答案,但是从语法上看,成功调用不应该是数据对象的一部分。谢谢,您是对的。现在我得到了
$test
$pagination
未定义变量。我认为脚本是错误的,成功是在数据内部。无论如何,我不需要回调,只需执行hide/show()。我在哪里可以这样做?它仍然不起作用,可能是url问题。我有.htaccess规则重定向到index.php,我使用的是动态链接(在本例中为“/search”,但我已经尝试过了)。有什么想法吗?我得到了未定义的索引:
echo$\u POST['prop\u type']上面的代码已经过测试,并且正在运行,因此首先检查url并将其更改为
url:“http://website.com/search“,
,第二,如果您重定向到主页,您将看不到更改,因此请从htaccess停止此规则,最后请复制整个错误。您还可以在
.done(函数(数据){console.log(数据)}
console.log(数据)
查看返回php搜索文件的内容。确定url为/search。我没有警告(数据);我可以看到整个html代码,我可以看到
echo'prop type:'$_职位['prop_type']它正在工作,但只是在警报中,在页面中我仍然看到未定义的索引。。。怎么了?未定义的索引是javascript还是php错误?如果是Javascript错误,请将整个错误复制到此处,如果是php错误,则不是来自脚本,而是来自php代码中的其他内容。这是php错误:
注意:未定义索引:prop_type
。我认为问题在于数据不是以html格式打印的,jquery不是自动打印的吗?
if ($('#res_prop').is(':checked')) {
    var prop_type = $('#res_prop').val();
}
else if ($('#com_prop').is(':checked')) {
    var prop_type = $('#com_prop').val();
}
$(document).ready(function(){
    $('.search, .pagination').click(function() { // search button and change page
        $prop_type = '';

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

        $.ajax({
            method: "POST",
            url: "go.php",
            data: { 
                'prop_type': $prop_type, 
                'city': $('select[name="city"]').val(),
                'zone': $('select[name="zone"]').val() 
            }
        }).done(function(data) {
            var _html = $.parseHTML(data);
            $('.cont-1').hide();
            $('.cont-2').show();
            $(_html).each(function(i, el) {
                if (el.className == 'results') {
                    $('.results').html($(el).html());
                };
            });
        });

        return false;
    });
});