- ベストアンサー
WordPress質問:不正なトークンのエラーを解決する方法
- WordPressの質問(q10145776)の続 不正なトークンと表示されるため、single-regist.phpから下記のコードを削除したのですが、そちらは問題ないでしょうか? 送信時にトークンが必要だと思いますので、登録結果画面には必要ないのではないかと考えております。
- 確認画面でデータが安全であることが確認された上で$_SESSIONを経由して画面遷移するが、登録結果画面へは不正アクセスできるから必須
- if (empty($_SESSION['token']) || empty($_POST['token']) || $_SESSION['token'] !== $_POST['token']) { exit('不正トークン'); } ※single-regist.phpの11行目からトークンのコードになります https://wandbox.org/permlink/vCbUEZFcvQf2n1DK
- みんなの回答 (33)
- 専門家の回答
質問者が選んだベストアンサー
・質問がみつかりませんと表示されています UUIDが付いてないようです。 http://www.irasuto.cfbx.jp/雑談掲示板%e3%80%80質問表示画面/ UUIDが付いてこんなURLになれば表示されます。 http://www.irasuto.cfbx.jp/雑談掲示板%e3%80%80質問表示画面/?29bbf0d7-34fd-11ee-ad27-e4434ba51b4c ・この表示画面というのは必要なのでしょうか?質問一覧画面から各リンクに飛ぶことで内容を表示させるものだと思っていたのですが… 必要だと思います。 リンクの飛び先が表示画面になると思うのですが、違うのでしょうか。 リンク先のページをどのように作るつもりでしたか。 別ページになるのでしたら必要だと思います。 それとも同じページ内で表示するつもりでしたか。 ・別途データベースにIPアドレスを保存したいと考えております テーブルにカラムを追加して保存するようにしてみてください。 ・質問を一覧表示する際に1番目のアップロード画像とメッセージの一部を並べていきたいのですが可能でしょうか? こんな感じになります。 メッセージの一部、については以前やったことがあると思いますので、$row->messageから取得するようにしてみてください。 ---- <?php /* Template Name: 質問一覧画面 */ get_header(); $sql = 'SELECT * FROM sortable'; $query = $wpdb->prepare($sql); $rows = $wpdb->get_results($query); $upload_dir = wp_upload_dir(); foreach ($rows as $row) { $url = home_url('質問表示画面?'.$row->URL); $pattern = $upload_dir['basedir'].'/attach/'.$row->ID.'_0.*'; $files = glob($pattern); if (empty($files)) { $view = '<img src="ダミー画像パス">'; } else { $info = pathinfo($files[0]); $attach_url = $upload_dir['baseurl'].'/attach/'.$info['basename']; $ext = $info['extension']; switch ($ext) { case 'jpeg': case 'png': $view = '<img style="height: 50px;" src="'.$attach_url.'">'; break; case 'mp4': $view = '<video style="height: 50px;" src="'.$attach_url.'">'; break; case 'pdf': $view = '<iframe style="height: 50px;" src="'.$attach_url.'"></iframe>'; break; default: $view = ''; break; } } echo '<div><a href="'.$url.'">'.$row->namae.'</a></div>'; echo '<div>'.$row->message.'</div>'; echo '<div>'.$view.'</div>'; } ----
その他の回答 (32)
- dell_OK
- ベストアンサー率13% (766/5720)
・UUIDからURLを生成する方法が分かりません。調べたところ何かしらのモジュールが必ず必要になりそうです。 どのモジュールを使っていくべきでしょうか? URLはこんな風になると思いますのでモジュールは不要です。 http://www.irasuto.cfbx.jp/質問表示画面/?xxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx データベースから読み込んだURLを使うだけです。 質問一覧画面と質問表示画面の固定ページを作ってみてください。 質問一覧画面 ---- <?php /* Template Name: 質問一覧画面 */ get_header(); $sql = 'SELECT * FROM sortable'; $query = $wpdb->prepare($sql); $rows = $wpdb->get_results($query); foreach ($rows as $row) { $url = home_url('質問表示画面?'.$row->URL); echo '<div><a href="'.$url.'">'.$row->namae.'</a></div>'; } ---- 質問表示画面 ---- <?php /* Template Name: 質問表示画面 */ get_header(); $url = substr($_SERVER['REQUEST_URI'], -36); $sql = 'SELECT * FROM sortable WHERE URL=%s'; $query = $wpdb->prepare($sql, $url); $rows = $wpdb->get_results($query); if (empty($rows)) { echo '質問がみつかりません'; exit; } $row = $rows[0]; echo '<p>なまえ:'.$row->namae.'</p>'; echo '<p>コメント:'.$row->message.'</p>'; ?> <a href="<?php echo home_url('質問一覧画面'); ?>">質問一覧画面へ戻る</a> ---- この仕組みでよければ、画像を表示する処理など追加してみてください。 私のサンプルサイトでお見せしかったのですが、レンタルサーバーのMySQLのバージョンが古くて uuid()関数 が使えなかったので断念しました。
お礼
こちらが最新の回答になります。申し訳ありません、質問表示画面と質問結果画面を載せ忘れておりました。 教えて頂いたコードで表示されている画面はこちらになります。 ※質問表示画面 http://www.irasuto.cfbx.jp/%e9%9b%91%e8%ab%87%e6%8e%b2%e7%a4%ba%e6%9d%bf%e3%80%80%e8%b3%aa%e5%95%8f%e8%a1%a8%e7%a4%ba%e7%94%bb%e9%9d%a2/ ※質問結果画面 http://www.irasuto.cfbx.jp/%e9%9b%91%e8%ab%87%e6%8e%b2%e7%a4%ba%e6%9d%bf%e3%80%80%e7%99%bb%e9%8c%b2%e7%b5%90%e6%9e%9c%e7%94%bb%e9%9d%a2/
補足
Q.データベースから読み込んだURLを使うだけです。 質問一覧画面と質問表示画面の固定ページを作ってみてください。 A.回答ありがとうございます、$urlでリンクにすることが出来るのですね勉強になりました。 質問表示画面を実行してみたのですが質問がみつかりませんと表示されています、この表示画面というのは必要なのでしょうか?質問一覧画面から各リンクに飛ぶことで内容を表示させるものだと思っていたのですが… 別途データベースにIPアドレスを保存したいと考えております、何か問題になった場合のリスクヘッジに IP アドレスの保存は掲示板の義務として扱われているようです。 ※参考サイト https://teratail.com/questions/msuhrhq3uyoxio https://xtech.nikkei.com/it/article/COLUMN/20070507/270104/ Q.私のサンプルサイトでお見せしかったのですが、レンタルサーバーのMySQLのバージョンが古くて uuid()関数 が使えなかったので断念しました。 A.アドバイスありがとうございます、先にどうしてもお聞きしたいことがありまして、質問を一覧表示する際に1番目のアップロード画像とメッセージの一部を並べていきたいのですが可能でしょうか?アップロード画像がない場合はダミー画像を代用する予定です。 不可能だった場合は別途サムネイルにしたい画像を入力画面に設けることを想定しております。
- dell_OK
- ベストアンサー率13% (766/5720)
・列を削除してコードを実行してみました。テーブルのURLを確認したところ変わっていない気がするのですが問題ないでしょうか? 問題ないと思います。 試しに質問を投稿してみて、新しいデータに他とは異なるUUIDが設定されるか確認してみてください。
補足
※UUIDの確認 https://imgur.com/G2jr3Np.jpg 回答ありがとうございます、確認したところ変わっておりました。 表示画面を作成していきたいのですが、UUIDからURLを生成する方法が分かりません。調べたところ何かしらのモジュールが必ず必要になりそうです。 どのモジュールを使っていくべきでしょうか? ※参考サイト (Laravel) https://qiita.com/nitaking/items/fcc3344bb23440dde61c (javascript) https://co.bsnws.net/article/242 (Next.js) https://zenn.dev/tsucchiiinoko/articles/2b0433434485d5 (Python) https://self-development.info/python%E3%81%A7url%E3%82%BB%E3%83%BC%E3%83%95%E3%81%AAuuid%EF%BC%88%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E6%96%87%E5%AD%97%E5%88%97%EF%BC%89%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B/ 表示画面になるのですが、質問者が投稿した画像をバナー代わりに、ない場合はダミー画像を表示して並べる形で考えております。
- dell_OK
- ベストアンサー率13% (766/5720)
phpMyAdminでデフォルトを設定するのは画像のような方法なのですが、どうもこれをすると、uuid()が関数ではなく、文字列として設定されてしまうようです。 SQL文はこんな感じになってしまうので、 ---- ALTER TABLE `sortable` ADD `URL` VARCHAR(36) NOT NULL DEFAULT 'uuid()'; ---- いったん列を削除してもらって、こちらのSQL文を実行してみてください。 ---- ALTER TABLE `sortable` ADD `URL` VARCHAR(36) NOT NULL DEFAULT uuid(); ----
補足
A.回答ありがとうございます、列を削除してコードを実行してみました。テーブルのURLを確認したところ変わっていない気がするのですが問題ないでしょうか? https://imgur.com/NNIWmBD.jpg https://imgur.com/jHiDTJk.jpg https://imgur.com/d0cxxmr.jpg
- dell_OK
- ベストアンサー率13% (766/5720)
PHPで生成する必要はありません。 こうしてデフォルト値をuuid()関数に設定しいるので、 MySQLがデータ登録時に生成してくれます。 試しにこのカラムを追加して、投稿してみてください。 phpMyAdminでデータを見ればUUIDが入っているはずです。 ---- `URL` varchar(36) NOT NULL DEFAULT uuid(), ---- PHPで作成する場合はライブラリを使うか自作するかですね。 ライブラリはいろいろと手間がかかりそうなので、 自作と言うか人が作られたのを使うといいです。 https://qiita.com/gongon143/items/8916ae5c3b394c5a7ac5
補足
※現在のデータベース https://imgur.com/03zIOFF.jpg 回答ありがとうございます、データベースで設定できるんですね。 PHPの場合は他の方が作られたものを使用する覚えておきます。 質問があるのですが、DEFAULTというのは何か設定する必要があるのでしょうか? DEFAULT phpmyadminで調べてみたのですが出てこないためどこから設定するのか分かりませんでした。 UUIDは参考動画で設定してみました。 CREATE TABLE `sortable` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `TS` timestamp NOT NULL DEFAULT current_timestamp(), `message` varchar(500) NOT NULL, `namae` varchar(255) NOT NULL, `stamp` int(11) NOT NULL, `select` int(11) NOT NULL, `URL` varchar(36) NOT NULL DEFAULT uuid(), PRIMARY KEY (`ID`), UNIQUE KEY `UNIQUE_URL` (`URL`) ) ※参考動画 https://www.youtube.com/watch?v=wyKfI6SNq3w ※データベースに保存されたUUID https://imgur.com/AdDl81w.jpg
- dell_OK
- ベストアンサー率13% (766/5720)
そうですね。 アドバイスにあるようにJavaScriptでは作成しない方がいいと思います。 データベースの保存タイミングで作成するのが一般的でいいと思います。 つまりサーバーサイドです。 アドバイスの一意なIDを作る方法(1)がいいと思います。 ただし、シーケンスや自動インクリメントではセキュアにならないので、そこでUUIDを使います。 UUIDは重複する確率が極めて低いとは言え、重複しないとは言い切れません。 なので、その項目に UNIQUE KEY を指定しておきます。 すると、重複した場合は登録に失敗します。 登録に成功するまで繰り返すようにすることで解決できます。 テーブルはこんな感じになります。 追加しているのは URL のある2行です。 ---- CREATE TABLE `sortable` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `TS` timestamp NOT NULL DEFAULT current_timestamp(), `message` varchar(500) NOT NULL, `namae` varchar(255) NOT NULL, `stamp` int(11) NOT NULL, `select` int(11) NOT NULL, `URL` varchar(36) NOT NULL DEFAULT uuid(), PRIMARY KEY (`ID`), UNIQUE KEY `UNIQUE_URL` (`URL`) ) ----
補足
回答ありがとうございます、Javascriptは使わない想定をされていたのですね。 UUIDを使おうと思うのですが、PHPだとライブラリが必要でしょうか? ※参考サイト https://cufl.hateblo.jp/entry/2020/03/20/000950
- dell_OK
- ベストアンサー率13% (766/5720)
・URLをランダムで生成する方法を調べてみて実践してみます、長ければ長いほど良い気がするのですがどうでしょうか? そうですね。長ければ長いほどいいです。 そんな時に使うのがUUIDと呼ばれるものです。 これを見た途端にアタックする気がなくなるような代物です。 調べてみてください。
お礼
補足
※JavascriptでURLを生成する方法 https://mebee.info/2022/11/05/post-84690/ https://k-sugi.sakura.ne.jp/javascript/5355/ 回答ありがとうございます、別途アドバイスを頂いたのですがdell_okさんの意見をお聞きしたいです。 Javascriptで同じURLか判定するのが困難ということだと思うのですが、こちらは対策出来るのではないかと考えております。どちらを選択すべきでしょうか? ※アドバイス頂いたもの JavascriptでIDを生成する場合、「そのIDが一意である」ことを保証するのが困難です。 ランダムだろうと連番だろうと関係ありません。 一意なIDの作り方には、主に次の2つがあります。 (1) データベースシステムが持つ仕組みを利用する(シーケンス、自動インクリメント等) (2) IDを生成→既存のデータと比較 → 存在しなければ採用、存在していたら生成からやりなおし どちらの場合でも「処理の間、他の邪魔が入らない」ことが重要です。 (1)の方はシステムで保証されています。 (2)の方ですが、例えば ブラウザ1でID=1を確認;存在しない ブラウザ2でID=1を確認;この時点ではブラウザ1で採用されていないので「存在しない」 ブラウザ1でID=1を採用 ブラウザ2でID=1を採用;確認時点では存在していなかった ということが発生する可能性があります。 また ブラウザ1でID=1を生成 ブラウザ2でも新規でID=1を生成→ ブラウザ2で確認→採用 ブラウザ1で確認→ID=1は使われているので不採用でやりなおし ブラウザ1でやりなおしでID=2を生成 ブラウザ3でも新規でID=2を生成→ ブラウザ3で確認→採用 ブラウザ1で確認→ID=2は使われているので不採用でやりなおし ブラウザ1でやりなおしでID=3を生成 ... と無限ループになる可能性も0ではありません。 データベースシステムにはトランザクションという「他に邪魔されない」仕組みがあります。 これを使えば(2)の方法でも邪魔されないことが保証できます。 ですが、これは データベース接続→トランザクション開始→処理→トランザクション終了→データベース切断 とする必要があり、これをサーバーとブラウザという仕組みでやるのは困難です。
- dell_OK
- ベストアンサー率13% (766/5720)
・セキュアで不規則なURLとのことですが、SSL化のことでしょうか? いいえ。 例えば difff ですと、以下のようなURLが生成されます。 https://difff.jp/wj5ia.html 「wj5ia.html」これがセキュアにしたURLで、おそらくランダムなため規則はないと思います。 1桁目の「w」が何を意味し、2桁目の「j」が何を意味し、と言った規則はないと言うことです。 これを人間が見ても意味がわからないと言うことでセキュアになっている、と想像しています。 ですが、教えていただいた参考サイトにもあるように、でたらめなURLでアクセスされるリスクがないわけではありません。 もう一度 difff で生成すると以下のようなURLになりました。 https://difff.jp/t5zuk.html これを見て人間が想像できることは、「英字小文字または数字の組み合わせで5桁」という規則です。 これはとても簡単な規則なので、悪意のある人がPHPなどを用いてこの規則のURLを次々とランダムに生成してアクセスすることができます。 どんなに難しい規則にしても、アタックされなくなるわけではないので、まあこの話しはあまり重要ではありません。 このようにセキュアなつもりのURLを生成したとしてですが、そのようなURLでWordPressにアクセスしてちゃんと処理できるか、と言う問題です。 質問者さまのサイトですと、例えばこんな風になると思います。 http://www.irasuto.cfbx.jp/blog/wj5ia.html まあ末尾は .html でなくてもいいので、こうとかですね。 http://www.irasuto.cfbx.jp/blog/wj5ia 実は、そんなに大した問題でもないので対処法を説明しておきます。 そのようなディレクトリやファイルはないのでWordPressはエラーとみなすはずです。 そうすると index.php に飛ばされるはずなので、そこでこのURLを解析すればいいことになります。 試してはないので、いったんエラーとみなされた後で、正常な処理ができるかどうかはわかりませんが、少なくともこれで、データベースから質問を読み込んで表示することはできそうな気がします。 ここで重要なのは生成するURLが、実在するファイルやディレクトリまたはパラメータやクエリにならないようにすることと、他の質問のURLと重複しないようにすることです。 もしそんなことがあると、本当にアクセスしたいページにアクセスできなくなりますからね。 それだけできればひととおりのことはできそうに思います。
補足
説明ありがとうございます。なるほど総当たりで攻撃してくるという事ですね… URLをランダムで生成する方法を調べてみて実践してみます、長ければ長いほど良い気がするのですがどうでしょうか?
- dell_OK
- ベストアンサー率13% (766/5720)
・データベースを使う方法が一般的な気がするのですが、どちらが良いと思われますでしょうか? どちらでもいいと思います。 私が想像できる概要としては以下のようになります。 JavaScriptの方は生成したURLをデータベースに保存するようになるはずです。 データベースがURLを持っているのでそのまま使えて楽です。 そのままと言うのは、リンクURLにも使えるし、アクセスされたURLからその質問をデータベースから読み出すこともできる、と言うことです。 データベースに保存されているIDなどから生成する方はURLをデータベースに保存しなくていいはずです。 データベースがURLを持っていないためその都度生成処理や復号処理が必要です。 リンクURLを出力する時もですし、アクセスされたURLからIDなどへ復号(戻す)してからその質問をデータベースから読み出す必要があります。 URLをデータベースに保存してもいいとは思いますが、それならJavaScriptで生成するのと変わりありません。 何を元にURLを生成するかを考える必要があります。 IDや投稿日時は不変のものなのでURLをデータベースに保存して使うことができます。 もしユーザーごとに違うなど変動するものから生成する場合はデータベースに保存できません。 できないと言うか、しても使えない、使いづらい、ようになります。 仮に、Aさんの場合のURLは/aaaaa、Bさんの場合のURLは/bbbbb、とかになると、複数の値となるため、データベースの1レコードに保存し利用するのは困難です。 どちらにするかの前に、WordPress経由でセキュアにしたために不規則となったURLが使えるかどうかを調査した方がいいと思います。 実装したものの、使えないとなったら、意味がありません。 そのために、WordPressを断念しないといけなくなるかも知れませんし。
補足
Q.どちらにするかの前に、WordPress経由でセキュアにしたために不規則となったURLが使えるかどうかを調査した方がいいと思います。 実装したものの、使えないとなったら、意味がありません。 そのために、WordPressを断念しないといけなくなるかも知れませんし。 A.解説ありがとうございます。Javascriptの方が速度も速くコードもまとまりそうですね。セキュアで不規則なURLとのことですが、SSL化のことでしょうか?こちらは問題なく動作することを確認済みなのですが、試してみたいのですが意味をよく理解できていないためアドバイスお願い致します。
- dell_OK
- ベストアンサー率13% (766/5720)
・参考サイトのように比較するボタンを押すことで個別にURLが生成されそちらをバナー画像でまとめて一覧表示させる方法が想定しているものになります。 比較するボタンのあとで結果を公開するボタンを押したときのURLですね。 確かに、その方がURLのパラメータを変更されてアクセスされないのでいいかも知れないですね。 ただ、WordPress経由でそれができるかどうかわかりません。 ・回答者側のスペースは質問の内容を確認できる作りにしたい為に狭くなってしまうのですが、質問者側は質問をしっかり考えることができるように見やすくCSSを整えた状態で作成したいです。 なるほど、それもそうですね。
お礼
回答ありがとうございます、どうやら2パターンURLの生成方法があるようでどちらかを使用してみたいと考えております。 データベースを使う方法が一般的な気がするのですが、どちらが良いと思われますでしょうか? データベースを使う方法と回答に挙げさせていただいたURLをJavascriptで生成する方法になります。 データベースを使う方法になるのですが、 データベースの表のレコード(=行)に割り振ってある IDを取得して、それを「質問の詳細表示」の URLにクエリ等で付加することで、質問ごとに個別に割り振ることが出来るようです。 ただ一つ問題があるようで、誰でも自由に書き込めるようなモノだと、質問の連番をクエリに乗せてしまうと大変な事になるとアドバイス頂きました。 ※対策について ・質問内容や ID、日時などでハッシュを取る ・UUIDを使うなど ※参考サイト https://blog.flatt.tech/entry/url_issue_security
- dell_OK
- ベストアンサー率13% (766/5720)
・閲覧画面は今回作成した表示画面と同じものを考えております。回答画面と表示画面はイコールで考えていたのですが、そうではないのでしょうか? そうですね。 それはそれでいいのですが、私が言いたかったのは一覧画面です。 一覧画面なしでは、回答画面を表示することができません。 一覧画面にいくつか投稿が表示され、それを選んでから表示画面、回答画面、と言うことになるのではないでしょうか。 ・別の方に以前ヤフー知恵袋の回答画面にお聞きしていたことを忘れていたのですが、どうやらAjaxは使われていないようです。 そうでしたか。 それでは、同じように、入力画面と確認画面の切り替えでPOSTする方法がよさそうですね。 それでしたら、それがうまくいったら、今の投稿画面もそうした方がいいような気がしないでもないですね。
補足
Q.それはそれでいいのですが、私が言いたかったのは一覧画面です。 一覧画面なしでは、回答画面を表示することができません。 一覧画面にいくつか投稿が表示され、それを選んでから表示画面、回答画面、と言うことになるのではないでしょうか。 A.アドバイスありがとうございます、実のところ作りを少し工夫したいと考えております… 確認画面の送信ボタンを押した際にURLを生成するJavascriptを用意することで、ファイルを複数用意せずにまとめて対応できるのではないかと思っております。 参考サイトのように比較するボタンを押すことで個別にURLが生成されそちらをバナー画像でまとめて一覧表示させる方法が想定しているものになります。 ※参考サイト https://difff.jp/ ※URLを動的に生成 https://blog.websandbag.com/entry/2020/08/30/171357 Q.それでは、同じように、入力画面と確認画面の切り替えでPOSTする方法がよさそうですね。 それでしたら、それがうまくいったら、今の投稿画面もそうした方がいいような気がしないでもないですね。 A.回答ありがとうございます、投稿画面も一画面完結型にした方が良い気もしますが、デザインを考えると入力画面と確認画面で大幅に変わるためHTMLクラスの追加が大変なのではないかと考えております。 回答者側のスペースは質問の内容を確認できる作りにしたい為に狭くなってしまうのですが、質問者側は質問をしっかり考えることができるように見やすくCSSを整えた状態で作成したいです。
お礼
質問の期限が切れてしまったので下記のURLからアドバイスお願い致します。 https://okwave.jp/qa/q10165331.html
補足
A.回答ありがとうございます、昨日教えて頂いた質問掲示板 登録結果画面のタイトルから飛べるページをリンク先として考えておりました。 http://www.irasuto.cfbx.jp/%e9%9b%91%e8%ab%87%e6%8e%b2%e7%a4%ba%e6%9d%bf%e3%80%80%e7%99%bb%e9%8c%b2%e7%b5%90%e6%9e%9c%e7%94%bb%e9%9d%a2/ var_dump($row);で確認したところ登録結果画面と質問表示画面でNULLが表示されております。 コードをたどったところ質問表示画面の$sql = 'SELECT * FROM sortable WHERE URL=%s';で取得に失敗しているのではないかと考えたのですが、エラー原因は分かりますでしょうか? ※データベースにURLは格納されております。 https://imgur.com/5RmSq2Y.jpg ※該当コード $url = substr($_SERVER['REQUEST_URI'], -36); $sql = 'SELECT * FROM sortable WHERE URL=%s'; $query = $wpdb->prepare($sql, $url); $rows = $wpdb->get_results($query); var_dump($row); if (empty($rows)) { echo '質問がみつかりません'; exit; } ________________________________________________________________________ Q.テーブルにカラムを追加して保存するようにしてみてください。 A.アドバイスありがとうございます、下記コードでIPアドレスは保存できるようですが、入力画面、確認画面、表示画面どのタイミングで追加すべきでしょうか? $ip_address = $_SERVER["REMOTE_ADDR"]; //文字列形式から数値 に、数値から文字列形式に変換 $ip_long = ip2long($ip_address); -- ipアドレスのテーブル CREATE TABLE tbl_ips ( `ip` INT(10) NOT NULL ); $sql = "INSERT INTO tbl_ips ( ip ) VALUES ( INET_ATON( $ip ) );" Q.こんな感じになります。 メッセージの一部、については以前やったことがあると思いますので、$row->messageから取得するようにしてみてください。 A.アドバイスありがとうございます、メッセージの一部を取得というコードを考えてみました。1点質問があるのですが、<a href="'.$url.'"></a>を名前、画像、メッセージ全体に1つだけかけたい場合どのようなコードにすればよいのでしょうか? ---- <?php /* Template Name: 質問一覧画面 */ get_header(); $sql = 'SELECT * FROM sortable'; $query = $wpdb->prepare($sql); $rows = $wpdb->get_results($query); $upload_dir = wp_upload_dir(); foreach ($rows as $row) { $url = home_url('質問表示画面?'.$row->URL); $pattern = $upload_dir['basedir'].'/attach/'.$row->ID.'_0.*'; $files = glob($pattern); if (empty($files)) { $view = '<img src="ダミー画像パス">'; } else { $info = pathinfo($files[0]); $attach_url = $upload_dir['baseurl'].'/attach/'.$info['basename']; $ext = $info['extension']; switch ($ext) { case 'jpeg': case 'png': $view = '<img style="height: 50px;" src="'.$attach_url.'">'; break; case 'mp4': $view = '<video style="height: 50px;" src="'.$attach_url.'">'; break; case 'pdf': $view = '<iframe style="height: 50px;" src="'.$attach_url.'"></iframe>'; break; default: $view = ''; break; } } echo '<div><a href="'.$url.'">'.$row->namae.'</a></div>'; echo '<div>'.$view.'</div>'; echo '<div>'.mb_strimwidth($row->message, 0, 38, "・・・").'</div>'; } ----