私はheader.inc.php、実際のPHP 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回だけ実行する必要があります。それはIE8で期待通りに動作するので、私はそれがa)firefox b)jqueryまたはc)データテーブルの問題だと思っていますが、ここで何も見つからないか、Googleを使用していません。 –
次に、もう少し詳しい情報を追加することをお勧めします。たとえば、Ajaxコールをどのようにして作成していますか、そこにページのリロードなどが発生している可能性があります。より多くの情報を提供すればするほど、人々があなたの質問に答えるのが簡単になります。 –
私はその情報を投稿しました。 ajax呼び出しは、datatablesと呼ばれるJQueryプラグインによって行われます。 –