次のコードの「ビット」は、メッセージとそのタイムスタンプを表示する単純なテーブルを含む標準の html ページを作成します (これはより適切に表示される可能性がありますが、気にしないでください。
PHP は最初にすべてのメッセージを取得します (提供されている場合は、特定の更新されたタイムスタンプ以降)。PDO を使用してレコードを取得します (DB の抽象化のため)。タイムスタンプが提供されている場合、コンテンツを json にエンコードし、それを返し、終了します (ああ、殺人のセマンティクスです)。そうでない場合は続行し、すべてのレコードがテーブルに表示される完全な html ページと、ボタンを押すと、タイムスタンプを使用して同じ PHP スクリプトを呼び出し、それ以降に更新されたメッセージを取得するボタンを返します。その間、関連する表の行のセルを更新します。
基本的ですが、これは非常にうまく機能すると思います。それはjQueryをうまく使って相対的な更新を更新します.table_update関数が2秒ごとに呼び出されるか、時間が指数関数的に増加する小さなhtmlチャットでは、非常によく似たものがうまく機能すると思います。
質問: これをさらに改善できる優れたコーディング方法はありますか?
たとえば、TR に任意の id を与えるのは良い考えかどうか疑問に思います。PDO コード ブロックは少し複雑で、通常はエラー後のモーテム処理、セキュリティ チェックの失敗、または偽のスクリプトが含まれています。
以前はこれを行っていて、現在はより良いアプローチを使用している優れた開発者はいますか?
フレームワークは必要ありません。たとえば、比較的単純なものが必要です。フラッシュページ。
<?php
$sql = 'SELECT id, message, timestamp
FROM messages
WHERE id_user = :id_user';
if(isset($_REQUEST["timestamp"]))
{
$sql .= ' && timestamp >= :timestamp';
}
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':id_user' => $id_user, ':timestamp' => $_REQUEST["timestamp"]));
$data = $sth->fetchAll();
if(isset($_REQUEST["timestamp"]))
{
echo json_encode($data);
die();
}
?>
<html>
<head>...</head>
<body>
<input id='button_check' value='Update this table' type='button' />
<table id="table_check">
<tr>
<th>Message</th>
<th>Time</th>
</tr>
<?php foreach($data as $record) { ?>
<tr id="tr_<?php echo $record["id"] ?>">
<td><?php echo $record["strNumber"] ?></td>
<td><?php echo $record["strFullName"] ?></td>
</tr>
<?php } ?>
</table>
<script type="text/javascript">
var intLastUpdate = <?php echo time() ?>;
$(document).ready(function() {
$('#button_check').click(update_table());
});
function update_table()
{
$.getJSON("this_page.php?timestamp=" + intLastUpdate, function(data) {
$.each(data, function(index, record) {
$('#tr_' + record.id).find("td").eq(0).html(record.message);
$('#tr_' + record.timestamp).find("td").eq(1).html(record.timestamp);
if(intLastUpdate < record.timestamp) {
intLastUpdate = record.timestamp;
}
});
});
}
</script>
<body>
</html>