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

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

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

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

Q&A

解決済

4回答

1086閲覧

【PHP】POSTの痩身がうまくいきません。

Python.R

総合スコア28

PHP

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

0グッド

1クリップ

投稿2019/05/26 17:31

編集2019/05/26 23:51

まず、下記のコードを参照していただきたいのですが、「elseif (isset($_POST['direct_send']))」はしっかり機能するのですが、「if (isset($_POST['reservation_send']))」の方が機能しません。「<input type="submit" name="reservation_send" value="登録">」で、送信しても、「if (isset($_POST['reservation_send']))」の部分で、「$_POST['reservation_send']」がないので、以下データベースへの処理が実行されません。検証したところ、「$_POST['reservation_send']」がそもそもセットされないようでした。何故これだけ機能しないのかわかりません。

PHP

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <title>メール配信スタンド尾</title> 6 <link rel="stylesheet" href="style.css"> 7 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 8 <?php 9 $message = $_POST['reservation_send']; 10 if (isset($_POST['reservation_send'])) { 11 // メール配信予約時の処理 12 $message = "if文で判定できています。"; 13 $mysqli = new mysqli('mysql*****', '**********', 14 '*********', '********_magazin'); 15 if ($mysqli->connect_errno) { 16 $message = $mysqli->connect_errno . ' : ' . $mysqli->connect_error; 17 }else { 18 $message = "接続成功!"; 19 } 20 $mysqli->set_charset('utf8'); 21 22 $title = htmlspecialchars($_POST['title']); 23 $content = htmlspecialchars($_POST['content']); 24 25 $sql = "INSERT INTO reservation_mail ( 26 subject, message, send_date 27 ) VALUES ( 28 $title, $content, '2019-05-27 00:00:00' 29 )"; 30 $flag = $mysqli->query($sql); 31 $message += $flag; 32 if ($flag) { 33 $message += "<br/>登録処理が完了しましあ。"; 34 }else { 35 $message += "<br/>登録に失敗しました。"; 36 } 37 $mysqli->close(); 38 39 }elseif (isset($_POST['direct_send'])) { 40 // ダイレクトメール送信時の処理 41 require_once 'PHPMailer_setting.php'; 42 43 //メール本体 44 $message = htmlspecialchars($_POST['content']);//メール本文 45 $mailer->From = 'magazin@*******'; //差出人の設定 46 $mailer->FromName = mb_convert_encoding("メール配信スタンド","UTF-8","AUTO");//表示名おまじない付… 47 $mailer->Subject = mb_convert_encoding($_POST['title'],"UTF-8","AUTO");//件名の設定 48 $mailer->Body = mb_convert_encoding($message,"UTF-8","AUTO");//メッセージ本体 49 $mailer->AddAddress('********@yahoo.co.jp'); // To宛先 50 51 //送信する 52 if($mailer->Send()){ 53 $message = "メールが送信されました。"; 54 } 55 else{ 56 $message = "メール送信失敗"; 57 echo "送信に失敗しました" . $mailer->ErrorInfo; 58 } 59 } 60 ?> 61 </head> 62 <body> 63 <header> 64 <div class="header_content"> 65 <h1>メール配信スタンド</h1> 66 </div> 67 <ul class="navi_menu"> 68 <li><a href=".">メール配信予約</a></li> 69 <li><a href="?list=2">配信メールの一覧・編集</a></li> 70 <li><a href="?direct=3">ダイレクトメール</a></li> 71 </ul> 72 </header> 73 <div class="main-wrapper"> 74 <?php if (isset($_GET['direct'])): ?> 75 <?php require_once('direct_mail.php'); ?> 76 <?php elseif (isset($_GET['list'])): ?> 77 <?php require_once('mail_list.php'); ?> 78 <?php else: ?> 79 <?php require_once('reservation_mail.php'); ?> 80 <?php endif; ?> 81 </div> 82 <footer> 83 84 </footer> 85 <script type="text/javascript" src="script.js"></script> 86 </body> 87</html>

「require_once('reservation_mail.php')」で読み込むファイル

PHP

1<div class="main_content"> 2 <?php if ($message != ""): ?> 3 <span><?php echo "メッセージ:".$message; ?></span> 4 <?php endif; ?> 5 <h2>メール配信予約</h2> 6 <form action="" method="post"> 7 <p><label>予約配信の設定: 8 <input type="number" min="<?php echo date('Y'); ?>" placeholder="ここに年の入力" max="9999" value="2019" name="year">&thinsp;&thinsp; 9 <input type="number" min="1" max="12" placeholder="ここに月の入力" value="1" name="month">&thinsp;&thinsp; 10 <input type="number" min="1" max="31" placeholder="ここに日にちの入力" value="1" name="date">&thinsp;&thinsp; 11 <input type="number" min="0" max="23" placeholder="ここに時間の入力" value="0" name="hour">&thinsp;&thinsp; 12 </label></p> 13 <p><label>メールタイトル<br/> 14 <input type="text" name="title" placeholder="ここにメールタイトルの入力"></label></p> 15 <p><label>メール本文<br/> 16 <textarea name="content" placeholder="ここにメール本文の入力"></textarea></label></p> 17 <center><p><input type="submit" name="reservation_send" value="登録"></p></center> 18 </form> 19</div>

「require_once('direct_mail.php');」で読み込んでいるファイル。

PHP

1<div class="main_content"> 2 <?php if ($message != ""): ?> 3 <span><?php echo $message; ?></span> 4 <?php endif; ?> 5 <h2>ダイレクトメール</h2> 6 <form action="" method="post"> 7 <p><label>メールタイトル<br/> 8 <input type="text" name="title" placeholder="ここにメールタイトルの入力"></label></p> 9 <p><label>メール本文<br/> 10 <textarea placeholder="ここにメール本文の入力" name="content"></textarea></label></p> 11 <center><p><input type="submit" name="direct_send" value="送信"></p></center> 12 </form> 13</div>

他「require_once('mail_list.php');」ですが、まだ処理を記述していない状態です。

また、アクセスしているディレクトリーとファイル一覧は下記の通りになります。


PHPMailer // メールライブラリ
PHPMailer_setting.php // メールライブラリの設定に使用。
direct_mail.php
mail_list.php // まだファイル自体は空です。
reservation_mail.php
index.php


主には、index.php内で処理を完結している形になるでしょうか。

かなり複雑なコードになってしまいますが、問題点がありましらご教授いただきたいです。

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

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

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

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

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

m.ts10806

2019/05/26 21:13

includeされているファイルを一通りすべてと実際にアクセスしているURL(ドメイン部分はなくても良いですが)をご提示いただいたほうが良いかもしれませんね。 また「reservation_sendを送信しているつもりのHTML」にはきちんとformに「reservation_send」が入っていますか?ブラウザ「ソースを表示」で確認してみてください
m.ts10806

2019/05/26 21:13

あとタイトル「POSTの痩身」って何でしょう?
Python.R

2019/05/26 23:54

回答ありがとうございます。 「reservation_send」については、ソースで確認したところ、問題なく表示はされていました。 すみません。POSTの送信ではなく、POSTデータの受け取りでしょうか。
m.ts10806

2019/05/26 23:59

>すみません。POSTの送信ではなく、POSTデータの受け取りでしょうか。 そもそも誤字(?)なので意味が分からなくなっているということなのですが、 何を伝えたいのかによるので、伝えたいことを伝えられるような表現にしてもらえればと。
m.ts10806

2019/05/27 00:04

あと、mail_list.phpはなしですか? どこに原因があるかつきつめるためには一通り関連するコードはご提示いただきたいのですが・・。
m.ts10806

2019/05/27 00:07

ちなみに、ボタン押すと if (isset($_POST['reservation_send'])) { に入ってきてます。 セキュリティ的な考慮が抜けているところ諸々気になるところはありますが、 そこはひとまずとして、「「$_POST['reservation_send']」がそもそもセットされない」という現象は再現しません。
m.ts10806

2019/05/27 00:08

下記のようにしてreservation_sendのボタンを押すと「登録」と出ますね。 $message = $_POST['reservation_send']; if (isset($_POST['reservation_send'])) { echo $_POST['reservation_send']; exit;
Python.R

2019/05/27 00:22

すみません。本文にも記載したと思いますが、「mail_list.php」については、まだ空(コードを書いていない)の状態なので、省略しました。 >そこはひとまずとして、「「$_POST['reservation_send']」がそもそもセットされない」という現象は再現しません。 実際にコードを見る限りありえないのですが、 $message = $_POST['reservation_send']; if (isset($_POST['reservation_send'])) { echo $_POST['reservation_send']; exit; のように試しても、$_POST['reservation_send']は空のままになっています。
m.ts10806

2019/05/27 00:25

「ありえない」の意味が分かりませんが、同じコードを利用して「登録」ボタンを押したときに私の方では「登録」と表示されていないので何とも。 ※ありえないといえば、isset()で確認できてないのに「$message = $_POST['reservation_send'];」が書いてあることがありえないですけど・・ せめて下記のvar_dump()の結果をそのまま載せてください。 var_dump($_POST); $message = $_POST['reservation_send'];
m.ts10806

2019/05/27 00:29

「メール配信予約」のフォームに他もinputがあってそれぞれnameが指定されている以上、「何も表示できない状況」というのがありえません。
m.ts10806

2019/05/27 00:34

あとは、「どういう操作をして確認しているのか」「URL」「それぞれの操作をした結果の画面キャプチャ」「PHPのバージョン」「PHPが動作しているサーバー環境、構築手法」などなど一通りご提示いただくしかないように思います。 同じコードで操作をして結果が異なる以上、どこで差異があるかを確かめないことにはここから進まないので。 (あと「うまくいかない」は起きている現象が何も伝わらないので控えたほうが良いです。起きている現象は具体的に、そのまま書きましょう。 https://teratail.com/help/question-tips#questionTips3-4
Python.R

2019/05/27 00:41

var_dump($_POST); $message = $_POST['reservation_send']; で、表示させようとしても、$_POST['reservation_send']の中身が空なのか、何も表示されないのです。 「direct_send」の方で、var_dump($_POST);をすると、 array(3) { ["title"]=> string(21) "はじめまして。" ["content"]=> string(9) "テスト" ["direct_send"]=> string(6) "送信" } と表示されます。 「direct_send」の挙動は正常なのですが、「reservation_send」は押しても$_POSTの中身が空のままなので、これだけ挙動がおかしいです。
m.ts10806

2019/05/27 00:50

私の2019/05/27 09:34を確認して情報追記してください。 あと「reservation_mail.php」、つまりGETに何も指定していない時でしょうけど、そのときにHTMLをブラウザ「ソースを表示」で確認してください。 何度も言っていますがformのsubmitを行っているのでしたら$_POSTで何も表示されないという状況がありえません。せめてnullとかarray{}とかは表示されるはずです。「送信の動作を行っていないのでは」くらいの仮説しか立てられないです。同じコードで実行できている状況を何度かお伝えしていますが「何が違うんだろう」と思いませんか?自身の環境と操作手順をすべて提示するしかないです。 2019/05/27 09:34にて私が指定した情報の追記と、ブラウザ「ソースを表示」した結果のHTMLをご提示ください。
yoorwm

2019/05/27 00:59

てっきり、POSTで送信するデータが多すぎるんで間引くアイディアでも募集してるのかと思いました。
m.ts10806

2019/05/27 01:09

yoorwmさん タイトルだけ見るとそう感じますね(内容はもちろんだけどタイトルも大事ですね)
退会済みユーザー

退会済みユーザー

2019/05/27 03:51

ほぉほぉ、質問文は直しても、質問タイトルは直さない、と。痩せたいんだな!
guest

回答4

0

reservation_sendを含むformのactionが空になってるけど、
POST送信先が別ファイルなのだとしたら指定していないからそのファイルに受信できてない、
なんてことはないかな。

検証のために、多少ガバガバだけど、こんなコードを書いてみた。

php

1///191520.php 2<html> 3<head> 4</head> 5<body> 6<?php 7 var_dump($_POST); 8?> 9 <form action="" method="post"> 10 <p><label>予約配信の設定: 11 <input type="number" min="<?php echo date('Y'); ?>" placeholder="ここに年の入力" max="9999" value="2019" name="year">&thinsp;&thinsp; 12 <input type="number" min="1" max="12" placeholder="ここに月の入力" value="1" name="month">&thinsp;&thinsp; 13 <input type="number" min="1" max="31" placeholder="ここに日にちの入力" value="1" name="date">&thinsp;&thinsp; 14 <input type="number" min="0" max="23" placeholder="ここに時間の入力" value="0" name="hour">&thinsp;&thinsp; 15 </label></p> 16 <p><label>メールタイトル<br/> 17 <input type="text" name="title" placeholder="ここにメールタイトルの入力"></label></p> 18 <p><label>メール本文<br/> 19 <textarea name="content" placeholder="ここにメール本文の入力"></textarea></label></p> 20 <center><p><input type="submit" name="reservation_send" value="登録"></p></center> 21 </form> 22</body> 23</html>

登録ボタンを押したあとの表示例:
POSTボタン押下後
POST受信できていることは確認できるが、
自分自身のファイル宛に送信しているからであって。
たとえ自分自身宛だとしても、actionが空欄になっているのは落ち着かないので、
記入してみるといいよ。
requireで別ディレクトリのファイルを読み込んだりしていて
ディレクトリ階層が混乱する場合もあるし。

編集したファイルが適切に実行環境に反映されているか(アップロードしてあるか)も含めて点検を。

投稿2019/05/27 00:55

編集2019/05/27 01:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

自己解決

原因ますか、PHPのコード自体コメントアウトしていたため、気づくのが遅くなりました。

「reservation_send」したときに、「Warning: A non-numeric value encountered」が発生していました。if文も機能していたようです。
line 31 : $message += $flag; ⇒ $message .= $flag;
line 33 : $message += "<br/>登録処理が完了しましあ。"; ⇒ $message .= "<br/>登録処理が完了しましあ。";
line 35 : $message += "<br/>登録に失敗しました。"; ⇒ $message .= "<br/>登録に失敗しました。";

上記のように修正したところ、処理が通りました。

また、var_dump()で表示できなかった件については、原因は現段階で分かっておりませんが、現在は表示されております。

こちらの不備で多大な苦労をかけてしデータベースございません。

回答いただいた皆様、ありがとうございました。

データベースへの処理は成功

投稿2019/05/27 02:13

編集2019/05/27 02:31
Python.R

総合スコア28

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

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

m.ts10806

2019/05/27 02:22

そのWarningとPOST送信は問題としては別物ですね。 やはりPHPバージョン含めて具体的な再現手順をご提示いただくしかないように思います(次回以降必ず初めから書いておいてください)
Python.R

2019/05/27 02:26

承知しました。
guest

0

当方環境にて再現していません。
手順とデバッグを再考してください。

環境:
PHP 7.2.16
Windows10 XAMPP 7.2.16

にて同ソースで確認を行ったところ(PHPメーラ部分はコメントアウト)
初期画面(クエリストリングなし)下記
イメージ説明
そのHTMLソース(ブラウザ「ソースを表示」)下記

html

1 2<!DOCTYPE html> 3<html lang="ja"> 4 <head> 5 <meta charset="utf-8"> 6 <title>メール配信スタンド尾</title> 7 <link rel="stylesheet" href="style.css"> 8 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 9 <br /> 10<b>Notice</b>: Undefined index: reservation_send in <b>C:XXXX.php</b> on line <b>9</b><br /> 11 </head> 12 <body> 13 <header> 14 <div class="header_content"> 15 <h1>メール配信スタンド</h1> 16 </div> 17 <ul class="navi_menu"> 18 <li><a href=".">メール配信予約</a></li> 19 <li><a href="?list=2">配信メールの一覧・編集</a></li> 20 <li><a href="?direct=3">ダイレクトメール</a></li> 21 </ul> 22 </header> 23 <div class="main-wrapper"> 24 <div class="main_content"> 25 <h2>メール配信予約</h2> 26 <form action="" method="post"> 27 <p><label>予約配信の設定: 28 <input type="number" min="2019" placeholder="ここに年の入力" max="9999" value="2019" name="year">&thinsp;&thinsp; 29 <input type="number" min="1" max="12" placeholder="ここに月の入力" value="1" name="month">&thinsp;&thinsp; 30 <input type="number" min="1" max="31" placeholder="ここに日にちの入力" value="1" name="date">&thinsp;&thinsp; 31 <input type="number" min="0" max="23" placeholder="ここに時間の入力" value="0" name="hour">&thinsp;&thinsp; 32 </label></p> 33 <p><label>メールタイトル<br/> 34 <input type="text" name="title" placeholder="ここにメールタイトルの入力"></label></p> 35 <p><label>メール本文<br/> 36 <textarea name="content" placeholder="ここにメール本文の入力"></textarea></label></p> 37 <center><p><input type="submit" name="reservation_send" value="登録"></p></center> 38 </form> 39</div> </div> 40 <footer> 41 42 </footer> 43 <script type="text/javascript" src="script.js"></script> 44 </body> 45</html>

ブラウザで実行しているプログラムに$_POSTの内容を出力
reservation_sendに入ったときに出力してexitするコードを入れて

php

1 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 2 <?php 3 var_dump($_POST); 4 if (isset($_POST['reservation_send'])) { 5 echo 'reservation_send'; 6 exit;

画面上の「送信」ボタンを押下

結果

array(7) { ["year"]=> string(4) "2019" ["month"]=> string(1) "1" ["date"]=> string(1) "1" ["hour"]=> string(1) "0" ["title"]=> string(0) "" ["content"]=> string(0) "" ["reservation_send"]=> string(6) "登録" } reservation_send

イメージ説明

ちなみに「ダイレクトメール(?direct=3)」では下記。

array(3) { ["title"]=> string(0) "" ["content"]=> string(0) "" ["direct_send"]=> string(6) "送信" }

投稿2019/05/27 01:06

編集2019/05/27 02:05
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2019/05/27 01:12

画像にあるNoticeは、isset()で点検する前に $message = $_POST['reservation_send']; で参照しているからだよね。 再現できないからエディタで開いているファイルと実行環境の不一致を疑いたくもなる。
m.ts10806

2019/05/27 01:17

そうですね。 「追記修正依頼」でもちょっと触れたのですがisset()の前に参照する実装がありえないなと(変数に受け取ってるからデバッグのためではなさそうですし) 変数が空でも未定義以外は何か出力するvar_dump()で何も出ないというのもありえないので操作手順と環境の差異をチェックしていくしかないと思いました。 今回の場合、いっそ「別のフォームだから別プログラムにしてinclude」じゃなくて「全フォーム1ファイル」に書いたほうが分かりやすくなりそうです。
guest

0

$_POST の中身を全部表示してみましょう。
var_dump() でもなんでもいいです。

投稿2019/05/26 22:50

takasima20

総合スコア7458

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

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

Python.R

2019/05/27 00:15

回答ありがとうございます。 「reservation_send」の送信時には、var_dampで表示を試みても、「$_POST['reservation_send']」が空なので、何も表示できない状況です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問