質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.45%

  • PHP

    24620questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • jQuery

    8384questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • Ajax

    1358questions

    Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

リアルタイムチャットでの入退室の通知についての質問です

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 967
退会済みユーザー

退会済みユーザー

現在リアルタイムチャットを作成中なのですが入退室時の通知について質問させていただきます。

下のような入退室中のユーザと退室したユーザーをそれぞれデータベースに格納し、
ajaxを使い変化があった時にだけphpからレスポンスを返すような形をとっていて、
phpからレスポンスを返す際に入室中のユーザーと退室したユーザーを同時に返すようにしているのですが
javascript側で入室中のユーザーと退室中ユーザーの振り分けの方法が思いつきません。
それともphp側で入室した時には入室したユーザーだけを返し
退室した時には退室したユーザーだけを返すと言った具合にphp側で振り分ければいいでしょうか

ゲロ吐くほど意味不な感じですがわかる方お願いします

if (isset($_GET["state"])&&$_GET["state"]==="monitoring") {
  //最後に入室したユーザーのidを取得
    $sql=sprintf('SELECT m.* FROM chat_aoimembers mORDER BY m.id DESC LIMIT 1');
    $mems=mysqli_query($db,$sql)or die(mysqli_error($db));
    $mem=mysqli_fetch_assoc($mems);
    $lastmem=$mem["id"];
    $newmem=$lastmem;
  //最後にログアウトしたユーザーのidを取得
    $sql2=sprintf('SELECT o.* FROM chat_aoioutmembers o ORDER BY o.out_id DESC LIMIT 1');
    $outmems=mysqli_query($db,$sql2)or die(mysqli_error($db));
    $outmem=mysqli_fetch_assoc($outmems);
    $lastoutmem=$outmem["out_id"];
    $newoutmem=$lastoutmem;
    //変化があるまで待機
    while($newmem===$lastmem||$newoutmem===$lastoutmem){
           set_time_limit(0);
           $sql=sprintf('SELECT m.* FROM chat_aoimembers m
                            ORDER BY m.id DESC LIMIT 1');
           $mems=mysqli_query($db,$sql)or die(mysqli_error($db));
           $mem=mysqli_fetch_assoc($mems);
           $newmem=$mem["id"];

           $sql2=sprintf('SELECT o.* FROM chat_aoioutmembers o
             ORDER BY o.out_id DESC LIMIT 1');
           $outmems=mysqli_query($db,$sql2)or die(mysqli_error($db));
           $outmem=mysqli_fetch_assoc($outmems);
           $newoutmem=$outmem["out_id"];
           $i++;
           session_write_close();
           sleep(1);
   //もし変化があった場合レスポンスを返す
      if ($newmem!==$lastmem||$newoutmem!==$lastoutmem||$i===30) {
          $sql=sprintf('SELECT m.* FROM chat_aoimembers m
                        ORDER BY m.id DESC ');
          $mems=mysqli_query($db,$sql) or die(mysqli_error($db));
        while($mem=mysqli_fetch_assoc($mems)){//入室中の全ユーザーを配列に格納
               $member[]=array(
                           'postnum'=>5,
                           'membernum'=>$mem['id'],
                           'membername'=>$mem['name'],
                           'logintime'=>$mem['created']
                           );
               }

          $sql2=sprintf('SELECT o.* FROM
            chat_aoioutmembers o ORDER BY o.out_id DESC LIMIT 1');
          $outmems=mysqli_query($db,$sql2)or die(mysqli_error($db));
          $outmem=mysqli_fetch_assoc($outmems);
      //退室したユーザーを取得
          $outmember[]=array('postnum' => 6,
                                 'outnum'=>$outmem["out_id"],
                                 'outmem' =>$outmem["out_name"]
                               );
      //上で取得した入室中のユーザー($member)と退室したユーザー($outmember)を配列に格納
          $memstate[]=array('in'=>$member,
                                'out'=>$outmember);
          header(' Content-type:application/json; charset=utf-8 ' );
          header(' X-Content-Type-Option:nosniff ' );
          echo json_encode(
            $memstate,JSON_HEX_TAG | JSON_UNESCAPED_UNICODE | JSON_HEX_APOS |
            JSON_HEX_QUOT | JSON_HEX_AMP
           );
          break;
        }
      }
    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • shi_ue

    2016/03/12 16:25

    普通に文字列を変数に入れるときは、$sql="aaa" でいいですよ。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/03/12 20:20

    助言ありがとうございます

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24620questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • jQuery

    8384questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • Ajax

    1358questions

    Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。