PHP include在AJAX请求上重新运行.这是正常行为吗


PHP include is re-run on AJAX Request. Is this normal behavior?

我有一个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调用传递一个变量,该变量允许脚本根据该变量的存在来决定是否需要。