PHP include перезапускается по запросу AJAX.Это нормальное поведение? - PullRequest
1 голос
/ 03 января 2012

У меня есть header.inc.php, настоящая веб-страница php и footer.inc.php.Фактическая страница также использует включение, которое регистрирует активность в базе данных.Упрощенная моя страница выглядит следующим образом:

<?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 эта проблема не возникает!

РЕДАКТИРОВАТЬ:

, чтобы избежать проблемы Iдобавлена ​​проверка перед вставкой в ​​журнал:

$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
            } );
        }
    } );        
} );

«результат» - это элемент таблицы 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;
        }
    }
?>

Ответы [ 2 ]

3 голосов
/ 03 января 2012

Это нормальное поведение, вы можете использовать jQuery.load (), чтобы выбрать только элемент, который вы хотите включить на страницу, например:

$(element).load('page.php div#content')

Таким образом, ничего в вашем верхнем или нижнем колонтитуле не будет вызываться.

В качестве альтернативы вы можете передать переменную на сервер с помощью запроса GET и устанавливать верхние и нижние колонтитулы только в том случае, если переменная не задана: вызов этого URL для ваших запросов AJAX:

'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');
  }
1 голос
/ 03 января 2012

Это зависит от того, что вы загружаете через AJAX, если PHP-скрипт, который вы вызываете, содержит эти требуемые строки, они будут вызываться каждый раз, когда вы делаете запрос AJAX.

Инструкция require_once работает на уровне сценария, если вы вызываете сценарий несколько раз, require_once будет вызываться несколько раз.

Создайте отдельный сценарий для обработки вызова AJAX, для которого не требуется функциональность ведения журнала, или передайте переменную в вызов AJAX, которая позволяет сценарию принять решение, требовать или нет, в зависимости от наличия этой переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...