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