- ベストアンサー
WordPressの質問(q10103578)の続
下記のコードファイルにIDとスタンプを追加したいのですが、変数がセットされているか確認すべきかどうか知識不足もあり判断ができないためアドバイス頂いてから決めようと考えています。 宜しくお願い致します。 echo "ID:{$wpdb->insert_id}"; echo '<img class="selimg" src="'.$stamps[$stamp].'">'; ※現在のコード https://wandbox.org/permlink/rnlDqXMzNIOqimxW
- みんなの回答 (40)
- 専門家の回答
質問者が選んだベストアンサー
・今のコードにmove_uploaded_fileを加えるのはかなり難しそうに見えます… 確認画面に画像を表示するのも難しそうです。 アップロードファイルが安全かどうかもこの時点でやっておく必要がありそうですし。 ・参考サイトとは少し違う形になるのですが、下記のように呼ぶのはどうでしょうか? get_header(); if (isset($_POST['toiawase'])) { ~ ヘッダーを先に出してしまうと、 この処理がだめになるかも知れないのでおすすめできません。 ---- // 他のサイトでインラインフレーム表示を禁止する(クリックジャッキング対策) header('X-FRAME-OPTIONS: SAMEORIGIN'); ---- header()は他の何よりも先に出力しないといけないはずです。 https://www.php.net/manual/ja/function.header.php get_header()をやった時点で別のヘッダーが出力されるか、 標準のヘッダーが出力されてしまうような気がします。 試して確認できればいいのですが。
その他の回答 (39)
- dell_OK
- ベストアンサー率13% (766/5720)
・現在はenter information.phpに設置しているのですが、確認画面のidentify.phpに移動する、または両方に設置する何が適切でしょうか? setToken()のことでしたら、enter information.phpだけです。 ・中の値を保持したまま入力画面から確認画面に移る場合は$_SESSION['']で指定ファイルに保存することになるのでしょうか? 参考サイトをみるとそのようです。 今のコードには簡単に加えられないかも知れないです。 確認画面に表示するのはもとのままでいいのですか。 それとも画像タイプや寸法変更もここでするのですか。 ・今回作成しているenter information.phpがない場合にエラーが表示させることは可能でしょうか? WordPressが自動でindex.phpを表示してくれるのではないでしょうか。 index.phpはエラーメッセージを表示するようにされていたと思います。 ・また参考サイトのコードを見るとエラーがあるとインデックスページに毎回飛ぶような仕組みになっているためそちらも改善したほうが良さそうです。 どの参考サイトかみつけられなかったですが、改善と言うか、なにもしない方がいいと思います。 ・switch(true){}は使う必要なかったのですが、一応調べつつ仕組みを考えながら使ってみました。下記コードのほうが簡潔で良いと思います。 if (isset($_POST['toiawase'])) { require_once 'identify.php'; if (isset($_POST['toiawase2'])) { require_once 'finish.php'; exit; } } このコードですが、実はあまりよくありません。 finishのあとでexitしているので、フッターなどが出ません。 フッターなどを表示しなければこれでもいいですが、 表示するのでしたら、fnish内か、exitの直前に入れる必要があります。 ヘッダーにしても同じことですが、 それぞれの処理ファイルに書くよりも、 2つめの参考サイトのようにメインとなるmain.phpで、 テンプレートとして正しく構成されているべきだと思います。
お礼
最新の質問になります。 質問の期限が切れましたので、下記のURLから引き続きよろしくお願い致します。 https://okwave.jp/qa/q10124692.html
補足
Q.setToken()のことでしたら、enter information.phpだけです。 A.回答ありがとうございます。了解いたしました。 Q.確認画面に表示するのはもとのままでいいのですか。 それとも画像タイプや寸法変更もここでするのですか。 A.回答ありがとうございます。確認画面に表示する場合サイズは可能であれば統一したいですがこれはcssでも可能だと思われます。 今のコードにmove_uploaded_fileを加えるのはかなり難しそうに見えます… Q.WordPressが自動でindex.phpを表示してくれるのではないでしょうか。 index.phpはエラーメッセージを表示するようにされていたと思います。 A.アドバイスありがとうごいます。なるほど確かにそうなりますね。 Q.どの参考サイトかみつけられなかったですが、改善と言うか、なにもしない方がいいと思います。 A.アドバイスありがとうございます、参考サイトは下記になります。 ※2つめ https://nw.myds.me/wprdpress-ad/contact_us/ Q.2つめの参考サイトのようにメインとなるmain.phpで、 テンプレートとして正しく構成されているべきだと思います。 A.回答ありがとうございます。参考サイトとは少し違う形になるのですが、下記のように呼ぶのはどうでしょうか? get_header(); if (isset($_POST['toiawase'])) { require_once 'identify.php'; if (isset($_POST['toiawase2'])) { require_once 'finish.php'; exit; } }
- dell_OK
- ベストアンサー率13% (766/5720)
・2つめの方法で作成することはできないでしょうか? できると思います。 ・1つめのswichで切り替える方法は非推奨だとお問い合わせフォームの時に指摘を頂き、 2つめもswitchで切り替えているので同じことです。 どなたが非推奨と言われたのかわかりませんが、 switchを使うことは問題ないと思います。 ・また作り変える場合下記のコードを参考サイトのように作り変える必要がありますが、どのような真偽判定で確認画面を加えればいいのか分かりません… 作り変えなくていいと思います。 1つめも2つめも両方の仕組みを理解してください。 そうすればどちらでもできることがわかりますし、どちらでもいいのだと質問者さま自身で判断できるようになると思います。 仕組みがわかっていないと、人に教わったコードを貼り付ける作業で終わってしまい、なにも身につかないです。
補足
Q.どなたが非推奨と言われたのかわかりませんが、 switchを使うことは問題ないと思います。 A.コードを考えてみたのですが、3つほど問題があります。まず送信時のtokenについてです。 1、現在はenter information.phpに設置しているのですが、確認画面のidentify.phpに移動する、または両方に設置する何が適切でしょうか? 2、アップロード画像についてになります。こちらも確認画面に表示させて確認後に保存するように作り変えたいです。 中の値を保持したまま入力画面から確認画面に移る場合は$_SESSION['']で指定ファイルに保存することになるのでしょうか? 参考サイトを読んでみたのですが、今のコードにどのように加えればいいのか全く分かりませんでした… アドバイスお願い致します。 3、switch($_POST["action"]):でファイルの切り替えはできるようですが、アクセス時のファイル真偽判定がないためそちらを実装すべきだと指摘を頂いておりました。 今回作成しているenter information.phpがない場合にエラーが表示させることは可能でしょうか? また参考サイトのコードを見るとエラーがあるとインデックスページに毎回飛ぶような仕組みになっているためそちらも改善したほうが良さそうです。 switch(true){}は使う必要なかったのですが、一応調べつつ仕組みを考えながら使ってみました。下記コードのほうが簡潔で良いと思います。 if (isset($_POST['toiawase'])) { require_once 'identify.php'; if (isset($_POST['toiawase2'])) { require_once 'finish.php'; exit; } } ※最新コード(アップロード画像無し) https://wandbox.org/permlink/eJn6iEqpsSugil0M ※1つめ https://ara-web.net/blog/wordpress/post-3683/ ※2つめ https://nw.myds.me/wprdpress-ad/contact_us/ ※確認画面で画像を保存 https://qiita.com/ryouya3948/items/66294cb445663f2a9d95 ※switch(true){}について https://okwave.jp/qa/q3902353.html ※雑談掲示板のファイル構成 core.php (index.phpの役割 ファイルの統括) enter-information.php (入力フォーム) identify.php (確認画面) finish.php (送信完了) rerification.php (文字列チェック)
- dell_OK
- ベストアンサー率13% (766/5720)
・スタンプ画像はfinish.phpと同じものを確認の際にも使うように考えていたのですが、goo質問のようにキャンセルボタンで戻すように作りたい場合リセットさせるにはどのようなつくりにすべきでしょうか? 戻すと言うのは入力画面に入力内容を維持したまま戻ると言うことでしょうか。 リセットと言うと入力内容を維持せずに戻るようにも聞こえますが、どちらでしょうか。 1つめの方法ので実装するならその仕組みをよく理解してからにした方がいいと思います。 1つめの方法を採用しているお問い合わせメールの仕組みもあまり理解されていないような気がするので、理解を深めてからやった方がいいと思います。 1つめの方法にならうのなら、画面遷移を制御しているインデックス「~-index.php」があった方がいいと思います。 確認画面がないパターンの現在の「entry-confirmationform.php」が「~-index.php」の機能を込みで作っているのでこのままではあまりよくない気がします。 いまのファイル構成やコードをそのまま使おうとは思わない方がいいです。 なので、まずは、1つめの方法をおさらいするつもりで、ファイル名は変えてそのまま作ってみてください。 それを少しずつ改造していくのがいいと思います。 ただ、メール送信するわけではないので、メール送信「contact-sendmail.php」のコードは不正アクセスチェックだけにしておいていいと思います。 ひととおりできてからになりますが、このメール送信「contact-sendmail.php」が「finish.php」のコードに近いものになってくると思います。 それと、完了画面をどうするかですが、いまは「finish.php」がそれをになってもいるので、表示の処理は別々にするようになるかも知れません。 ・アップロード画像に関してもアドバイス頂きたいのですが、入力画面で保存せずに確認画面の送信ボタンでファイル保存することは可能でしょうか? できます。 いまも入力画面では保存していません。 「finish.php」で保存しているので、確認画面よりあとになります。 私の勘違いかも知れませんが、確認画面を経由すると、どこかに保存する仕組みなのでしょうか。 それを回避する方法が参考サイトなら、これを使えばいいと思います。
お礼
2つめの方法で作成することはできないでしょうか? 1つめのswichで切り替える方法は非推奨だとお問い合わせフォームの時に指摘を頂き、また作り変える場合下記のコードを参考サイトのように作り変える必要がありますが、どのような真偽判定で確認画面を加えればいいのか分かりません… // エラーメッセージと不正アクセスフラグ $error_mes = ''; $noindexaccess = true; if (!empty($_POST)) { require_once 'rerification.php'; if (empty($error_mes)) { require_once 'finish.php'; exit; } } ※参考サイト https://ara-web.net/blog/wordpress/post-3683/
補足
Q.戻すと言うのは入力画面に入力内容を維持したまま戻ると言うことでしょうか。 A.回答ありがとうございます。可能であればgoo質問のように保持したまま戻したいです。 Q.私の勘違いかも知れませんが、確認画面を経由すると、どこかに保存する仕組みなのでしょうか。 それを回避する方法が参考サイトなら、これを使えばいいと思います。 A.確認画面の送信ボタンをクリック後にデータベースとアップロード画像の保存を行うように考えています。
- dell_OK
- ベストアンサー率13% (766/5720)
・主キーを削除することですべて削除されるという事でしょうか? 主キーを削除するのではありません。 主キーを条件にして削除する、です。 データベースがやっているのは、その条件に一致するレコードを探して削除する、感じです。
補足
回答ありがとうございます、理解できました。 雑談掲示板で確認画面のあるパターンを考えているのですが分からない点があるため質問があります。 2パターン確認画面を実装する方法があるようですが、どちらが適しているのか実装可能なものかお聞きしたいです。 ※1つめ https://ara-web.net/blog/wordpress/post-3683/ ※2つめ https://nw.myds.me/wprdpress-ad/contact_us/ 2つめのPHPで実装する方法なのですが$_SESSION['']を使われているため適応させる方法が分からない状態です。 1つめの方法で実装を考えているのですが、スタンプ画像とアップロード画像をどうすべきなのか分かりませんでした。 スタンプ画像はfinish.phpと同じものを確認の際にも使うように考えていたのですが、goo質問のようにキャンセルボタンで戻すように作りたい場合リセットさせるにはどのようなつくりにすべきでしょうか? アップロード画像に関してもアドバイス頂きたいのですが、入力画面で保存せずに確認画面の送信ボタンでファイル保存することは可能でしょうか? 参考サイトから一時保存する方法も見つけたのですが別の方法もあるのではないかと思っております。 読み込みの際に現在はenter-information.phpに下記のように書いていると思うのですが、確認画面を増やす場合の判定はどうすべきでしょうか? if (!empty($_POST)) { require_once 'rerification.php'; if (empty($error_mes)) { require_once 'finish.php'; exit; } } 確認画面のイメージは下記のような感じになっております。番号は格納後に表示されるため確認画面では表示させない予定です。 左上 ×番号 名前 スタンプ コメント 画像 空白 右下 ※完成画面 https://imgur.com/tyItrFn.jpg ※参考サイト(一時的にセッションに保存する) https://qiita.com/ryouya3948/items/66294cb445663f2a9d95 ※identify1.phpに確認画面のコードを書きました。(1つ目の方法です) https://wandbox.org/permlink/18SxuzsoJKtZaslU
- dell_OK
- ベストアンサー率13% (766/5720)
・削除対象のIDを取得してというところが気になったのですが、名前・メッセージも同じように削除するのではないのでしょうか? 先日お願いしたデータベース用語のページは見てくださいましたか。https://26gram.com/database-terms 削除するのはレコード単位です。 レコードには複数のフィールドがあります。 フィールドがIDや名前やメッセージです。 レコードを削除するとこれらのフィールドがひとまとで削除されます。 取得するのは削除対象のIDだけで十分です。 これは主キーなので、これを指定して削除すればいいので、名前やメッセージを取得する必要はありません。 これでIDを取得する。条件に日時(TS)を指定。 $sql = 'SELECT ID FROM sortable WHERE TS < %s'; これでIDを条件にレコードを削除する。 $sql = 'DELETE FROM sortable WHERE ID = %s'; ・TSとはどの箇所を指しているのでしょうか? phpMyAdminでテーブルの構成を確認してください。 タイムスタンプが自動で設定されるカラムを追加してもらったはずです。 これはこの削除のためのものです。
補足
Q.先日お願いしたデータベース用語のページは見てくださいましたか。https://26gram.com/database-terms レコードを削除するとこれらのフィールドがひとまとで削除されます。 取得するのは削除対象のIDだけで十分です。 これは主キーなので、これを指定して削除すればいいので、名前やメッセージを取得する必要はありません。 phpMyAdminでテーブルの構成を確認してください。 タイムスタンプが自動で設定されるカラムを追加してもらったはずです。 これはこの削除のためのものです。 A.アドバイスありがとうございます。教えて頂いたサイトは見たのですが、レコードというのは横列なので各カラムを削除しなくてはならないものと考えておりました。 主キーを削除することですべて削除されるという事でしょうか? WHERE TSというのはタイムスタンプのことなのですね勉強になりました。
- dell_OK
- ベストアンサー率13% (766/5720)
いつの間にか finish.php の保存ファイルパスの生成が欠落していて、アップロードファイルが保存できなくなっていましたので追加しました。 差分の確認はこちらから見てください。 https://github.com/dell-GH/sample_theme/commit/444ca5d44c830bd5d73a749351aeaa509e0b6b18 ファイルの削除ですが、ヒントで書いたファイル名の編集は使えませんでした。 すみません。 削除対象のIDを取得して雑談掲示板とアップロードファイルを削除するコードを作ってみました。 レコード削除は日時指定ではなく、取得したIDで削除するようにしました。 https://github.com/dell-GH/sample_theme/blob/main/delete.php ファイル名は単に「delete.php」にしているので変更してください。 それと、固定ページからテスト実行するためにテンプレート名を記述しているので、ここは削除して使ってください。 ---- /* Template Name: delete */ ---- いずれのURLも見るだけにして、使う場合はダウンロードしてください。
補足
Q.削除対象のIDを取得して雑談掲示板とアップロードファイルを削除するコードを作ってみました。 レコード削除は日時指定ではなく、取得したIDで削除するようにしました。 それと、固定ページからテスト実行するためにテンプレート名を記述しているので、ここは削除して使ってください。 ---- /* Template Name: delete */ ---- A.アドバイスありがとうございます。 ※修正いたしました https://wandbox.org/permlink/AkJSaWcaG5HCuOi5 削除対象のIDを取得してというところが気になったのですが、名前・メッセージも同じように削除するのではないのでしょうか? テーブルをすべて削除するようなコードになっているのか自分では理解できていないため教えて頂きたいです。 またSELECT ID FROM sortable WHERE TSのTSとはどの箇所を指しているのでしょうか?条件にあたる部分が分かりませんでした。調べてもSQL TSというのが出てこないため教え頂きたいです。 テンプレート名は雑談掲示板→送信後に確認画面がある場合の雑談掲示板→質問掲示板→コードをまとめる→cronに任せられる範囲はまとめて書きだすという段階を踏んでいく中でどうなるのか分からないため今のところはテンプレートとして残しておくことにしております。 ※メッセージと名前を削除する場合どうなるのか考えてみたコード // 古い雑談掲示板の取得 $sql = 'SELECT ID FROM sortable WHERE TS < %s,%s,%s'; $query = $wpdb->prepare($sql, $delete_date); $delete_items = $wpdb->get_results($query); foreach ($delete_items as $delete_item) { // アップロードファイル一覧取得 $files = glob($dir.$delete_item->ID.'_*'); // アップロードファイル削除 foreach ($files as $file) { unlink($file); } // 古い雑談掲示板の削除 $sql = 'DELETE FROM sortable WHERE ID = %s,message = %s,namae = %s'; $query = $wpdb->prepare($sql, $delete_item->ID,$delete_item->message,$delete_item->namae); $wpdb->query($query); }
- dell_OK
- ベストアンサー率13% (766/5720)
・DELETE FROM sortableのみで削除などはできないのでしょうか? 削除できます。 WHERE句がないと全レコードが削除されてしまいますが、 それでいいのでしょうか。
補足
回答ありがとうございます。基本的には6日ですべて削除する予定ですが、idを取得してアップロード画像ファイルも削除するとなるとカラムを指定したほうがコード自体の短縮になりそうです。
- dell_OK
- ベストアンサー率13% (766/5720)
参考サイトはファイルを削除する話しなので関係ないと言いましたが、掲示板にアップロードしたファイルを削除する必要があるので、まったく無関係な話しではなかったですね。 これはひと手間処理が必要です。 sortableから削除する前に、削除対象のレコードをいったん読み込んで、IDを取得する必要があります。 IDはアップロードファイル名を構成するので、取得したIDを編集してファイルを削除します。 "{$id}_{$i}_thumb.png"; "{$id}_{$i}_overlay.png"; ヒントはここまでにしておきます。 質問者さまの方でできそうでしたらやってみてください。
補足
Q.sortableから削除する前に、削除対象のレコードをいったん読み込んで、IDを取得する必要があります。 IDはアップロードファイル名を構成するので、取得したIDを編集してファイルを削除します。 "{$id}_{$i}_thumb.png"; "{$id}_{$i}_overlay.png"; A.下記コードまでは考えられたのですが、削除対象のレコードをいったん読み込んで、IDを取得する段階が分かりませんでした。 削除対象レコード ID取得で検索したところ、参考サイトから直前にINSERTしたレコードのIDを取得する方法を見つけたのですが、SELECT LAST_DELETE_ID();を検索しても直前にDELETEしたレコードのIDを取得するようなコードはないようです。今回の削除コードを質問掲示板を作成後にcronに任せて負担を軽くすることも検討しているため、INSERTしているfinish.phpと違うファイルになるため参考サイトのコードが使えるのか分かりませんでした。 SELECT文で取得する列を指定ことも考えたのですが、$SQLが2重になってしまうためこちらの方法もどう対処すればよいか分からない状態です。 $sql = 'DELETE FROM sortable(ID,message,namae) VALUES(%s,%s,%s)';// ※削除したいテーブル ID ごとの最新の日付のレコードを取得するという方法もあったのですが、今回の実装したい機能には該当しない気がしています。 ※SELECT文 $sql = " SELECT ID, message, namae "; ※参考サイト(直前にINSERTしたレコードのIDを取得する方法) https://tech.pjin.jp/blog/2017/06/26/%E3%80%90mysql%E3%80%91%E7%9B%B4%E5%89%8D%E3%81%ABinsert%E3%81%97%E3%81%9F%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AEid%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%81%84/ (ID ごとの最新の日付のレコードを取得する) https://ez-net.jp/article/61/KVO1q_5K/P5lSphN26BvD/ <?php // 古い雑談掲示板の削除関数 function delete_enter_information() { global $wpdb;// ※dは符号付整数、sは文字列 $sql = 'DELETE FROM sortable(ID,message,namae) VALUES(%s,%s,%s)';// ※削除したいテーブル $delete_date = date('Y-m-d H:i:s', strtotime('-6 days')); // ※削除対象日付 $query = $wpdb->prepare($sql, $delete_date); $wpdb->query($query); } // 古い雑談掲示板の削除実行 delete_enter_information(); ?>
- dell_OK
- ベストアンサー率13% (766/5720)
・名前とメッセージの真偽処理はなくしてもいいのでしょうか? その処理は rerification.php にあります。 チェック処理はすべて rerification.php にあるので、他のところには不要です。 ---- $error_mes .= Chk_InputMode($namae, "・お名前をご記入ください。<br />\n"); $error_mes .= Chk_InputMode($message, "・お問い合わせ内容をご記入ください。<br />\n"); ---- ・こちらのコードはfinish.phpに配置するものではないのでしょうか? いいえ。 グダグダと記述しているのをループ処理にしただけのことで、入力画面にもともとあるものです。 これと、 ---- echo '<img class="selimg" src="http://www.irasuto.cfbx.jp/wp-content/uploads/2022/10/FIGURE-146070.jpg">'; echo '<img class="selimg" src="http://www.irasuto.cfbx.jp/wp-content/uploads/2022/10/FIGURE-146281.jpg">'; echo '<img class="selimg" src="http://www.irasuto.cfbx.jp/wp-content/uploads/2022/10/FIGURE-146282.jpg">'; echo '<img class="selimg" src="http://www.irasuto.cfbx.jp/wp-content/uploads/2022/10/9416845000734.jpg">'; echo '<img class="selimg" src="http://www.irasuto.cfbx.jp/wp-content/uploads/2022/10/bd3713656360f94acb07764cbb2b05a90006a26d160f9f9241f14fff7417fc51_01.jpg">'; echo '<img class="selimg" src="http://www.irasuto.cfbx.jp/wp-content/uploads/2022/09/FIGURE-145522.jpg">'; ---- これは、同じ処理です。 ---- foreach ($stamps as $stamp_path) { echo '<img class="selimg" src="'.$stamp_path.'">'; } ---- finish.php には選択されたスタンプひとつを表示する処理があります。 ・カラムごとに削除する必要はないと考えた為、テーブルごとの削除に変更いたしました。 https://26gram.com/database-terms こちらでデータベース用語について学んでください。 一般的に「データを削除する」と言う場合、 この図の「レコード」を削除することを言います。 参考サイトのものはファイルを削除する話しないので関係ありません。 wpdbクラスを使って削除するのは正解です。 関数にする必要もない気がしますが、添付されたコードをもとにするとこんな感じです。 ---- <?php // 古い雑談掲示板の削除関数 function delete_enter_information() { global $wpdb; $sql = 'DELETE FROM sortable WHERE TS < %s'; $delete_date = date('Y-m-d H:i:s', strtotime('-6 days')); // ※削除対象日付 $query = $wpdb->prepare($sql, $delete_date); $wpdb->query($query); } // 古い雑談掲示板の削除実行 delete_enter_information(); ---- 追加したのは「WHERE TS < %s」です。 質問者さまが言われている「カラム指定して消す方法」と言うのはこれに当たると思います。 「TS」は登録日時ですのでこれを条件項目に指定することになります。 テーブルは固定なので引数は不要です。 戻り値も不要です。
補足
Q.チェック処理はすべて rerification.php にあるので、他のところには不要です。 ---- $error_mes .= Chk_InputMode($namae, "・お名前をご記入ください。<br />\n"); $error_mes .= Chk_InputMode($message, "・お問い合わせ内容をご記入ください。<br />\n"); ---- A.アドバイスありがとうございます。チェック処理について理解することができました。 Q.いいえ。 グダグダと記述しているのをループ処理にしただけのことで、入力画面にもともとあるものです。 ---- foreach ($stamps as $stamp_path) { echo '<img class="selimg" src="'.$stamp_path.'">'; } ---- A.配列になる部分を削除するのではないかと誤認しておりました。申し訳ありません。 Q.参考サイトのものはファイルを削除する話しないので関係ありません。 ---- <?php // 古い雑談掲示板の削除関数 function delete_enter_information() { global $wpdb; $sql = 'DELETE FROM sortable WHERE TS < %s'; $delete_date = date('Y-m-d H:i:s', strtotime('-6 days')); // ※削除対象日付 $query = $wpdb->prepare($sql, $delete_date); $wpdb->query($query); } // 古い雑談掲示板の削除実行 delete_enter_information(); ---- A.回答ありがとうございます。カラム指定して消す方法も考えたのですが、テーブルごと削除できるのではないかと考えておりました。 DELETE FROM sortableのみで削除などはできないのでしょうか?
- dell_OK
- ベストアンサー率13% (766/5720)
・下記のコードで間違いないでしょうか? 少し違いますね。 rerification.php の一番最後にこちらを追加してください。 ---- if (!isset($stamps[$stamp])) { $error_mes .= "・スタンプを選択してください。<br />\n<br>\n"; } ---- finish.php の以下の部分は削除してください。 ---- if (!empty($_POST['message'])) { $message = $_POST['message']; $namae = $_POST['namae']; $stamp = $_POST['stamp']; $sql = 'INSERT INTO sortable(message,namae,stamp) VALUES(%s,%s,%d)'; $wpdb->query($wpdb->prepare($sql, $message, $namae, $stamp)); // ループカウンタ$iが1から2までのループ for ($i = 1; $i <= 2; ++$i) { // アップロードファイル保存関数を呼ぶ // 第一引数:保存されたメッセージのID // 第二引数:ループカウンタ save_upload_file($wpdb->insert_id, $i); } } ---- $namae = $_POST['namae']; $message = $_POST['message']; // ここから表示(ID) echo "ID:{$wpdb->insert_id}"; ---- finish.php の表示処理は以下のようにしてください。 これで表示したい順になると思います。 ただ、改行などの体裁はHTMLやCSSで調整する必要があると思います。 ---- // ここから表示(ID) echo "ID:{$wpdb->insert_id}"; // 名前 echo h($namae); // スタンプ echo '<img class="selimg" src="'.$stamps[$stamp].'">'; // メッセージ echo h($message); // ループカウンタ$iが1から2までのループ for ($i = 1; $i <= 2; ++$i) { // アップロードファイル保存関数を呼ぶ // 第一引数:保存されたメッセージのID // 第二引数:ループカウンタ save_upload_file($wpdb->insert_id, $i); } ---- entry-confirmationform.php のスタンプ表示は以下のようにしてください。 ---- foreach ($stamps as $stamp_path) { echo '<img class="selimg" src="'.$stamp_path.'">'; } ---- ここについては説明していませんでしたが、 先頭で以下のようにスタンプ画像のパスを設定しています。 ---- // スタンプ $stamps = []; $stamps[0] = 'http://www.irasuto.cfbx.jp/wp-content/uploads/2022/10/FIGURE-146070.jpg'; 省略 ---- なぜこうしているかですが、 表示をループで処理することと、 想定外の値が送信されてきた場合のチェック (今回の回答のひとつめで書いたrerification.php)の両方で使うためです。 いただいた最新コードでは、このパスが書かれているところが二か所あります。 パスが変わった時に二か所とも直すことになるので忘れや間違いのもととなりかねません。 entry-confirmationform.php のスクリプトにエラーがあります。 以下に示す行を削除してください。 ---- <script> const select = document.querySelector('#select'); const selimg = document.querySelectorAll('.selimg'); selimg[select.value].classList.toggle('selected'); for (let i = 0; i < selimg.length; i++) { selimg[i].addEventListener('click', function() { // 選択状態を移動 selimg[select.value].classList.toggle('selected'); select.value = i; selimg[select.value].classList.toggle('selected'); }); });※この行を削除 } </script> ----
お礼
前提として掲示板は6日目に削除されるようにしたいです。 ID,名前、メッセージの削除についてお聞きしたいのですが、下記のコードで可能でしょうか? カラムごとに削除する必要はないと考えた為、テーブルごとの削除に変更いたしました。 deleteメソッドでカラム指定して消す方法も考えたのですが、どちらが今回の場合適しているか分からなかったため先にお聞きしてから選択したいと思っております。 ファイルを6日間で削除する方法は見つけたのですが、アップロードされてからと、ユーザーがアクセスするたびに実行する方法しか見つけられませんでした。これだと1日目と5日目にアップロードされたものに開きが出てしまいます。一括で削除するようにすることは可能でしょうか? ※参考サイト(PHPでファイル削除する方法) ・https://codelikes.com/php-file-remove/ ・https://okwave.jp/qa/q6112411.html ・https://www.sejuku.net/blog/78776 ※wpdbクラスを使ったDB操作削除について ・https://one-ap-engineer.com/wpdb/ ・https://gray-code.com/wordpress/deleting-data-by-using-wpdb-class/ <?php // 古い雑談掲示板の削除 function delete_enter_information($information_table_name)// ※接続オブジェクト、雑談掲示板テーブル名を受け取る { global $wpdb; $sql = "DELETE FROM sortable "; $delete_date = date('Y-m-d H:i:s', strtotime('-6 days')); // ※削除対象日付 $query = $wpdb->prepare($sql, $delete_date); $wpdb->query($query); return $delete_date; // 削除対象日付を返す } // 古い雑談掲示板の削除 引数(接続オブジェクト、雑談掲示板テーブル名)戻り値(削除対象日付) $delete_archive = delete_past_chat($information_table_name); ?>
補足
Q.finish.php の以下の部分は削除してください。 ---- if (!empty($_POST['message'])) { $message = $_POST['message']; $namae = $_POST['namae']; $stamp = $_POST['stamp']; $sql = 'INSERT INTO sortable(message,namae,stamp) VALUES(%s,%s,%d)'; $wpdb->query($wpdb->prepare($sql, $message, $namae, $stamp)); // ループカウンタ$iが1から2までのループ for ($i = 1; $i <= 2; ++$i) { // アップロードファイル保存関数を呼ぶ // 第一引数:保存されたメッセージのID // 第二引数:ループカウンタ save_upload_file($wpdb->insert_id, $i); } } ---- A.回答ありがとうございます。お聞きしたいことがあるのですが、名前とメッセージの真偽処理はなくしてもいいのでしょうか?以前dell_okさんにアドバイス頂いたPHPで値の確認はした方がよいということが頭にあるため疑問に思いました… Q.entry-confirmationform.php のスタンプ表示は以下のようにしてください。 ---- foreach ($stamps as $stamp_path) { echo '<img class="selimg" src="'.$stamp_path.'">'; } ---- A.こちらのコードはfinish.phpに配置するものではないのでしょうか?finish.phpにdell_okさんから今回アドバイス頂いたコードを配置する場合コードが重複してしまうため、どちらを優先するべきか分からない状態です。 // スタンプ echo '<img class="selimg" src="'.$stamps[$stamp].'">'; ※現在のコード https://wandbox.org/permlink/J29UEIiM8iAerjsH
お礼
「保存するファイル名につかってはいけない」とのことなのですが、user_add_check.phpの<input type="hidden" name="image_name" value="<?= $user_image['name'] ?>">を使う事はアウトなようです。 自分なりに参考サイトを見て考えてみたのですが、$_SESSION['image']['data']が機能しているのか分からない状態です。 自信がないため2パターン考えてみました。 ※参考サイト https://qiita.com/ryouya3948/items/66294cb445663f2a9d95 user_add.php(要らないもの?) <h2>新規登録</h2> <form method="post" action="user_add_check.php" enctype="multipart/form-data"> <input type="text" name="name" class="user_name_input" placeholder="ユーザー名"> <input type="file" name="image" id="my_image" accept="image/*" multiple> <input class="btn btn-outline-info" type="button" onclick="history.back()" value="戻る"> <input class="btn btn-outline-dark" type="submit" value="登録"> </form> user_add_check.php(入力画面) <?php session_start(); //ファイルの内容を全て文字列に読み込む $_SESSION['userfile']['data'] = file_get_contents($_FILES['userfile']['tmp_name']); //アップロードされたファイルの種類を確認--送られてくる MIME タイプは信用できない--メッセージ全体を偽装できる $_SESSION['userfile']['type'] = exif_imagetype($_FILES['userfile']['tmp_name']); $_SESSION['userfile']['type'] = mime_content_type ($_FILES['userfile']['tmp_name'] ); //画像であるかどうかをexif_imagetype()を使って判別--画像のみ分ける必要があるのか不明 //$_SESSION['userfile']['type'] = exif_imagetype($_FILES['image']['tmp_name']); ?> <img src="image.php"> <form method="post" action="user_add_done.php"> <input type="hidden" name="name" value="<?= $user_name ?>"> <input type="hidden" name="image_name" value="<?= $user_image['name'] ?>"> <input type="button" class="btn btn-outline-info modal_close" onclick="history.back()" value="戻る"> <input type="submit" class="btn btn-outline-dark" value="OK"> </form> image.php(確認画面 バイナリーデータ確認) <?php $load_name = $ext session_start(); switch ($file_ext == $_SESSION['userfile']['type']) { case IMAGETYPE_JPEG: header('content-type: image/jpeg'); break; case IMAGETYPE_PNG: header('content-type: image/png'); break; case IMAGETYPE_GIF: header('content-type: image/gif'); break; case MIME_TYPE_PDF: header('content-type: application/pdf'); break; case MIME_TYPE_MP4: header('content-type: video/mp4'); break; } ?> <?php $load_name = $ext session_start(); switch ($file_ext == $_SESSION['userfile']['type']) { //jpegを表示 case IMAGETYPE_JPEG: header('content-type: image/jpeg'); echo $_SESSION['image']['data']; break; //pngを表示 case IMAGETYPE_PNG: header('content-type: image/png'); echo $_SESSION['image']['data']; break; //pdfを表示 case MIME_TYPE_PDF: header('content-type: application/pdf'); echo( substr( $_SESSION['image']['data'], 0, 5 ) ); break; //mp4を表示 case MIME_TYPE_MP4: header('content-type: video/mp4'); echo( substr( $_SESSION['image']['data'], 4, 4 ) ); break; } ?> ___________________________________________________________ image.php(確認画面 バイナリーデータ確認) <?php function get_file_ext($ext) { //MIMEタイプを取得 $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime_type = finfo_file($finfo, $_SESSION['image']['data']);/*$GET['image']['data']*/ if (FILE_EXT_PNG == $ext && 'image/png' == $mime_type) { } elseif (in_array($ext, [FILE_EXT_JPEG, '.jpg']) && 'image/jpeg' == $mime_type) { $ext = FILE_EXT_JPEG; } else { // バイナリー文字列確認 $contents = file_get_contents($_SESSION['image']['data']); if (FILE_EXT_PDF == $ext && 'application/pdf' == $mime_type && '%PDF-' == substr($contents, 0, 5)) { } elseif (FILE_EXT_MP4 == $ext && 'video/mp4' == $mime_type && 'ftyp' == substr($contents, 4, 4)) { } else { $ext = null; } } return $ext; } ?> user_add_done.php(表示画面 保存拡張子) $_SESSION['image']これを使う //文字列をファイルに書き込む関数 file_put_contents('./image/',$_SESSION['image']);
補足
※参考サイト https://qiita.com/ryouya3948/items/66294cb445663f2a9d95 回答ありがとうございます。 色々と分かってきたことがあるのですが、dell_okさんから見て難しいポイントなどありますでしょうか? バイナリーの文字列確認後にバイナリーデータをセッションに格納というところが難しい気がするのですが、参考サイトのコードを見たところ画像名?を送信しているようです。 こちらが可能であれば、file_get_contentsで画像、動画、PDFを取得してバイナリー文字列を確認→バイナリーデータをセッションに格納ということが可能だと考えています。 <input type="hidden" name="image_name" value="<?= $user_image['name'] ?>"> $user_image = $_POST['image_name']; file_put_contents('./image/'.$user_image,$_SESSION['image']); ※参照サイトのように pdf.php(pdf) や image.php(画像データ) が(レスポンスヘッダで適切な content-type とともに)anchor要素で .phpを呼び出す。 (mp4なら、video要素でvideo.phpを呼び出す) 1,アップロード入力画面から画像または動画をアップロード 2,データの正当性(バイナリーの文字列確認) 3,バイナリーデータをセッションに格納 4,出力する ※リンクなのはPDFファイルの中身を確認させるため <a href="pdf.php" target="_blank">PDFファイル</a> <img src="image.php"> <video src="video.php"> 5,セッションに格納されたデータを適切なレスポンスヘッダとともに返す、画像の場合content-type は、image/jpeg とか image/png になる pdf.php はpdfだけなので、content-type: application/pdf に固定でも可能 ※可能であればデータ種別(mimeタイプ)も格納しておくと、image.php などの処理が簡略化され、同じデータに対して判定を1度で出来る。