47182


下記insert_member.phpのエラーログで、108行目近辺に記述ミスがないかを探してますが、何が間違っているのかが何度確認しても掴めませんのでどなたかご回答して下さいませんか。

また、効率的にエラーを見つけるツールや方法などありましたら教えて頂けると幸いです。  
宜しくお願いします。

[![画像の説明をここに入力](https://i.stack.imgur.com/K80Lk.png)](https://i.stack.imgur.com/K80Lk.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/I5z9V.png)](https://i.stack.imgur.com/I5z9V.png)

エラーログ

[code]

       [02-Aug-2018 05:14:53 UTC] PHP Parse error:  syntax error, unexpected 'else' (T_ELSE) in /Applications/MAMP/htdocs/insert_member.php on line 108  
    
[/code]

insert_member.php

[code]

    <?php
        require_once("util.php");
         $gobackURL = "insertform.html";
    
         //文字エンコードの検証
         if (!cken($_POST)) {
            header("Location:{$gobackURL}");
            exit();
         }
    
         //簡単なエラー処理
         $errors = [];
         if(!isset($_POST[ "name" ]) || ($_POST[ "name" ]==="")){
            $errors[] = "名前が空です。";
        }
         if (!isset($_POST[ "age" ]) || (!ctype_digit($_POST[ "age" ] ))){
            $errors[] = "年齢には数値を入れてください。";
        }
         if (!isset($_POST[ "sex" ]) || !in_array($_POST[ "sex" ] , ["男","女"] )) {
            $errors[] = "性別が男または女ではありません。";
        }
    
         //エラーがあった時
          if (count($errors)>0){
              echo '<ol class="error">';
              foreach ($errors as $value) {
                  echo "<li>", $value , "</li>";
            }
            echo "</ol>";
            echo "<hr>";
            echo "<a href=", $gobackURL, ">戻る</a>";
            exit();
            }
    
          //データベースユーザ
            $user = 'root';
            $password = 'root';
            //利用するデータベース
            $dbName = 'personal';
            //MySQLサーバ
            $host = 'localhost:3306';
            //MySQLのDSN文字列
            $dsn ="mysql:host={$host};dbname={$dbName};charset=utf8";
        ?>
    
        <!DOCTYPE html>
        <html lang="ja">
        <head>
        <meta charset="utf-8">
        <title>レコード追加</title>
        <link href="../../css/style.css" rel="stylesheet">
    
        <link href="../../css/tablestyle.css" rel="stylesheet">
        </head>
        <body>
        <div>
           <?php
           $name = $_POST[ "name" ];
           $age = $_POST[ "age" ];
           $sex = $_POST[ "sex" ];   
           //MySQLデータベースに接続する
            try {
                $pdo = new PDO($dsn, $user, $password);
                //プリペアドステートメントのエミュレーションを無効にする
                $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
                //例外がスローされる設定にする
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
                //SQL文を作る
                $sql = "INSERT INTO member (name, age, sex) VALUE (:name, :age, :sex)";
                //プリペアドステートメントを作る
                $stm = $pdo->prepare($sql);
                //プレースホルダに値をバインドする
                $stm->bindValue(':name', $name, PDO::PARAM_STR);
                $stm->bindValue(':age', $age, PDO::PARAM_INT);
                $stm->bindValue(':sex', $sex, PDO::PARAM_STR);
                //SQL文を実行する
                if ($stm->execute()); {
                //レコード追加後のレコードリストを取得する
                $sql= "SELECT * FROM member";
                 //プリペアドステートメントを作る
                $stm = $pdo->prepare($sql);
                //SQL文を実行する
                $stm->execute(); 
                //結果の取得(連想配列で受け取る)
                $result = $stm->fetchALL(PDO::FETCH_ASSOC);
                //テーブルのタイトル行
                echo "<table>";
                echo "<thead><tr>";
                echo "<th>","ID","</th>";
                echo "<th>","名前","</th>";
                echo "<th>","年齢","</th>";        
                echo "<th>","性別","</th>";
                echo "</tr></thead>";
                //値を取り出して行に表示する
                echo "<tbody>";
                foreach ($result as $row) {
                 //1行ずつテーブルに入れる
                echo "<tr>";
                echo "<td>", es($row[ 'id' ]), "</td>";
                echo "<td>", es($row[ 'name' ]), "</td>";
                echo "<td>", es($row[ 'age' ]), "</td>";
                echo "<td>", es($row[ 'sex' ]), "</td>";
                echo "</tr>";
                }
                echo "</tbody>!";
                echo "</table>";
                } else {
                echo '<span class="error">追加エラーがありました。</span><br>';
              };
              } catch (Exception $e) {  
                        echo '<span class="error">エラーがありました。</span><br>';
                echo $e->getMessage();
            }
        ?>
            <hr>
             <p><a href="<?php echo $gobackURL ?>">戻る</a></p> 
        </div>
        </body>        
        </html>
    
[/code]


CC BY-SA 4.0
2018-08-02T05:21:04.280
47176
2018-08-02T06:16:25.290
29530
question
php mysql
POSTされた値で新規レコードを追加したい。


78行目の

[code]

    if ($stm->execute()); {
    
[/code]

のセミコロンを外して

[code]

    if ($stm->execute()) {
    
[/code]

にしてみてください。

78行目のif文にセミコロンがついていることで、その場でifのブロックが終わってしまい、  
108行目のelseがif構文なしに突然出てきているためエラーになっているのだと思います。

余談ですが、しっかりとインデントを意識したほうが良いです。


CC BY-SA 4.0
2018-08-02T05:27:25.510
47177
2018-08-02T05:27:25.510
17014
47176
answer


> 効率的にエラーを見つけるツールや方法などありましたら

エラーが何か表示された=即「分からない」で済ませず、エラーメッセージをよく読みましょう。エラーメッセージはいじわるで表示されているわけではなく、
**必ず意味があります** 。

今回ならエラーメッセージで「108行目付近」「elseに関する場所」とあたりがついていますよね？  
ファイル名や行数の部分を除いた箇所をそのままgoogle等で検索したり、英和翻訳するだけでもヒントが見つかる場合があります。

[code]

    PHP Parse error:  syntax error, unexpected 'else' (T_ELSE) 
        in /Applications/MAMP/htdocs/insert_member.php on line 108
    
[/code]

* * *

プログラムの構文をハイライトしてくれるエディタを使用しましょう。あわせてインデントも揃えることで小さなミスに気づきやすくなります。

* * *

HTMLやJavaScriptを埋め込んでいる場合等はうまくいかないかもしれませんが、PHPならいきなりブラウザから実行するのではなく、文法チェックも心がけましょう。

[code]

    $ php -l FILE.php
    
[/code]

参考：  
[php_check_syntax — 指定したファイルの文法チェック（と実行）を行う
](http://php.net/manual/ja/function.php-check-syntax.php)

* * *

質問を行うこと自体は否定しませんが、他人に聞くより先にまずは自身で調べる癖をつけることを強くおすすめします。


CC BY-SA 4.0
2018-08-02T06:16:25.290
47182
2018-08-02T06:16:25.290
3060
47176
answer