0

次のコードの「ビット」は、メッセージとそのタイムスタンプを表示する単純なテーブルを含む標準の 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>
4

0 に答える 0