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

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

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

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

1回答

750閲覧

PHP バリデーションチェック実装

1h_m

総合スコア19

PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2020/02/23 05:15

プログラミング初心者です。
生き物の写真を投稿して図鑑を作る図鑑投稿アプリを作成しています。
今、新規投稿画面のバリデーションチェックを作成しています。
が、以下の問題が発生し手詰まりになってしまったので解決法をご教授いただきたいです。
開発環境はXAMPPで、フレームワークは使用してません。

入力欄に空欄があった場合に入力欄の下に"登録してください"などとエラー文を表示して入力画面に戻りたいです。
(selectタグの入力チェックと画像投稿はまだ実装途中ですので中途半端なコードが残っちゃってます。)

現状、「登録する」ボタンを押すと,http://localhost/dashboard/(XAMPPのトップページ?)に移動してしまいます。
ちょっと前までエラー文を表示して入力画面に戻ってくれていたのですがどこか変にコードをいじってしまったかもしれません(どこをいじったか分かっておけという話ですが、、)。
空欄がない場合は正常に投稿が完了しindex.phpに移動します。

$_POSTと$errorの値はnew.phpとcreate.phpの間で引き渡しができていると考えてます。
例えば「種名」・「説明」・「班」を空欄にして「登録する」を押した時のcreate.phpのログでは、

log

1[2020-02-23 13:16:52] pbook/create.php.INFO: $_POSTの中身:array(5) { 2 ["sp_name"]=> 3 string(0) "" 4 ["team"]=> 5 string(8) "disabled" 6 ["picture"]=> 7 string(12) "IMG-7519.JPG" 8 ["description"]=> 9 string(0) "" 10 ["submit"]=> 11 string(12) "登録する" 12} 13 [] {"dummy":""} 14[2020-02-23 13:16:52] pbook/create.php.WARNING: $errorの中身:array(2) { 15 ["sp_name"]=> 16 string(5) "blank" 17 ["description"]=> 18 string(5) "blank" 19} 20 [] {"dummy":""}

となっており、new.phpからcreate.phpに値が渡ってきてはいます。
create.phpのrequire_once 'new.tpl.php'の記述周辺におかしなコードがあるのでしょうか。

以下がコードになります。ログのコードが入ってて見辛くて済みません。
new.php

php

1<?php 2//error_reporting(E_ALL); 3require_once ('db_connect.php'); 4$pdo = null; 5$stmt = null; 6 7require_once __DIR__ . '/vendor/autoload.php'; 8use Monolog\Logger; 9use Monolog\Handler\StreamHandler; 10use Monolog\Formatter\LineFormatter; 11 12date_default_timezone_set("Asia/Tokyo"); 13 14//ログファイルのパス 15$logging_path = __DIR__ . '/log/new_log.log'; 16$stream = new StreamHandler($logging_path, Logger::INFO); 17//出力後、改行するために下記クラスを静止し、パラメーターとしてセットする。 18$formatter = new LineFormatter(null, null, true); 19$stream->setFormatter($formatter); 20$logger = new Logger('pbook/new.php'); 21$logger->pushHandler($stream); 22 23//下記のようにしないと配列などの値が出力されない 24$logger->pushProcessor(function($record){ 25 $record['extra']['dummy'] = 'hello world'; 26 return $record; 27}); 28 29$logger->addInfo('request_info ' . dumper($error)); 30//$logger->addDebug('SQL:' . $sql); 31//$logger->warning('警告メッセージ'); 32//$logger->error('エラーメッセージ'); 33 34//var_dumpの結果を文字列として出力するために下記関数を追加 35function dumper($obj){ 36 ob_start();//関数の出力のバッファリングをオンにする ? 37 var_dump($obj); 38 $ret = ob_get_contents();//文字列変数にバッファした内容をコピー 39 ob_end_clean();//バッファの内容を消去 40 return $ret; 41} 42 $message = "図鑑登録"; 43 require_once ('new.tpl.php'); 44

new.tpl.php

html

1<!DOCTYPE html> 2<html> 3<?php include('header_inc.php') ?> 4<body> 5<h2><?=$message ; ?></h2> 6 <p></p> 7 8<form action='create.php' method='post' enctype='multipart/form-data'> 9 10 <label>種名</label> 11 <input type='text' name='sp_name'> 12 <?php if($error['sp_name'] == 'blank'): ?> 13 <p>*種名を登録してください*</p> 14 <?php endif; ?> 15 <label></label> 16 <select name='team'> 17 <option value="disabled">選んでね</option> 18 <option value='sea'></option> 19 <option value='kinoko'>きのこ</option> 20 <option value='plant'>植物</option> 21 </select> 22 <p></p> 23 <label>写真</label> 24 <input type='file' name='picture' /> 25 <p></p> 26 <?php if($error['picture'] == 'type'): ?> 27 <p>*写真は「.gif」もしくは「.png」の形式で登録してください*</p> 28 <?php endif; ?> 29 <?php if(!empty($error)): ?> 30 <p>*もう一度写真を登録してください*</p> 31 <?php endif; ?> 32 <label>説明</label> 33 <textarea name='description' cols='40' row='80'></textarea> 34 <p></p> 35 <?php if($error['description'] == 'blank'): ?> 36 <p>*説明を登録してください*</p> 37 <?php endif; ?> 38 <input type='submit' name='submit' value='登録する'> 39</form> 40 <p><a href='room.php'>班一覧に戻る</a></p> 41 42<?php include('footer_inc.php') ?> 43</body> 44</html>

create.php

PHP

1<?php 2error_reporting(E_ALL); 3require_once ('db_connect.php'); 4$message = "入力エラーがあります"; 5 6//$file_path = 'files/'. $_FILES['picture']['name']; 7 8 if(isset($_POST['submit'])){ 9 if($_POST['sp_name'] == ''){ 10 $error['sp_name'] = 'blank'; 11 } 12 if(mb_strlen($_POST['sp_name']) > 50){ 13 $error['sp_name'] = 'length'; 14 } 15 if($_POST['team'] == ''){ 16 $error['team'] = 'blank'; 17 } 18 $filename = $_FILES['picture']['name']; 19 if(!empty($filename)){ 20 $ext = substr($filename, -3); 21 if($ext != 'jpg' && $ext != 'JPG' && $ext != 'png'){ 22 $error['picture'] = 'type'; 23 } 24 } 25 if($_POST['description'] == ''){ 26 $error['description'] = 'blank'; 27 } 28 29 if(!empty($error)){ 30 require_once ('new.tpl.php'); 31 } 32 if(empty($error)){ 33 $sp_name = $_POST['sp_name']; 34 $team = $_POST['team']; 35 $picture = date('YmdHis') . $_FILES['picture']['name']; 36 move_uploaded_file($_FILES['picture']['tmp_name'], '../files/' . $picture); 37 $description = $_POST['description']; 38 //echo $_FILES['picture']['name']; 39 } 40 $sql = 'INSERT INTO picture (sp_name, team, picture, description) 41 VALUES (:sp_name, :team, :picture, :description)'; 42 $stmt = $pdo->prepare($sql); 43 $stmt->bindValue(':sp_name', $sp_name, PDO::PARAM_STR); 44 $stmt->bindValue(':team', $team, PDO::PARAM_STR); 45 $stmt->bindValue(':picture', $picture, PDO::PARAM_STR); 46 $stmt->bindValue(':description', $description, PDO::PARAM_STR); 47 $stmt->execute(); 48 49 //print_r($_FILES); 50 $pdo = null; 51 $stmt = null; 52 } 53 require_once __DIR__ . '/vendor/autoload.php'; 54use Monolog\Logger; 55use Monolog\Handler\StreamHandler; 56use Monolog\Formatter\LineFormatter; 57 58date_default_timezone_set("Asia/Tokyo"); 59 60//ログファイルのパス 61$logging_path = __DIR__ . '/log/create_log.log'; 62$stream = new StreamHandler($logging_path, Logger::INFO); 63//出力後、改行するために下記クラスを静止し、パラメーターとしてセットする。 64$formatter = new LineFormatter(null, null, true); 65$stream->setFormatter($formatter); 66$logger = new Logger('pbook/create.php'); 67$logger->pushHandler($stream); 68 69//下記のようにしないと配列などの値が出力されない 70$logger->pushProcessor(function($record){ 71 $record['extra']['dummy'] = ''; 72 return $record; 73}); 74//if(!isset($pbook) || !isset($_POST)){ 75$logger->addInfo('$_POSTの中身:' . dumper($_POST)); 76$logger->addDebug(var_export($_FILES['picture']['name'])); 77$logger->warning('$errorの中身:'.dumper($error)); 78 79//var_dumpの結果を文字列として出力するために下記関数を追加 80function dumper($obj){ 81 ob_start();//関数の出力のバッファリングをオンにする ? 82 var_dump($obj); 83 $ret = ob_get_contents();//文字列変数にバッファした内容をコピー 84 ob_end_clean();//バッファの内容を消去 85 return $ret; 86} 87//var_dump($_GET); 88 89 $url = "{$team}/index.php"; 90 header('Location:'.$url); 91 exit(); 92 93 94 //require_once ('new.tpl.php'); 95

indexは投稿時にどの班を選択するかで班ごとのindexに別れてます。
きのこ→kinoo/index.php
海→sea/index.php
植物→plant/index.php

kinoko/index.php

html

1<?php 2error_reporting(E_ALL); 3session_start(); 4 require_once '../function.php'; 5 require_once __DIR__ . '/../vendor/autoload.php'; 6 7 use Monolog\Logger; 8 use Monolog\Handler\StreamHandler; 9 use Monolog\Formatter\LineFormatter; 10 11 date_default_timezone_set("Asia/Tokyo"); 12 13 14 //ログファイルのパス 15 $logging_path = __DIR__ . '/../log/index_log.log'; 16 $stream = new StreamHandler($logging_path, Logger::INFO); 17 //出力後、改行するために下記クラスを静止し、パラメーターとしてセットする。 18 $formatter = new LineFormatter(null, null, true); 19 $stream->setFormatter($formatter); 20 $logger = new Logger('pbook/kinoko/index.php'); 21 $logger->pushHandler($stream); 22 23 //下記のようにしないと配列などの値が出力されない 24 $logger->pushProcessor(function($record){ 25 $record['extra']['dummy'] = ''; 26 return $record; 27 }); 28 29 //dumperの引数はは出力したいデータ 30 31 $logger->error(var_export($_FILES, true)); 32 33 //var_dumpの結果を文字列として出力するために下記関数を追加 34 function dumper($obj){ 35 ob_start();//関数の出力のバッファリングをオンにする ? 36 var_dump($obj); 37 $ret = ob_get_contents();//文字列変数にバッファした内容をコピー 38 ob_end_clean();//バッファの内容を消去 39 return $ret; 40 } 41 if(!isset($_FILES)){ 42 $logger->warning('画像登録失敗' . var_export($_FILES, true)); 43 } 44 45 46 // $picture = date('YmdHis') . $_FILES['picture']['name']; 47 // move_uploaded_file($_FILES['picture']['tmp_name'],'../files/'. $picture); 48 // $_SESSION['picture'] = $picture; 49 50 51 require_once ('../db_connect.php'); 52 $sql = 'SELECT * FROM picture WHERE team = "kinoko"'; 53 $stmt = $pdo->prepare($sql); 54 // $stmt->bindValue(':sp_name', $sp_name, PDO::PARAM_STR); 55 // $stmt->bindValue(':description', $description, PDO::PARAM_STR); 56 $stmt->execute(); 57 $pbooks = []; 58 while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 59 $pbooks[] = $row; 60 } 61 //print_r($pbooks); 62 63 $pdo = null; 64 $stmt = null; 65 66 $message = "図鑑一覧"; 67 68 //$logger->addInfo('request_info ' . dumper($pbooks)); 69 $logger->debug('SQL:' . $sql); 70 71 72 73 74 require_once ('../index.tpl.php'); 75

index.tpl.php

html

1<!DOCTYPE html> 2<html> 3<?php include('../header_inc.php') ?> 4<body> 5<h2><?=$message ; ?></h2> 6 <p></p> 7 8 9 <?php foreach($pbooks as $pbook): ?> 10 <hr> 11 <p>[種名]:<?php h($pbook['sp_name']); ?><br></p> 12 <p>[写真]:<img src="../files/<?php h($pbook['picture']); ?>" 13 width="300" height="300" alt="" /> 14 <br></p> 15 <p>[説明]:<br><?php hbr($pbook['description']); ?><br></p> 16 <p><a href='../edit.php?id=<?=$pbook['id']; ?>'>投稿を編集</a></p> 17 <p><a href='../delete_check.php?id=<?=$pbook['id']; ?>&team=<?=$pbook['team']?>'>投稿を削除</a></p> 18 <?php endforeach; ?> 19 <hr> 20 <p><a href='../room.php'>班一覧に戻る</a></p> 21 <p><a href='../new.php'> 写真登録</a></p> 22 23 24 25 26 27 28<?php include('../footer_inc.php') ?> 29</body> 30</html>

質問わかりづらいと思いますのでご指摘あればお願いします。

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

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

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

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

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

m.ts10806

2020/02/23 06:02

今回オートローダーほとんど関係ないのでは? 提示するコードもですけど、検証コードはよりミニマムにされたほうが分かりやすくなると思います。
1h_m

2020/02/25 00:39

どこに原因があるのか絞れずにたくさん提示してしまいました。これだと見る方も分かりにくいですね。 次回からの参考にさせていただきます。ご指摘ありがとうございました。
m.ts10806

2020/02/25 00:55

質問は編集できるので適宜調整いただければと。
1h_m

2020/02/25 12:23

今回は解決できました!次回から的を絞った質問を心掛けていきます。
guest

回答1

0

ベストアンサー

ヘッダ・フッタなどのコードがないのでざっと読んだ感じですが

create.phpにおいて$errorが空の場合、$teamが定義されません。そのため

PHP

1 $url = "{$team}/index.php"; 2 header('Location:'.$url); 3 exit();

の部分で (未定義変数はWARNINGが出て空文字列扱いなので) /index.php にリダイレクトされそうです。

エラーがない場合のみリダイレクトする、などとしたほうが良いかと思います。

投稿2020/02/23 05:42

Eggpan

総合スコア2729

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

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

1h_m

2020/02/25 00:41

ありがとうございます。おっしゃっていただいた通り変数の未定義が原因でした。 バリデーションの箇所でissetを用いて変数の定義を判定する事などで解決できました(他にも修正箇所が多々ありましたが)。 分かりづらい質問でしたが貴重なヒントを提示してくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問