フォロー機能を実装する方法とは?

このQ&Aのポイント
  • phpでsnsのようなフォロー機能を作りましたが、一度フォローした人は再度フォローできないようにしたいです。正しい方法を教えてください。
  • ツイッターのフォロー機能はajaxを使用しているのでしょうか?ページ移動せずにフォローの変更ができる仕組みについて教えてください。
回答を見る
  • ベストアンサー

フォロー機能

phpでsnsのようなフォロー機能を作りました。 一応フォローできるようになったのですが、 1.「一度フォーローした人はフォローできないようにする」ために サブクエリで SELECT * FROM friend WHERE follow='admin' (select * from friend where follower='sub' limit 1)//adminのフォロワーの中にsubが1つでもいれば にしたいのですが、サブクエリの方にエラーが起きてしまいます。正しい方法を教えてください。 2.ツイッターのフォロー機能ってajaxを使っているのでしょうか?ページ移動しなくても、変更できているのでそうかなと...

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

そもそも、やりたいのは、そういう「機能」を持たせたいのだから、 SELECTってのは、違和感がそうとうあります。 該当カラムを、Uniqueにするだけで、おわるのではないかと。 なので、例えば自分自身が、user_idとして、フォローする相手がfollow_idだとしたら、 UniqueIndexに、user_id + follow_idでインデックス化すれば、 1度目のインサートで、まともにエラーが出ます。 なぜなら「ユニーク」なので、同じ組み合わせは1度しか 許していないわけなので。 後は、エラーハンドリングで2度目のエラーを 「すでに登録しています」と表示する流れを ページ遷移なしの、プロトコルとして、 WSなりXHRで送り返せばいいだけです。 それで、元々の質問に答えますと、 SELECT * FROM friend WHERE follow='admin' (select * from friend where follower='sub' limit 1) 単純に書式間違いです。サブクエリの回答が入る場所がないです。 括弧を展開すると SELECT * FROM friend WHERE follow='admin' ここにselect * が展開されたら、エラーになるのは当然です。 1件でもあれば?をやりたいなら count(*または主) でlimitはいりません。 それに対して、!= 0 つまり、0件以外なら しかし、そんなことをしたら、遅くなるだけです。 friendテーブルの構造がかかれていないので、判断が難しいのですが。 可能な限り検索系を使わない事がMySQLを使う上で大事な事ですよ 検索した結果を最初から持っておくように設計しないと、 MySQLって遅くて使い物にならないですから。 ついでに、今回みたいな、文字と比較もしない! あくまでIDを持ったものとインデックスとの比較 すれば、見た目SELECTを使ってもやる前から答えが 入っているので、超高速になりますよ。 (MySQLって一度使った検索をバックグラウンドで  次来た時の為に事前に答えを求めてる特性を利用する) ------------------------------------------------------------------ 変なやり方を一つ教えますと、 JavaScriptで画面に出ないIFRAMEを1つ作成 その中で、フォローの結果などに通信する スクリプトを作成。 それを親側のJavaScriptに書き込めば AJAXなしでも、非同期通信(っぽく)できますよ。 なぜなら、別IFRAMEなので、元々今いる 場所と別の場所で通信してるので。 サンプルを貼っておきますね。 JSでインナーフレームを作り通信させる。 https://hakuhin.jp/js/iframe.html

dhtfyjh
質問者

お礼

なるほど、色々参考になりました。 ありがとうございます。

関連するQ&A

  • GROUPBY ORDER BY

    idの大きい順から並べたいのですがうまくいきません 調べて サブクエリなどを使い実行しましたがうまくいきませんでした ご教授お願いいたします ソース $sql='SELECT memberid,mailid,max(name),max(day) FROM messageall WHERE mailid=? GROUP BY memberid ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset; サブクエリでも試しましたが正直 ソースがめちゃくちゃでデータが表示されませんでした。 ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLのサブクエリ

    おせわになっております。 MySQLを愛用していますが、気になる疑問にぶつかりましたので、質問させてください。 ★MySQLの4.1系のサブクエリは、性能が悪いのですか? たとえば select * from t1 where key in ( select key from t2 where key2 in ( select key2 from t3 where col = 1)) のようなことをしようとしたとき、ものすごく遅いことがあります。 あきらめて、クエリを分けて、小分けに実行すれば、速いです。 サブクエリなどを高速に実行させる方法などありますでしょうか?MySQL5では違うものなのでしょうか? よろしくお願いします

  • サブクエリ

    サブクエリで、t2テーブルに列が無いか、t2テーブルの中でuflgの値が1である列がヒットする場合に真を返すなら、 where ... and 0=(select count(*) from t2) or 0<(select count(*) from t2 where uflg=1) のようにサブクエリに2つのselectを書かないと無理ですか?

  • Access2007でSQLの複数列副問い合わせについて

    VB2005+Access2007を使用しております SQL文の複数列副問い合わせについて教えて下さい 検索をしても他のデータベースのものばかりヒットし、解決できません SELECT * FROM Uriage WHERE (Date, DateID) = (SELECT Date, DateID FROM Uriage WHERE NAME = 'cup') これを実行すると 「メイン クエリの FROM 句の予約語 EXISTS を使用しないフィールド を複数返すサブクエリを作成しました。サブクエリのSELECT ステート メントを変更し、1 つのフィールドだけを指定してください。」 というエラーがでてしまいます。 形をかえ、 SELECT * FROM Uriage WHERE Date = (SELECT Date FROM UriageList WHERE NAME = 'cup') AND DateID =(SELECT DateID FROM UriageList WHERE NAME = 'cup') これを実行すると、 「このサブクエリでは 1 つのレコードしか返せません。」 というエラーがでてしまいます。 また、 SELECT * FROM Uriage WHERE (Date) IN (SELECT Date FROM UriageList WHERE NAME = 'cup') AND (DateID) IN (SELECT DateID FROM UriageList WHERE NAME = 'cup') を実行したところ、 エラーはでないものの、抽出結果が異なるものが出てきてしまいました。 これを解決するにはどのようにしたらよいのでしょうか? よろしくお願いいたします。 なお、某知恵袋にも同様の質問をしてしまいましたが、 回答者様への回答や追加質問が出来ず、 こちらに再質問させて頂きました。申し訳ございません。

  • ERROR 1054 (42S22) 原因不明です

    idはintでプライマリー a5はchar(10)で日本語文字列を格納 データを取得しようとすると#1054エラーがでます。 admin-------- SELECT * FROM `aaa` WHERE `a5`=`あいうえおかき` #1054 - Unknown column 'ã moniter-------- mysql> SELECT * FROM `aaa` WHERE `a5`=`あいうえおかき`; ERROR 1054 (42S22): Unknown column '縺ゅ>縺・∴縺翫°縺・ in 'where clause' `あいうえおかき`の日本語に問題があると思い半角データを1行だけ更新しました。 admin-------- SELECT * FROM `aaa` WHERE `a5`=`abcde` #1054 - Unknown column 'abcde' in 'where clause' moniter-------- mysql> SELECT * FROM `aaa` WHERE `a5`=`abcde`; ERROR 1054 (42S22): Unknown column 'abcde' in 'where clause' admin-------- moniter-------- SELECT * FROM `aaa` WHERE `a5` SELECT `a5` FROM `aaa` WHERE 1 SELECT * FROM `aaa` WHERE `id`=89584 成功

    • ベストアンサー
    • MySQL
  • サブクエリの複数項目

    いつもお世話になっております。 サブクエリで複数項目を取得する方法をご教授下さい。 [既存] select 商品, 価格, (select user_id from user_master where user_id = 1 ) from products where 商品ID = 1 上記のようなSQLがあり、 user_masterから取得する項目をもうひとつ追加したいと思っています。(user_name) select 商品, 価格, (select user_id, user_name from user_master where user_id = 1 ) as user from products where 商品ID = 1 と修正したいのですが、当然エラーになってしまいます。 この場合は別にサブクエリを指定して取得した方がいいのでしょうか。 宜しくお願い致します。

  • Javascript+PHPでのデータの受け渡し

    はじめまして。PHP+MYSQLについては、まだ知識があるものの、Javascriptについては 初心者で知識不足の者です。 twitterのフォローのようなプログラムをphp+mysqlで作成したのですが これをJavascriptを使用して、ユーザーには画面をまたがずに 「フォローする」⇒「フォローしました」 とさせたいのですが、どうすればよいか行き詰ってしまいました。 ちなみに、php+mysqlのみでは現在下記のとおりになっています。 ■フォロー登録画面  <form name="register" action="adduser.php" method="post">  <input name="account_id" type="hidden" value="<?= $_SESSION['users_id'] ?>">  <input name="follow_id" type="hidden" value="<?php varout($users['users_id']) ?>">  <input name="subtitle" type="hidden" value="$subtitle">  <input type="submit" value="フォローする"> ■mysqlへinsertする画面(adduser.php) $query = "INSERT INTO watchuser SET user_from=?,user_to=?,created_at=NOW()"; execQuery($db, $query, array($account_id, $follow_id)); javascriptで制御する為に フォロー登録画面を下記にように変更し、 <a href="javascript:follow('<?php varout($users['users_id']) ?>');" class="btnBlue" title="フォローする">フォローする</a> javascript内に、下記のように記述しているのですが 動作せずに困っております。 どなたかお詳しい方、ご連絡いただけますと幸いです。 ※【補足】jqueryは、jquery-1.7.1.min.jsを読み込んでいます function follow(account) { var url ='/adduser.php'; var data = 'account=' + account; var btn = $('follow_btn'); var follower_num = $('follow_id'); if (follower_num != null) { var follower_num_value = parseInt(follower_num.innerHTML); } new Ajax.Request(url, { method: 'post', parameters: data, onLoading: function() { btn.innerHTML = '<img src="/images/loading.gif" />'; }, onComplete: function(httpObj) { if (httpObj.status == '200') { btn.innerHTML = '<span class="btnRed">フォローしました!</span>'; if (follower_num != null) { follower_num.innerHTML = follower_num_value + 1; } } else { var res = httpObj.responseText; if (res) { btn.innerHTML = '<span class="error">' + res + '</div>'; } else { btn.innerHTML = '<span class="error">エラー</div>'; } } } }); }

  • サブクエリ 述語のTrue/False

    こんにちは。 サブクエリの勉強をしています。下のURLのサイトを見ていますがわからないことがあります。 http://www.techscore.com/tech/sql/SQL7/07_02.html/#sql76 EXISTS, ANY, ALL はサブクエリが返す値に対して、「TRUE」または「FALSE」の評価を行い、メインクエリの WHERE 句で使用されます。っとあります。 /* EXISTS */ SELECT * FROM 商品表 WHERE EXISTS (SELECT * FROM 商品表 WHERE 商品名 = 'BEER'); 上記のSQLが走り、サブクエリの商品表の中にある、商品名がBEERのモノを抽出しなさいというのは理解できます。理解できないのは、「TRUE」、「FALSE」です。これは1行でも結果が帰ってきたら、それはTRUEとみなされて、EXISITSはサブクエリをTRUEと評価するということでしょうか? つまり、どんな述語でもサブクエリで評価された結果が1行でもあれば、それはTRUEという意味になるのでしょうか?いまいち何がTRUEでFALSEなのかがわかりません・・・宜しくお願いします。

  • あいまい検索の仕方で・・・

    SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '胡瓜') AND 売上品 IN ('竹輪','胡瓜') とサブクエリで出したいものが出ますが・・・あいまい検索にしたいと思っています。 SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 like '%竹輪%') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 like '%胡瓜%') AND 売上品 IN ('竹輪','胡瓜') まではわかるのですが売上品 IN ('竹輪','胡瓜')はどうすればよいのでしょうか?

  • あるサイトの相関サブクエリの説明について

    いつもお世話になります。 相関サブクエリについて、教えて頂きたいことがあります。 以下のサイトに相関サブクエリについての説明がされています。 http://gihyo.jp/dev/serial/01/sql_academy2/000902 このサイトによると、 ----------------------------------------------------------------- 「行われている動作 リスト2の2つ目のSELECT文においても,最初に評価,実行されるのがサブクエリであるという点は変わりません。・・・」 ※リスト2  相関サブクエリ(性別による集合カット) SELECT * FROM Employees E1 WHERE age = (SELECT MAX(age) FROM Employees E2 WHERE E1.sex = E2.sex); ----------------------------------------------------------------- と説明があります。 理解できないのが、「最初に評価,実行されるのがサブクエリ」という内容です。 私の理解では、相関サブクエリは、内側のクエリが外側のクエリを参照するクエリのことで、まず外側のクエリが実行される。 その後、その結果の各レコードに対してサブクエリを実行していく、というように理解しています。 しかし、上記サイトでは先にサブクエリが実行されるという説明がされており、ちょっと混乱しています。 相関サブクエリは正しくはどういう挙動をするものなのでしょうか、また正しい説明がされているサイトなども教えて頂けないでしょうか。 宜しくお願いします。

専門家に質問してみよう