@Tarzan3154

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHPのformで入力した内容をMySQLに保存したい。

解決したいこと

MySQLで作成したDBをPHPで表示させるプログラムを作っています。
(登録する内容としては、PCの端末情報を登録する資産管理データです)
端末テーブルに新規端末登録のリンクを用意してPHPのformから入力した情報を
MySQLに保存するようにしたいのですが、
入力画面→確認画面まではいくのですが、確認画面→入力完了画面と遷移する際に
例外処理として指定した
「端末名が重複しています : 入力し直してください」
と値が重複していなくても表示され、入力した情報も保存されません。
特にreg端末.phpで値を受け取る記述の仕方についてご教示をお願いします。

発生している問題・エラー

入力した新規端末情報(terminal~years)を端末テーブルに正常に保存したい。
端末名が重複していない場合に例外処理が発生しないようにしたい。

該当するソースコード

端末.php

<?php
try {
    $db = new PDO ('mysql:dbname=XXXX;host=127.0.0.1;charset=utf8', 'root','');
} catch (PDOException $e) {
    echo 'DB接続エラー : ' . $e->getMessage();
}
$端末 = $db ->query('SELECT * FROM 端末');
?>

<!DOCTYPE html>
<html>
<head>
<title>端末テーブル表示</title>
<meta charset="utf-8">
</head>
<body>
<h1>端末テーブル</h1> 
<table border='1'>
<tr><th>端末名</th><th>ユーザID</th>
    <th>型番</th><th>コンピュータ名</th>
    <th>シリアル</th><th>学校ID</th>
    <th>耐用年数</th><th>導入年月</th>
    <th>使用年数</th></tr>

<form action="input端末.php" method="post"> 
    <input type="submit" value="新規端末登録">
</form>

<?php 
foreach($端末 as $row){
?> 
<tr> 
    <td><?php echo $row['terminal']; ?></td> 
    <td><?php echo $row['userid']; ?></td> 
    <td><?php echo $row['model']; ?></td> 
    <td><?php echo $row['computer']; ?></td> 
    <td><?php echo $row['serial']; ?></td> 
    <td><?php echo $row['schoolid']; ?></td> 
    <td><?php echo $row['service']; ?></td> 
    <td><?php echo $row['introduced']; ?></td> 
    <td><?php echo $row['years']; ?></td> 
</tr> 
<?php 
} 
?>

</table>

</body>
</html>
input端末.php

<?php
try {
    $db = new PDO ('mysql:dbname=XXXX;host=127.0.0.1;charset=utf8', 'root','');

} catch (PDOException $e) {
    echo 'DB接続エラー : ' . $e->getMessage();
}
?>

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>新規端末登録</title>
  </head>
  <body>
 
    <h1>新規登録画面</h1>

    <form action="端末.php" method="post"> 
      <input type="submit" value="戻る">
    </form>
 
    <form action="confirm端末.php" method="post">
      端末名<br>
      <input type="text" name="terminal"><br>
 
      ユーザID<br>
      <input type="text" name="userid"><br>

      型番<br>
      <input type="text" name="model"><br>

      コンピュータ名<br>
      <input type="text" name="computer"><br>

      シリアル<br>
      <input type="text" name="serial"><br>

      学校ID<br>
      <input type="text" name="schoolid"><br>

      耐用年数<br>
      <input type="text" name="servie"><br>

      導入年月<br>
      <input type="text" name="introduced"><br>

      使用年数<br>
      <input type="text" name="years"><br>
 
      <input type="submit" value="確認">
    </form>
 
  </body>
</html>
confirm端末.php

<?php
try {
    $db = new PDO ('mysql:dbname=XXXX;host=127.0.0.1;charset=utf8', 'root','');

} catch (PDOException $e) {
    echo 'DB接続エラー : ' . $e->getMessage();
}
$terminal = $_POST['terminal'];
$userid = $_POST['userid'];
$model = $_POST['model'];
$computer = $_POST['computer'];
$serial = $_POST['serial'];
$schoolid = $_POST['schoolid'];
$servie = $_POST['servie'];
$introduced = $_POST['introduced'];
$years = $_POST['years'];
?>

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>確認ページ</title>
  </head>
  <body>
 
    <h1>確認画面</h1>

    <h3>下記の情報で登録しますがよろしいですか?</h3>
 
    <form action="reg端末.php" method="post">
      端末名<br>
      <input type="text" name="terminal" value="<?php echo $_POST['terminal']; ?>" disabled><br>
 
      ユーザID<br>
      <input type="text" name="userid" value="<?php echo $_POST['userid']; ?>" disabled><br>
 
      型番<br>
      <input type="text" name="model" value="<?php echo $_POST['model']; ?>" disabled><br>

      コンピュータ名<br>
      <input type="text" name="computer" value="<?php echo $_POST['computer']; ?>" disabled><br>
 
      シリアル<br>
      <input type="text" name="serial" value="<?php echo $_POST['serial']; ?>" disabled><br>

      学校ID<br>
      <input type="text" name="schoolid" value="<?php echo $_POST['schoolid']; ?>" disabled><br>
 
      耐用年数<br>
      <input type="text" name="servie" value="<?php echo $_POST['servie']; ?>" disabled><br>

      導入年月<br>
      <input type="text" name="introduced" value="<?php echo $_POST['introduced']; ?>" disabled><br>
 
      使用年数<br>
      <input type="text" name="years" value="<?php echo $_POST['years']; ?>" disabled><br>

      <!-- 入力画面から受け取ったデータを格納 -->
      <input type="hidden" name="terminal" value="<?php echo $terminal; ?>">
      <input type="hidden" name="userid" value="<?php echo $userid; ?>">
      <input type="hidden" name="model" value="<?php echo $model; ?>">
      <input type="hidden" name="computer" value="<?php echo $computer; ?>">
      <input type="hidden" name="serial" value="<?php echo $serial; ?>">
      <input type="hidden" name="schoolid" value="<?php echo $schoolid; ?>">
      <input type="hidden" name="servie" value="<?php echo $servie; ?>">
      <input type="hidden" name="introduced" value="<?php echo $introduced; ?>">
      <input type="hidden" name="years" value="<?php echo $years; ?>">
 
      <input type="submit" value="登録">
      
    </form>
    <form action="input端末.php"> 
      <input type="submit" value="戻る">
    </form>
 
  </body>
</html>
reg端末.php

<?php
try {
    $db = new PDO ('mysql:dbname=XXXX;host=127.0.0.1;charset=utf8', 'root','');
} catch (PDOException $e) {
    echo 'DB接続エラー : ' . $e->getMessage();
}

try {
  $statement = $db ->prepare('INSERT INTO 端末 SET terminal=?, userid=?, model=?, computer=?, serial=?, schoolid=?, servie=?, introduced=?, years=?');
  $statement ->execute(array($_POST['terminal'], $_POST['userid'], $_POST['model'], $_POST['computer'], $_POST['serial'], $_POST['schoolid'], $_POST['servie'], $_POST['introduced'], $_POST['years']));
} catch (PDOException $e) {
    echo '端末名が重複しています : 入力し直してください';
}
?>

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>登録完了</title>
  </head>
  <body>
 
    <h1>登録完了</h1>
 
    <p>入力お疲れ様でした</p>

    <form action="端末.php" method="post"> 
      <input type="submit" value="端末テーブル画面に戻る">
    </form>
 
  </body>
</html>

自分で試したこと

ユーザテーブルを作成してみてうまくいったので
同様の構造で端末テーブルを作成してみましたが、登録がうまくいきません。
カラムが多くなり、「reg端末.php」の「try{~}catch」に指定しているstatement文が長くなってしまった為、簡潔に記述するやり方についてもご教示いただきたいです。

0 likes

2Answer

まずはエラーメッセージを確認しましょう。

try {
  $statement = $db ->prepare('INSERT INTO 端末 SET terminal=?, userid=?, model=?, computer=?, serial=?, schoolid=?, servie=?, introduced=?, years=?');
  $statement ->execute(array($_POST['terminal'], $_POST['userid'], $_POST['model'], $_POST['computer'], $_POST['serial'], $_POST['schoolid'], $_POST['servie'], $_POST['introduced'], $_POST['years']));
} catch (PDOException $e) {
+    echo $e->getMessage();
+    exit;
-    echo '端末名が重複しています : 入力し直してください';
}
1Like

Comments

  1. @Tarzan3154

    Questioner

    返信ができておらず申し訳ございません!
    ご指摘の点を参考に修正したらうまくいきました。
    ありがとうございました。

簡潔に記述するやり方について
Ajax的な記述もありますよ?20?年以上の技術

画面遷移: 端末.php → input端末.php → 
confirm端末.php → reg端末.php

@Tarzan3154さんの手法はHTML機能(form、Action,submit)でpostし、全ページをサーバーからHTMLで供給されるものです。(更新時画面がちらつきあり)つまり、全てをphpでHTMLを生成する必要があります。

index.html
        サーバー側で差込
         ↓       
 <div><?php echo ...  ?></div>
 <div id="Ajax02”></div>
 <div id="Ajax03”></div>
          ↑
  innerHTML = クライアント側で差込

一方、javascriptでは 静的な index.html をベースにdocument.getElementById("Ajax03").innerHTML = にて部分的に
差し替えする方法があります。(画面ちらつき無し)window.onloadにて初回に部分的に差込むことで、部品として端末.php,input端末.phpの画面を残す事ができます。

又、submitで送信するのではなく、onclickで送信fetch(post)する方法は、クライアント側で項目チェックが可能でサーバー側のチェックの負担を軽減してくれます。本家のjson書式なのでデータ編集も簡単です。

さて、この考え方を押し進めて、サーバー側にjsonで送り、DB処理結果をjsonで返し 、クライアント側のライブラリーでHTMLを生成する方法も出始めています。

尚、サンプルは 非推奨のXMLHttpRequest 同期メソッドですが、今は、非同期のfetchを使います。私は非推奨派ですが・・・

1Like

Comments

  1. @Tarzan3154

    Questioner

    返信ができておらず申し訳ございません!
    ご指摘の点を参考に修正したらうまくいきました。
    ありがとうございました。

Your answer might help someone💌