2012-01-03 15 views
1

私はheader.inc.php、実際のP​​HP Webページとfooter.inc.phpを持っています。実際のページでは、アクティビティをデータベースに記録するインクルードも使用されます。私のページは次のようになります:PHPのインクルードはAJAXリクエストで再実行されます。これは正常な動作ですか?

<?php 
    require_once 'header.inc.php'; 
    require_once 'insertSearchLog.inc.php'; 
?> 
<!--HTML and JavaScript for AJAX--> 
<?php 
    require_once 'footer.inc.php'; 
?> 

AJAXはJQueryプラグインのデータテーブルを使用して作成されます。

問題は、insertSearchLog.inc.phpが表示されたデータテーブルのすべての行に対して1回実行されるということです。これは意味をなさないものですか?ページ全体をリロードしないAJAXのポイントではありませんか? この現象を防止するにはどうすればよいですか?

Additonal comment:IE8と同じようにFireFoxの問題があるようですが、この問題は発生しません。

EDIT:

私は前のログに挿入にチェックを追加した問題を避けるために:

$searchString = $_SERVER['QUERY_STRING']; 
if (!isset($_SESSION['lastQueryString']) 
     || $searchString != $_SESSION['lastQueryString']) { 

    // insert into log snipped 

    $_SESSION['lastQueryString'] = $searchString; 
} 

しかし、これはデフォルトのFirefoxの動作であれば、私はそれが非常に不可解見つけると同じように、元の疑問は残ります。

EDIT 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テーブル要素です。問題にirrelvantでも明らかなように、要求されたよう

ヘッダーと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; 
     } 
    } 
?> 

答えて

1

これはそれが何であるかに依存しますあなたが呼び出しているPHPスクリプトがそれらの必要な行を含んでいるなら、あなたがAJAXリクエストを作成するたびに呼び出されます。

require_once命令はスクリプトレベルで動作します。スクリプトを複数回呼び出すと、require_onceは複数回呼び出されます。

ロギング機能を必要としないAJAX呼び出しを処理する別のスクリプトを作成するか、この変数の存在に基づいてスクリプトが要求するかどうかを決定する変数をAJAX呼び出しに渡します。

+0

もちろん、実際のデータは別のスクリプトで取得されるため、インクルードは正確に1回だけ実行する必要があります。それはIE8で期待通りに動作するので、私はそれがa)firefox b)jqueryまたはc)データテーブルの問題だと思っていますが、ここで何も見つからないか、Googleを使用していません。 –

+1

次に、もう少し詳しい情報を追加することをお勧めします。たとえば、Ajaxコールをどのようにして作成していますか、そこにページのリロードなどが発生している可能性があります。より多くの情報を提供すればするほど、人々があなたの質問に答えるのが簡単になります。 –

+0

私はその情報を投稿しました。 ajax呼び出しは、datatablesと呼ばれるJQueryプラグインによって行われます。 –

3

これは何を行う可能性はあなたがそうのように、ページに含める要素のみを選択しjQuery.load()を使用している、正常な動作です:あなたには何も、そのように

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

をヘッダーまたはフッターは呼び出されません。

代わりにあなたがGETリクエストを介してサーバに変数を渡すだけ変数が設定されていない場合、ヘッダーとフッターを設定することができます:あなたのAJAX要求のために、このURLを呼び出す:

'page.php?ajax=true' 

そしてパッティングあなたのAJAXと呼ばれるページのこのPHP:

+0

これが正常であれば、IE8で「期待したとおりに動く」のはなぜですか? IE8のバグ?私はまだAJAX呼び出しがPHPスクリプトを再実行する理由として戸惑っていますか?私はAJAXの要点はそれをする必要がないと思った。 –

+0

また、AJAX呼び出しは複数の行を返すことができ、インクルードは1つのAJAX要求であっても返される行が何回も呼び出されるように見えることに注意してください。また、動作はFirefox 3.6と9.0.1で同じです。 –

+0

AJAXのロードリクエストを使用するjQueryでは、タグのすべてが自動的に返されるため、以前のバージョンのIEではこれが行われず、すべてのHTMLが返されます。 –