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

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

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

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

Q&A

解決済

1回答

241閲覧

オブジェクト指向 メッセージをsmartyのテンプレートに受け渡したい

Company_

総合スコア16

PHP

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

0グッド

0クリップ

投稿2018/10/17 02:56

編集2018/10/17 08:08

###実現したいこと
クラス内の名前重複チェックの"入力されたユーザ名は既に使われています"を
smartyのテンプレートに受け渡したい
###発生している問題
"入力されたユーザ名は既に使われています"が表示されない
###試したこと
$_SESSION[""] = $e->getMessage();

$smarty->assign('hoge', $_SESSION[""]);

セッション変数に格納する方法しか思い浮かびませんでした

php

1<?php 2require_once('db_connection.php'); 3 4class User_registaration extends Db_Connection 5{ 6 //ユーザ情報登録 7 public function user_registaration($name, $pass) 8 { 9 $sql = "INSERT INTO ip_d_user_information(infouser_user_name, infouser_password) VALUES (?, ?)"; 10 $stmt = $this->link->prepare($sql); 11 $stmt->execute(array($name, password_hash($pass, PASSWORD_DEFAULT))); 12 } 13 14 //名前重複チェック 15 public function user_duplication($name) 16 { 17 $sql = "SELECT * FROM ip_d_user_information"; 18 //SQL文実行 19 $stmt = $this->link->query($sql); 20 try 21 { 22 while($item = $stmt->fetch()) 23 { 24 if($name == $item['infouser_user_name']) 25 { 26 throw new Exception('入力されたユーザ名は既に使われています'); 27 } 28 } 29 }catch(Exception $e) 30 { 31 $error = $e->getMessage(); 32 } 33 } 34} 35 36$username = $_POST["username"]; 37$password = $_POST["password"]; 38$password2 = $_POST["password2"]; 39 40$user = new User_registaration; 41 42$user->user_duplication($username); 43 44$user->user_registaration($username, $password);

php

1<?php 2require_once('Smarty.class.php'); 3require_once('../file_class/login_authentication.php'); 4require_once('../file_class/user_registration.php'); 5 6$smarty = new Smarty(); 7 8$smarty->template_dir = '../templates'; 9$smarty->compile_dir = '../templates_c'; 10$smarty->config_dir = '../configs/'; 11$smarty->cache_dir = '../cache/'; 12 13session_start(); 14 15// メッセージの初期化 16$errorMessage = ""; 17$signUpMessage = ""; 18$success = ""; 19$error = ""; 20 21$smarty->assign('signUpError', $error); 22 23$smarty->display('signup.tpl');

###修正後コード

php

1<?php 2require_once('db_connection.php'); 3 4class User_registaration extends Db_Connection 5{ 6 public function __construct() 7 { 8 parent::__construct(); 9 } 10 11 //名前重複チェック 12 public function user_duplication($name) 13 { 14 $sql = "SELECT * FROM ip_d_user_information"; 15 //SQL文実行 16 $stmt = $this->link->query($sql); 17 18 while($item = $stmt->fetch()) 19 { 20 if($name == $item['infouser_user_name']) 21 { 22 $error = "入力されたユーザ名は既に使われています"; 23 return $error; 24 } 25 } 26 } 27} 28 29$username = $_POST["username"]; 30 31$user = new User_registaration; 32 33$er = $user->user_duplication($username); 34

php

1<?php 2require_once('Smarty.class.php'); 3require_once('../file_class/login_authentication.php'); 4require_once('../file_class/user_registration.php'); 5 6$smarty = new Smarty(); 7 8$smarty->template_dir = '../templates'; 9$smarty->compile_dir = '../templates_c'; 10$smarty->config_dir = '../configs/'; 11$smarty->cache_dir = '../cache/'; 12 13session_start(); 14 15$smarty->assign('signUpError', $er); 16 17$smarty->display('signup.tpl');

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

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

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

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

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

yoorwm

2018/10/17 03:04

色々な誤解があるようですので、実行順番やスコープについて落ち着いて勉強しなおしてみたらどうでしょうか?
Company_

2018/10/17 03:10

深く理解できていないまま進めていたので、もう一度勉強しなおしてみます
退会済みユーザー

退会済みユーザー

2018/10/17 03:20

同じ手の質問は解決してからね(というか前のが解決していればこれも解決する)
Company_

2018/10/17 03:29

質問なのですがrequire_once()で外部クラスを呼び出した場合、Class クラス名 extends 呼び出した外部クラス名を記述するだけでクラスは継承できるのでしょうか
guest

回答1

0

ベストアンサー

直接の回答ではないのですが、読んで考えてください。

下記はなんと出力されるでしょうか?

php

1function test(){ 2 $test = "hello"; 3} 4$test = "world"; 5echo $test; 6test(); 7echo $test;

動かしてみれば明白ですね。
PHPマニュアルなりなんなり「変数のスコープ」を確認してください。
Smartyの問題ではなく、PHPをはじめとした変数の理解の問題です。

あと関数の扱いや理解も怪しいです。

下記で「エラー」と出力させられると思いますか?

php

1function err(){ 2 $error = "エラー"; 3} 4$error=""; 5err(); 6echo $error;

こうですね。

php

1function err(){ 2 $error = "エラー"; 3 return $error; 4} 5 6$er = err(); 7echo $er; //$errorである必要はないが返却値を受け取る必要がある

このあたり、きちんと深く理解しておかないと、
本来やりたいことが全く進まなくなりますよ。
基本を疎かにしたまま応用にはいけません。

投稿2018/10/17 06:25

m.ts10806

総合スコア80765

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

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

Company_

2018/10/17 07:08

非常に分かりやすい説明ありがとうございます。 しっかりと基礎を固めてから先に進んでみます
m.ts10806

2018/10/17 07:11

はじめから組み上げるのではなくミニマムコードで動作確認してから肉付けなり結合なりしていってください。 ミニマムでも動かない、または自身が理解できていないコードは、組み上げても動きません
Company_

2018/10/17 07:33

実際に動かしてみたところ表示確認できました この辺りは全く理解できていないことが分かりましたので 一から勉強してきます ありがとうございました。
Company_

2018/10/17 07:59 編集

もう一つ質問なのですが、 提示していただいた例で $erにエラーメッセージを入れていますが $erをsmarty->assign('error', $er)のように テンプレートに渡すことはできるのでしょうか 追記:何度もすみません。 修正後コードに記述しました これであっていますでしょうか
m.ts10806

2018/10/17 07:57

解決した内容を質問本文に追記してください
Company_

2018/10/17 08:04

追記しました。 確認お願い致します。
m.ts10806

2018/10/17 08:21

DBアクセスのところがちょっと冗長というかwhereで絞りこみしたほうがスッキリするかなとは思いますが、まあ良いかなと。 リファクタリングは適宜やってみてください
Company_

2018/10/17 08:29

承知しました。 色々と教えていただきありがとうございました。
退会済みユーザー

退会済みユーザー

2018/10/17 09:41

mts10806 冗長というより OOM で落ちるきがするけどね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問