名前とメールアドレスとお問い合わせの３項目を入力しないと送信できないようにしたいのですが、send.phpとゆうファイルの所にmail関数、isset関数を定義してissetの方に値があればtrue、なければfalthにしたいのですがうまく行きません。解決方法教えてもらえますでしょうか。

**index.php**

```

    <form action="send.php" method="POST">
            <div class="form-content pt-5">
              <div class="form-left ">
                <div class="form-group">
                  <input type="text" class="form-control" name="name" placeholder="名前">
                </div>
                <div class="form-group mt-5">
                  <input type="text" class="form-control" name="email" placeholder="メールアドレス">
                </div>
              </div>
              <div class="form-right">
                <div class="form-group">
                  <textarea class="form-control" name="message" placeholder="お問い合わせ" rows="10"></textarea>
                </div>
              </div>
            </div>
            <p><input type="submit" name="submit" value="上記の内容で送信する" class="text-center" id="button"></p>
          </form>
    
```

**send.php**

```

    <?php
    
    if (isset($_POST['submit'])) {
        $name = $_POST['name'];
        $emailFrom = $_POST['email'];
        $message = $_POST['message'];
    
        $mailTo = "example@example.com";
        $headers = "From: ".$emailFrom;
        $txt ="You have received an e-mail from " .$name.".\n\n".$message;
    
        if (mail($mailTo, $headers , $txt) && isset($mailTo, $headers , $txt)) {
            echo "<h1>お問い合わせありがとうございます"." ".$name."様。折り返し<br>連絡いたしますので、今しばらくお待ちください。</h1>";
    
        } else {
            echo "<h1 class='text-danger'>送信できませんでした。全項目ご入力ください。</h1>";
    
        }
    
    }
    
```
CC BY-SA 4.0
2020-05-25T16:12:57.427
66982
2020-05-27T05:07:58.750
2020-05-27T05:07:58.750
3060
40290
question
php html
コンタクトフォームで複数の項目を入力必須にしたい
ifの条件で、mail関数を実行しています。  
入力の有無などの検証後に、mail送信を実行すると良いでしょう。

```

    　
    if(isset($mailTo, $headers , $txt)) {
        if ( mail( $mailTo, $headers, $txt ) ) {
            echo "お問い合わせありがとうございます" . " " . $name . "様。折り返し連絡いたしますので、今しばらくお待ちください。";
        } else {
            echo "送信できませんでした。全項目ご入力ください。";
        }
    }
    
```
CC BY-SA 4.0
2020-05-27T00:18:05.980
67016
2020-05-27T00:18:05.980
22793
66982
answer
isset関数とmail関数との仕様を見直し、さらにHTMLのフォームの仕様を理解して、やりたい条件を確認しましょう。ちょっと長くて説明的ですが、これを理解しないとPHPの基礎の部分になりますので是非理解してください。

> 名前とメールアドレスとお問い合わせの３項目を入力しないと送信できないようにしたい

もうちょっとプログラム的な条件に落とし込むと

> 「$_POST['name']が空じゃない」かつ「$_POST['email']が空じゃない」かつ 「$_POST['message']が空じゃない」

かと思います。

しかしソースコード中のif分を見てみると

```

    mail($mailTo, $headers , $txt) && isset($mailTo, $headers , $txt)
    
```

とあり

> 「mail関数の結果が真」かつ「$mailTo, $headers , $txtそれぞれがnullでない」

という条件になります  
php: mail関数が偽になる条件としてはマニュアルによると  
<https://www.php.net/manual/ja/function.mail.php>

> メール送信が受け入れられた場合に TRUE 、それ以外の場合に FALSE を返します。  
>  メールの配送が受け入れられたかどうかが基準であることに注意しましょう。 メールが実際にあて先に届いたかどうかでは「ありません」。

とあるので、この関数を呼び出した時点でメールの送信が試みてしまいます。

またissetも  
<https://www.php.net/manual/ja/function.isset.php>

> var が存在して NULL 以外の値をとれば TRUE、 そうでなければ FALSE を返します。

とありますが、  
直前の部分で

```

    $mailTo = "example@example.com";
    $headers = "From: ".$emailFrom;
    $txt ="You have received an e-mail from " .$name.".\n\n".$message;
    
```

それぞれの変数にnull以外の値を代入しているのでissetがfalseになることはないです。

さらにHTMLのフォームの仕様としてPOSTしてくるデータはnullになることはないです。  
入力データがないと空文字で送信されます。空文字とnullは違いますのでご注意ください。  
つまりPOSTデータのデータのチェックでissetは使えないということになります。

ではどのように記述するかというと

```

    $name = $_POST['name'];
    $emailFrom = $_POST['email'];
    $message = $_POST['message'];
    
    if($name != "" && $emailFrom != "" && $message != "")) {
       //すべての入力値が空じゃない場合にメールの生成処理
       $mailTo = "example@example.com";
       $headers = "From: ".$emailFrom;
       $txt ="You have received an e-mail from " .$name.".\n\n".$message;
        if ( mail( $mailTo, $headers, $txt ) ) {
            //メール送信完了の処理
        } else {
            //メール送信失敗の処理
        }
    }else {
        //ここは一つでも空の値がある場合の処理
    }
    
```

となります。  
さらにはメールフォーマットのチェックや、エラーメッセージのXSS対策なども必要になってくるとは思います。引き続きマニュアルを確認しながらやってみてください。
CC BY-SA 4.0
2020-05-27T01:12:42.617
67018
2020-05-27T01:12:42.617
22665
66982
answer