- ベストアンサー
WordPressの質問(q10113307)の続
- 「保存するファイル名につかってはいけない」とのことなのですが、user_add_check.phpの<input type="hidden" name="image_name" value="<?= $user_image['name'] ?>">を使う事はアウトなようです。
- 自分なりに参考サイトを見て考えてみたのですが、$_SESSION['image']['data']が機能しているのか分からない状態です。 自信がないため2パターン考えてみました。
- ※参考サイト https://qiita.com/ryouya3948/items/66294cb445663f2a9d95
- みんなの回答 (21)
- 専門家の回答
質問者が選んだベストアンサー
スタンプ選択についてはオプションボタンで進めてみてください。 まずはスタンプ画像は表示せずオプションボタンの値を送信して、 データベースに保存するのが優先です。 スタンプ画像の表示はスタイルシートでどうにかなるはずなので、 見た目よりもデータの送受信を解決しておきましょう。
その他の回答 (20)
- dell_OK
- ベストアンサー率13% (766/5720)
・utf8mb4に変更したほうが良いのでしょうか? utf8が選択できなくなったとのことで説明しましたが、 使えるのでしたらutf8でいいと思います。
- dell_OK
- ベストアンサー率13% (766/5720)
・TSカラムにはon update current_timestampは設定しなくても良いのでしょうか? 設定した場合は、データを更新した時に現在日時に更新されます。 設定しない場合は、データを更新しても登録時の日時が保持されます。 このデータは更新することがないと思いますので、設定しなくていいと思います。 仮に、更新されることがあるとした場合に、検討すべきことがあります。 TSは削除する時にいついつ以前に登録されたものを削除するという条件で使います。 なので、データを更新することで現在日時に更新されてしまうと、 登録日時が新しくなるので、延命されることになってしまいます。 更新された、ということを、重要度が上がった、と考えると延命は正しいとも言えます。 ですが、登録日時がいつだったかわからなくなってしまう、ことにもなります。 なので、登録日時とは別に、更新日時の項目も追加して、 それにon update current_timestampを設定するのが一般的な方法かと思います。 ・utf16_general_ciで良いのでしょうか? これはなんとも言えません。 照合順序のせいで登録できないのかどうかを確認するためにサンプルを用意しましたので、 これでエラーがでなければそれでいいと思います。 サーバーのMySQLのバージョンが新しくなったのかもしれないですね。 私なりに簡単に説明しますが、より正確な情報は検索して確かめてください。 MySQLにはutf8に問題がありました。 もともと3バイトまでしか対応していなかったため、 表現できる文字数に問題がありました。 そのため4バイト対応したutf8mb4と言う型が追加されました。 utf8(もしくはutf8mb3)が3バイトで、utf8mb4が4バイトです。 このこととは直接関係はありませんが、 utf16は最初から4バイト対応のためこの問題の影響がありません。 日本語(漢字やひらがななどの全角文字)を使わない場合は、 utf16よりもutf8の方がデータ量が少なくなるらしいのですが、 質問者さまのサイトでは主に日本語が使われると思いますので、 その点から考えてもutf16でいいと思います。
補足
Q.設定した場合は、データを更新した時に現在日時に更新されます。 設定しない場合は、データを更新しても登録時の日時が保持されます。 A.回答ありがとうございます、なるほどそのままで良さそうですね。 Q.なので、登録日時とは別に、更新日時の項目も追加して、 それにon update current_timestampを設定するのが一般的な方法かと思います。 A.解説ありがとうございます。on update current_timestampについて勉強になりました、覚えておきます。 Q.質問者さまのサイトでは主に日本語が使われると思いますので、 その点から考えてもutf16でいいと思います。 A.回答ありがとうございます。仮に掲示板に英語で質問が投稿されると仮定した場合はutf8mb4に変更したほうが良いのでしょうか? utf8は全世界共通で使えると書いてあったのですが…
- dell_OK
- ベストアンサー率13% (766/5720)
「Cannot start session when headers already sent」についてですが、私の環境ではエラーになっていないのが不思議ですが、完全に私のミスです。 これは、ヘッダーが送信された後ではセッションを開始できない、と言うものです。 <p>確認画面</p> のあとで session_start(); をしているのが原因です。 <p>確認画面</p> 自体はヘッダーではありませんが、このように何かしら出力すると、最初にHTTPヘッダーがついて送信されるため、このようなエラーメッセージになっています。 session_start(); を先頭で行なうように修正してアップロードしました。 関係ありませんが、WordPressのヘッダーを出力(get_header())するようにしました。 サイトタイトル表示や、WordPressのスタイルシートおよびスクリプトなどの読み込みのためです。 ヘッダーと言っても、エラーメッセージのヘッダーとはまったく別物なので、混同しないでくださいね。 あと、データベースのテーブルですが、以前のままでよかったですよ。 主キーがないと登録に失敗すると思われます。 私はこれでテーブル作成しています。 ---- CREATE TABLE `sortable` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `TS` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP (), `message` VARCHAR (255) NOT NULL, `namae` VARCHAR (255) NOT NULL, `stamp` INT (11) NOT NULL, `select` INT (11) NOT NULL, PRIMARY KEY (`ID`) ) ---- サンプルコードのSQL文ではnamaeとmessageしか記述していませんが、他の項目はデフォルト値が設定されるので問題ないはずです。
補足
A.修正ありがとうございます。テーブルについて質問があるのですが、TSカラムにはon update current_timestampは設定しなくても良いのでしょうか? messageとnameカラムの照合順序はutf8_general_ciを選択できなくなったのですが、utf16_general_ciで良いのでしょうか? ※現在のテーブル構造 https://imgur.com/xqZTab9.jpg 送信に成功したようです。下記のように表示されました、名前とメッセージ意外と合わせて考えてみます。Javascriptでスタンプ画像とアップロードファイルを送信させるべきかオプションボタンを使うべきかdell_okさんにお聞きしたいと考えています。 登録結果画面 登録しました ID:1 名前 テスト 内容 テスト
- dell_OK
- ベストアンサー率13% (766/5720)
・入力画面から確認画面への遷移コードはどのような形になるのでしょうか? これで遷移しています。 普通のpostとsubmitの組み合わせです。 <form method="post" action="<?php echo home_url('regist'); ?>"> <input type="submit" value="登録結果画面へ進む"> わかるかと思って説明していなかったですが、 そのための準備として、 以下の3つの固定ページを作っていただいて、 テンプレートとパーマリンクは同じで設定しておいてください。 入力画面 input 確認画面 confirm 登録結果画面 regist
補足
アドバイスありがとうございます。 教えて頂いたとおりに修正して実行してみたところ下記のエラーが出ていた為、該当箇所を削除いたしました。 名前 内容 を保存するようにテーブル名sortable、カラムmessage,namaeでデータベースを作成したのですが保存されませんコードに問題があるように見えないのですが、データベースの作成が間違えているのでしょうか? https://imgur.com/H7BXzWa.jpg ※エラー文 Warning: session_start(): Cannot start session when headers already sent in /home/vqnporqs/public_html/wp-content/themes/sample_theme/contact-confirm.php on line 9 Warning: session_start(): Cannot start session when headers already sent in /home/vqnporqs/public_html/wp-content/themes/sample_theme/regist.php on line 9
- dell_OK
- ベストアンサー率13% (766/5720)
データベース登録でエラーが確認できるような簡易版を作ってみました。 エラーメッセージとSQL文を表示するようにしていますので、試してみてください。 ソース https://github.com/dell-GH/min_theme サンプル実行 http://oksample.starfree.jp/wp/
補足
修正ありがとうございます。返信が遅れてしまい申し訳ありません。 コードを頂いて試してみたのですが入力画面から確認画面への遷移コードはどのような形になるのでしょうか? dell_okさんの考えたサンプルページを見たところ名前とメッセージの実行には成功しそうですね、スタンプボタンについてはJavascriptで送信が可能かもしれません。
- dell_OK
- ベストアンサー率13% (766/5720)
・value="'.$post['namae'].'"であれば機能するのでしょうか? 実行されてみたらわかると思いますが、機能しません。 $cleanも$postも同じです。 何も準備もしていない変数は使えません。 もしかして$_POSTのことでしょうか。 それならまだしもですが、それでも機能しません。 $postと$_POSTはまったく違うものです。 しっかり理解して、記述間違いはしないでください。 PHPでは、変数や関数すべてにおいて、 大文字小文字や記号の有無など、 一文字でも違えばまったく別物だと思って、 気を付けてください。 そもそも<input>にvalueを設定したい理由がわかりません。 最初に表示される入力画面は基本的に空っぽのはずです。 valueを設定する目的はなんでしょうか。
補足
回答ありがとうございます。valueから値を送信してそちらを$SESSIONで保持してデータベースに送信するという流れを考えておりました。 あれから色々と考えたのですが、コードを考えてみて再度質問いたします。
- dell_OK
- ベストアンサー率13% (766/5720)
照合順序のせいでエラーにはなりにくいと思うのですが、 その後、解決しましたか。
補足
回答ありがとうございます。まだ解決していない状態です。以前指摘いただいた$cleanの値が空というのも問題なようですね… dell_okさんにお聞きしたいことがあるのですが、下記のコードのようにvalue="'.$post['namae'].'"であれば機能するのでしょうか? <input type="text" name="name" value=""> フォーム部品の name 属性に指定されていたものが使えるという風に書いてあるため$関数['']の関数部分は空でもいいのかと思っていたのですが、2つ目の参考サイトを見ると値が設定されておりました。 $postの場合のみ特にそのようなコードがないため例外なのではと考えているのですが自分ではわからないためアドバイスお願い致します。 ※変更後のコード echo '<input type="text" name="namae" size="40" maxlength="60" value="'.$post['namae'].'" />'; echo '<textarea name="message" cols="40" rows="10" value="'.$post['message'].'" />'; ※ファイル一覧 https://wandbox.org/permlink/avBq1jwraIoPooHn ※参考サイト1 .https://qiita.com/souwasora/questions/47b59e4ed7464b4eca70 .https://www.webdesignleaves.com/pr/php/php_basic_06.php ※参考サイト2 https://gray-code.com/php/make-the-form-vol8/
- dell_OK
- ベストアンサー率13% (766/5720)
・スタンプを戻した状態で確認するボタンを押すと、(ID:0テスト値が入力されていません。テスト) と表示されているのですが還移に失敗しているということでしょうか? finish.phpには行っていると思いますので、 データベースの保存に失敗しているのかも知れません。 成功すればIDが0以外のはずですから。 データベースの環境が何かしらかわりましたか。
補足
Q.finish.phpには行っていると思いますので、 データベースの保存に失敗しているのかも知れません。 成功すればIDが0以外のはずですから。 データベースの環境が何かしらかわりましたか。 A.回答ありがとうございます。環境が変化していたことについてお伝え忘れておりました、申し訳ありません。 messageとnamaeの照合順序についてになるのですが、utf8_genelal_ciがなくなりutf16_genelal_ci以上のみ選択可能になっております。 utf16_genelal_ciに変更したため出力に失敗している可能性が高そうです。 ※以前のデータベース構造 https://imgur.com/EIGKEDG.jpg
- dell_OK
- ベストアンサー率13% (766/5720)
いや、さっきの ! は関係なかったです。
補足
了解いたしました。
- dell_OK
- ベストアンサー率13% (766/5720)
・スタンプ画像が選択できない状態になってしまうのですが、<input>で送る以外に$SESSIONで情報を送ることは可能でしょうか? $clean['stamp']が何も設定されていないからのようです。 使用する前に値を設定しておいてください。 他にも、$clean['namae']や$clean['message']がありますが、 いずれも初登場で、どのような使い方をされるつもりなのか、 私にはわかりませんので、 ひとまず、何かしらの値を設定しておいてください、としか言えません。 確認画面から戻った場合の対応でvalue="~"を記述されているのでしょうか。 確認画面からは history.back() で戻るようにされていますよね。 これで戻るとたいていのブラウザは入力内容を保持してくれているので、 わざわざvalue="~"を設定する必要はないような気がします。 ※これで戻ると$_SESSIONで保持したものを表示できなかったと思います。 ただ、value="~"をやめたとしても、 戻った時にスタンプの選択状態(赤枠)は保持されませんでした。 スタンプの選択値を送信するための隠し項目、 <input type="hidden" name="stamp" id="select"> の値は保持されていますが、選択状態とあっていません。 この対策方法は思いつきません。 こうなると、 スタンプはオプションボタンを使った方がいいような気がしてきます。 試していないのでわかりませんが、こちらだと選択状態も保持されると思います。 ・スタンプを戻した状態で確認するボタンを押すと、(ID:0テスト値が入力されていません。テスト) と表示されているのですが還移に失敗しているということでしょうか? どうでしょうね。 私の方では同じようにならなかったです。 ただ、エラーのチェックに誤りがあるようです。 empty()の前に ! を入れてください。 ---- if (!empty($error_mes)) { require_once 'finish.php'; exit; } ----
補足
Q.$clean['stamp']が何も設定されていないからのようです。 使用する前に値を設定しておいてください。 A.回答ありがとうございます。$clean['stamp']については何かしらの対応が必要になりそうです。名前やメッセージは入力したものを出力できると思うのですが、スタンプはJavascriptで作成しているため'<input type="hidden" name="stamp" id="select" value="'.$clean['stamp'].'" />'で送信できませんでした。 Q.他にも、$clean['namae']や$clean['message']がありますが、 いずれも初登場で、どのような使い方をされるつもりなのか、 私にはわかりませんので、 ひとまず、何かしらの値を設定しておいてください、としか言えません。 A.回答ありがとうございます。参考サイトを見たところ、こちらは送信ボタンを押すことで値を設定せずに取得できるようです。 ※参考サイト https://gray-code.com/php/make-the-form-vol8/ https://web-dev.xyz/php-post/ Q.確認画面から戻った場合の対応でvalue="~"を記述されているのでしょうか。 確認画面からは history.back() で戻るようにされていますよね。 これで戻るとたいていのブラウザは入力内容を保持してくれているので、 わざわざvalue="~"を設定する必要はないような気がします。 ※これで戻ると$_SESSIONで保持したものを表示できなかったと思います。 A.アドバイスありがとうございます。初めて知りました勉強になります。history.back()はブラウザによって機能しなかったりするようなので、併用できるようにコードを足すか別の戻るボタンを作成する方法も考えてみます。 Q.<input type="hidden" name="stamp" id="select"> の値は保持されていますが、選択状態とあっていません。 この対策方法は思いつきません。 A.回答ありがとうございます。別途質問してみます。 Q.こうなると、 スタンプはオプションボタンを使った方がいいような気がしてきます。 試していないのでわかりませんが、こちらだと選択状態も保持されると思います。 A.アドバイスありがとうございます。確かにオプションボタンでも問題ないですかね Q.ただ、エラーのチェックに誤りがあるようです。 empty()の前に ! を入れてください。 ---- if (!empty($error_mes)) { require_once 'finish.php'; exit; } ---- A.アドバイスありがとうございます。修正しておきました。
- 1
- 2
お礼
https://okwave.jp/qa/q10135525.html 申し訳ありません。質問の回答期限が切れてしまったので、上記のリンクから引き続きよろしくお願い致します。
補足
回答ありがとうございます。スタンプ画像はオプションボタンでも考えてみます。 Javascriptでスタンプを送信する場合のコードになるのですが、下記のようになっております。 https://wandbox.org/permlink/xgiSHSJPTNlBrtmO アップロードファイルについてアドバイスを頂きながら作成していたのですが、動画とPDFについて意味が分からず止まっています。 contact-confirm.phpの40行目から53行目になるのですが、下記のように変更してみました。 $mime_type から $ext を決めて、テンポラリファイルを $data に読み込めばPDFと動画にも適応できるようです。間違えていたらアドバイスお願い致します。 以前dell_okさんにバイナリーデータがどうしても必要だとお伝えしていたのですが、finfo_open(finfoクラス)はmime_typeを返すのに、拡張子では判断せずバイナリを読み込んでチェックするのでバイナリーのチェックは要らないようですね、申し訳ありません。 名前とメッセージはエラーチェックやtokenがあるためdell_okさんから教えて頂いたコードを使うように考えています。 アップロードファイルについてはおそらくこちらのコードを使うか参考に組み替える必要があると考えております。 ※参考サイト https://tomosta.jp/2022/11/php%E3%81%AEfileinfo%EF%BC%88finfo%EF%BC%89%E3%81%A7%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%82%88%E3%81%86/ //mime_typeを返すのに、拡張子では判断せずバイナリを読み込んでチェック //ファイルの種類を表示するために宣言 $finfo = new finfo(FILEINFO_MIME_TYPE); $mime_type = $finfo->file($path); 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($path); if (FILE_EXT_PDF == $ext && 'application/pdf' == $mime_type) { } elseif (FILE_EXT_MP4 == $ext && 'video/mp4' == $mime_type) { } else { $ext = null; } } return $ext; if (isset($ext)) { $_SESSION['attach_name'][$key] = md5($data) . $ext; $_SESSION['attach_data'][$key] = $data; $_SESSION['attach_mime'][$key] = $mime_type; } else $err[] = '画像形式は png, jpg のみです。'; } } }