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

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

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

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

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

Q&A

解決済

1回答

1691閲覧

smatyでのブラウザ表示について教えてください。

yuuu752

総合スコア18

PHP

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

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

0グッド

0クリップ

投稿2021/02/20 07:01

編集2021/02/20 08:21

前提・実現したいこと

エラーがあるときはinput_check.phpで定義した共通関数内でエラーを表示し、エラーがなければreturnでユーザーデータを返してuser_add_check.phpで入力したユーザーデータを表示させたい。

[入力からの流れ]
user_add.phpでユーザー情報入力→user_add_check.phpで入力チェックし、エラーが無ければユーザー情報出力。
入力チェックはuser_add_check.php内で呼び出しているinput_check.phpで定義した関数でチェックし、エラーがあればerr.tplで出力、エラーが無ければuser_add_check.phpにユーザー情報を渡す。

発生している問題・エラーメッセージ

var_dumpでinput_check.phpの各エラー変数の中身を確認し、各エラーの変数は全てNULLと出るため関数内でエラーが無いはずが、err.tplで記述しているボタンのみが表示され、ユーザー情報が出力できない状況になっている。(titleが「エラー」となっている為err.tplが表示されていることが確認済み。)

該当のソースコード

user_add.php(ユーザー情報入力)

<?php require_once '../common/smarty.php'; $smarty->assign('title', "ユーザー登録"); $smarty->display('../smarty/templates/user/user_add.tpl');

user_add.tpl

<!DOCTYPE html> <html lang="ja"> {include file="../head.tpl" title=$title} </head> <body> <p>全ての項目を入力後「登録」を押してください。</p> <p>※登録内容はログイン時に必要になります。<br> メモしておいてください。</p> <form method="post" action="user_add_check.php"> <p> <label for="name"> ユーザー名<font color = "red">※</font>: <input type = "text" name = "name" id = "name" style = "width:200px" required> </label> </p> <p> <label for="email"> メールアドレス<font color = "red">※</font>: <input type = "email" name = "email" id = "email" required> </label> </p> <p> <label for="pass"> パスワード<font color = "red">※</font>: <input type = "password" name = "pass" id = "pass" required> </label> </p> <p> <label for="pass2"> パスワード再入力<font color = "red">※</font>: <input type = "password" name = "pass2" id = "pass2" required> </label> </p> <input type="button" onclick="history.back()" value="戻る"> <input type="submit" value="登録"> </form> </body> </html>

user_add_check.php(エラーがあればerr.tpl、無ければuser_add_check.tpl)

php

1<?php 2 3require_once '../common/smarty.php'; 4require_once '../common/input_check.php'; 5 6$user_data = validateUser($post, $smarty); 7 8if (isset($user_data)) { 9 $smarty->assign('title', "ユーザー登録"); 10 $smarty->assign('user_data', $user_data); 11 $smarty->display('../smarty/templates/user/user_add_check.tpl'); 12}

input_check.php(ユーザー情報入力チェック関数)

<?php function validateUser($post, $smarty) { $err[] = ''; $user_data[] = ''; $limit = 20; $userLength = mb_strlen($_POST['name']); $reg_str = "/\A[a-z\d]{6,50}+\z/i"; if (!empty($_POST['user_id'])) { $user_data['user_id'] = $_POST['user_id']; } if ($_POST['name'] == '') { $err['name'] = '名前が入力されていません。'; } elseif ($userLength > $limit) { $err['name'] = '名前は20字以内で入力してください。'; } else { $user_data['name'] = $_POST['name']; } if ($_POST['email'] == '') { $err['email'] = 'メールアドレスが入力されていません。'; } elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $err['email'] = 'メールアドレスを正しい形式で入力してください。'; } else { $user_data['email'] = $_POST['email']; } if ($_POST['pass'] == '' || $_POST['pass2'] == '') { $err['pass'] = 'パスワードもしくは、確認用パスワードが入力されていません。'; } elseif (!preg_match($reg_str, $_POST['pass'])) { $err['pass'] = 'パスワードは半角英数字6~50文字で入力してください。'; } elseif (!preg_match($reg_str, $_POST['pass2'])) { $err['pass2'] = '確認用パスワードは半角英数字6~50文字で入力してください。'; } elseif ($_POST['pass'] !== $_POST['pass2']) { $err['match'] = 'パスワードが一致しません。'; } else { $user_data['pass'] = $_POST['pass']; $user_data['pass2'] = $_POST['pass2']; } if (isset($err['name']) == true || isset($err['email']) == true || isset($_POST['pass']) == true || isset($err['pass2']) == true || isset($err['match']) == true) { var_dump($err['name']); var_dump($err['email']); var_dump($err['pass']); var_dump($err['pass2']); var_dump($err['match']); $smarty->assign('title', "エラー"); $smarty->assign('err', $err); $smarty->display('../smarty/templates/err.tpl'); } else { return $user_data; } }

err.tpl(エラー出力)

<!DOCTYPE html> <html lang="ja"> {include file="./head.tpl" title=$title} </head> <body> {if isset($err['name'])} {$err['name']}<br /> {/if} {if isset($err['email'])} {$err['email']} <br /> {/if} {if isset($err['pass'])} {$err['pass']} <br /> {/if} {if isset($err['pass2'])} {$err['pass2']} <br /> {/if} {if isset($err['match'])} {$err['match']} <br /> {/if}      <input type="button" onclick="history.back()" value="戻る" /> </body> </html>

user_add_check.tpl(ユーザー情報出力)

<!DOCTYPE html> <html lang="ja"> {include file="../head.tpl" title=$title} </head> <body> <p>名前:{$user_data['name']}</p> <p>メールアドレス:{$user_data['email']}</p> <p>上記のユーザーを登録します。</p> <p>※パスワードはセキュリティ対策で表示していません。</p> <p>問題なければOKを押してください。</p> <form method="post" action="user_add_done.php"> <input type="hidden" name="name" value="{$user_data['name']}"> <input type="hidden" name="email" value="{$user_data['email']}"> <input type="hidden" name="pass" value="{$user_data['pass']}"> <input type="hidden" name="pass2" value="{$user_data['pass2']}"> <input type="button" onclick="history.back()" value="戻る"> <input type="submit" value="OK"> </form> </body> </html>

試したこと

エラーが変数に入っていないかvar_dumpで確認。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

m.ts10806

2021/02/20 07:10

err.tplにボタンはないようですが
yuuu752

2021/02/20 08:21

申し訳ございません。 抜けていましたので追加しました。
guest

回答1

0

自己解決

こちらで無事解決しました。

変更した点は、下記のように、isset($err[])の判定をtrueからfalseにし、if文とelseの内容を逆にしたことで解決しました。

if (isset($err['name']) == false && isset($err['email']) == false && isset($_POST['pass']) == false && isset($err['pass2']) == false && isset($err['match']) == false) { return $user_data; } else { $smarty->assign('title', "エラー"); $smarty->assign('err', $err); $smarty->display('../smarty/templates/err.tpl'); }

何故issetの判定をtrueにするとエラーがあると判定されたのでしょうか?
何かわかることがあれば教えていただきたいです。

投稿2021/02/20 10:19

編集2021/02/20 10:41
yuuu752

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問