我有一个header.inc.php、实际的php网页和一个footer.inc.php。实际的页面还使用一个将活动记录到数据库的include。所以简化了我的页面如下:
<?php
require_once 'header.inc.php';
require_once 'insertSearchLog.inc.php';
?>
<!--HTML and JavaScript for AJAX-->
<?php
require_once 'footer.inc.php';
?>
AJAX是使用JQuery和JQuery插件数据表完成的。
问题是对于显示的数据表中的每一行都执行一次include-insertSearchLog.inc.php,这对我来说毫无意义?AJAX的目的不是不重新加载整个页面吗?如何防止这种行为?
附加评论:似乎是FireFox的问题,因为IE8没有出现这个问题!
编辑:
为了避免这个问题,我在插入日志之前添加了一个检查:
$searchString = $_SERVER['QUERY_STRING'];
if (!isset($_SESSION['lastQueryString'])
|| $searchString != $_SESSION['lastQueryString']) {
// insert into log snipped
$_SESSION['lastQueryString'] = $searchString;
}
但最初的问题仍然存在,因为如果这是默认的firefox行为,我会感到非常困惑。
编辑2:部分(为了简洁)JS代码:
$(document).ready(function() {
// ..snipped unrelated content
$('#result').dataTable( { // initialize datatables plugin
"bProcessing": true,
"bServerSide": true,
// ... snipped further initialization parameters of datatables
"fnServerData": function ( sSource, aoData, fnCallback ) {
// ...snipped setting GET parameters for AJAX request
$.ajax( {
"dataType": 'json',
"type": "GET",
"url": sSource,
"data": aoData,
"success": fnCallback
} );
}
} );
} );
"result"是一个HTML表元素,数据将在其中显示。
header和footer.inc.php的请求,所以很明显它对问题是不可修复的:
<!-- start header.inc.php-->
<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../sharedRessources/css/main.css" type="text/css" rel="stylesheet" media="all">
<link href="../sharedRessources/css/datatables/demo_table.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="../sharedRessources/js/jquery-1.6.2.js"></script>
<script type="text/javascript" src="../sharedRessources/js/jquery.dataTables.min.js"></script>
<title>myApp</title>
</head>
<body>
<div id="wrapper">
<div id="head">
<h2>myApp</h2>
<hr>
</div>
<div id="columns">
<!-- end header.inc.php-->
<!--page content-->
<!-- start footer.inc.php-->
<?php
if (!empty($_SESSION['Message'])) {
echo '<div class="message">' . $_SESSION['Message'] . '</div>';
unset($_SESSION['Message']);
}
if (!empty($_SESSION['Error'])) {
echo '<div class="error">' . $_SESSION['Error'] . '</div>';
unset($_SESSION['Error']);
}
?>
</div>
<div id="foot">
<hr>
<small>Copyright 2011</small>
</div>
</div>
</body>
</html>
<!-- end footer.inc.php-->
insertSearchlog.inc.php:
<?php
if (isset($_GET)) {
$searchString = $_SERVER['QUERY_STRING'];
if (!isset($_SESSION['lastQueryString'])
|| $searchString != $_SESSION['lastQueryString']) {
$conn = getDatabaseConnection();
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$sqlLog = "INSERT INTO log_table (user_id,search_string) VALUES(:userId,:searchString)";
$preparedStatement = oci_parse($conn, $sqlLog);
oci_bind_by_name($preparedStatement, ':userId', $_SESSION['login']);
oci_bind_by_name($preparedStatement, ':searchString', $searchString);
oci_execute($preparedStatement);
oci_free_statement($preparedStatement);
oci_close($conn);
$_SESSION['lastQueryString'] = $searchString;
}
}
?>
这是正常的行为,您可以使用jQuery.load()只选择要包含在页面上的元素,如下所示:
$(element).load('page.php div#content')
这样,就不会调用页眉或页脚中的任何内容
或者,您可以通过GET请求将变量传递给服务器,并且仅在未设置变量时设置页眉和页脚:为AJAX请求调用此URL:
'page.php?ajax=true'
然后把这个PHP放在AJAX中,称为页面:
<?php
if (!isset($_GET['ajax']) {
require_once('header.inc.php');
require_once('insertSearchLog.inc.php');
}
// HTML etc...
if (!isset($_GET['ajax']) {
require_once('footer.inc.php');
}
这取决于您通过AJAX加载的内容,如果您调用的PHP脚本包含这些require行,那么每次发出AJAX请求时都会调用它们。
require_once指令在脚本级别工作,如果多次调用脚本,则require_once将被多次调用。
创建一个单独的脚本来处理不需要日志记录功能的AJAX调用,或者向AJAX调用传递一个变量,该变量允许脚本根据该变量的存在来决定是否需要。