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

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

新規登録して質問してみよう
ただいま回答率
85.35%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

860閲覧

WordPressで同一ユーザーの連続検索を防ぐ方法

moomoom

総合スコア19

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/11/18 02:27

編集2020/11/18 02:28

###前提と質問

・サイト内でAPI検索結果を表示します。
・API使用先に迷惑がかからないよう連続の実行を防ぎたいと考えています。
・WordPressです。

何かいい方法ありませんでしょうか?

###条件
検索はAJAXで実行され、ログインユーザー、非ログインユーザーのいずれもが可能なので、以下のようにwp_ajaxwp_ajax_noprivも使っています。

php

1add_action( 'wp_ajax_nopriv_my_ajax_search_api', 'my_ajax_search_api' ); 2add_action( 'wp_ajax_my_ajax_search_api', 'my_ajax_search_api' ); 3function my_ajax_search_api(){ 4 // apiを使った検索結果を返す 5}

###草案
これに際して私が思いついたのは、いずれのユーザーにも発行されるナンスを使う方法で、次の流れです。

①サイト訪問時にユーザーにナンス発行

②ユーザーが検索を実行

③独自テーブルにナンスと実行時間を保存

④そのナンスの実行時間が1秒以内なら処理停止、1秒以上なら検索開始

⑤結果をJSへechoする

しかしこの方法ですと、③のためにわざわざ独自テーブルを作らないといけない点でなんとなくしっくりきません。

または③を独自テーブルでなくfile_put_contentsとする案も考えましたが、やはり…どうなのでしょうか。

もっと便利な、ないし適切な方法があるのではと思い、有識者さまのご意見を求めています。

アドバイス宜しくお願い致します。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

$_SESSIONに入れとけば良いのでは?

投稿2020/11/18 02:35

KazuhiroHatano

総合スコア7819

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moomoom

2020/11/18 02:52

ご回答ありがとうございます。 当方$_SESSIONの使用経験がないのですが、ざっとでかまいませんのでどこにどう描くイメージか、教えていただけませんでしょうか。 下記リンクによりますと、 https://qiita.com/Kazuya_Murakami/items/147831676ac58e3d9262 $token = md5( uniqid( rand(), true ) ); の部分を $token = time(); とすると、時間が$_SESSIONに入ることになり、 if ( $_SESSION[ 'token' ] === $_POST[ 'token' ] ) の部分を if ( $_SESSION[ 'token' ] > time() + 1 ) として、1秒以上の場合だけ実行されるという条件が実現できる。 この流れであっていますか? 間違い、不足、注意などございましたらご指摘いただけましたら幸いです。 たびたび申し訳ございませんが、引き続き宜しくお願い致します。
KazuhiroHatano

2020/11/18 03:14

> $token = md5( uniqid( rand(), true ) ); の部分を > $token = time(); > とすると、時間が$_SESSIONに入ることになり、 その辺は$_SESSIONと関係ないです $_SESSIONは同一の接続のプロセス間で 共有されるただの連想配列のようなものです session_start();したら$_SESSIONが使えるようになり $_SESSIONに入れた値はおよそ20分(サーバーの環境設定による) 同一ユーザーによる接続中保持されます 値の入出力に特別な手順は必要ありません 普通の連想配列と同様にすれば良いです ただし$_SESSIONは他のプログラムも利用しているかもしれないので キー値は他と被らないように汎用的な名前を避ける方が良いです
moomoom

2020/11/18 03:21

【問1】 > その辺は$_SESSIONと関係ないです すみません、書き足りなかったかもしれません。リンク先は $token = md5( uniqid( rand(), true ) ); の後に $_SESSION[ 'token' ] = $token; としています。 これを読んで $token = time(); $_SESSION[ 'token' ] = $token; とすれば > 時間が$_SESSIONに入ることになり、 となるだろうと考えたのです。 これはあっていますよね? 【問2】 > キー値は他と被らないように汎用的な名前を避ける方が良いです tokenは汎用的すぎますから「my_api_time」とかがいいということですね? 【問3】 先ほどのコメントの書き方で、間違い、不足、注意などはなさそうでしょうか? 以上【3つ】で大変申し訳ございませんが、どうぞ宜しくお願い致します。
KazuhiroHatano

2020/11/18 03:31

おおよそあってます ajaxのコールバック内でsession_start()する分には大丈夫かと思いますが 参考ページにあるようにWordPressはsession_start()するのは早いと怒られます あとはsession_regenerate_idをどうするか・・・ たまにsession_idをキーにしてデータベースに値を入れてるような奴がいるので WordPressはあんまり安易にsession_regenerate_idできないんですよね… そういう変な奴がいないならsession_regenerate_idも最後にしておく方向で
moomoom

2020/11/18 03:37

session_regenerate_idなど知りませんでした。そういった新たな知見も授けてくださる点にも改めて感謝です。ご返信ありがとうございます。いただいたワードをもとにさらに調べを進めてまいります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問