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

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

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

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

Q&A

解決済

1回答

1171閲覧

画像が選択されなかった時に用意してある画像を挿入したい。

shutamo

総合スコア26

PHP

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

0グッド

0クリップ

投稿2019/08/15 14:46

前提・実現したいこと

phpで会員登録の仕組みを作りました。
アイコンの設定で、画像が選択されなかった時は、あらかじめ用意してあるnothing.jpgを設定し、画像が選択されているときはその画像が設定されるようにしたいです。

画像が選択されているときにその画像が設定されるようにする仕組みは単独では成功済みなのですが、画像が選択されなかった時は、あらかじめ用意してあるnothing.jpgを設定するという設定を合わせると、どちらの場合においてもアイコンがnothing.jpgに設定されてしまいます。

該当のソースコード

php

1<?php 2require('../dbconnect.php'); 3 4//セッションの初期化処理 5session_start(); 6 7//$_POSTが空じゃ無いなら=フォームが送信されたら 8if(!empty($_POST)){ 9 10 //エラー項目の確認 11 if(($_POST['name'])== ''){ 12 $error['name'] ='blank'; 13 } 14 if(($_POST['email']) == ''){ 15 $error['email'] ='blank'; 16 } 17 if(strlen($_POST['password']) < 4){ 18 $error['password'] ='length'; 19 } 20 if(($_POST['password']) == ''){ 21 $error['password'] ='blank'; 22 } 23 24 $fileName = $_FILES['image']['name']; 25 if(!empty($fileName)){ 26 $ext = substr($fileName, -3); 27 if($ext != 'jpg' && $ext != 'gif' && $ext != 'png' && $ext != 'eic' && $ext != 'peg'){ 28 $error['image'] = 'type'; 29 } 30 } 31 32 //重複アカウントのチェック 33 if(empty($error)){ 34 $member = $db->prepare('SELECT COUNT(*) AS cnt FROM members WHERE email=?'); 35 $member->execute(array($_POST['email'])); 36 $record = $member->fetch(); 37 if($record['cnt'] > 0){ 38 $error['email'] = 'duplicate'; 39 } 40 } 41 42 43 //エラーが無かったら 44 if(empty($error)) { 45 //画像をアップロードする 46 //ここからが質問内容の箇所です。 47 if(($_POST['image']) == ''){ 48 $image = 'nothing.jpg'; 49 }else{ 50 $image = date('YmdHis') . $_FILES['image']['name']; 51 move_uploaded_file($_FILES['image']['tmp_name'], $image); 52 } 53 54 //別パターン 55 // if(isset($_POST['image'])){ 56 // $image = date('YmdHis') . $_FILES['image']['name']; 57 // move_uploaded_file($_FILES['image']['tmp_name'], $image); 58 // }else{ 59 // $image = 'nothing.jpg'; 60 // } 61 62   //画像が選択されているときにその画像が設定されるようにする仕組み単独の時 63 // $image = date('YmdHis') . $_FILES['image']['name']; 64 // move_uploaded_file($_FILES['image']['tmp_name'], $image); 65 66 //情報をセッションに保存してcheck.phpに移動する 67 $_SESSION['join'] =$_POST; 68 $_SESSION['join']['image'] = $image; 69 header('Location: check.php'); 70 exit(); 71 72 } 73 74} 75 76//書き直しの場合 URLに「index.php?action=rewire」がある 77if(isset($_REQUEST['action']) && $_REQUEST['action'] = 'rewire'){ 78 //$_POST内が空なので$_SESSION['join']の内容を復活させる 79 $_POST = $_SESSION['join']; 80 //「*恐れ入りますが...」を表示させるために意味のない$error['rewire']を利用する 81 $error['rewire'] = true; 82} 83?> 84 85<!DOCTYPE html> 86<html lang="ja"> 87<head> 88 <meta charset="UTF-8"> 89 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 90 <link rel="stylesheet" href="style.min.css"> 91 <title>shutabbs</title> 92</head> 93<body> 94 <div class="enroll"> 95 <h2>MoBメンバーになる</h2> 96 <p>以下の必須事項にご入力お願いします</p> 97 <form action="" method="post" enctype="multipart/form-data"> 98 <dl> 99 100 <dt>ニックネーム<span class="required">必須</span></dt> 101 <dd> 102 <!-- value→修正があった時に、修正箇所以外のところはecho htmlspecialchars($_POST['name'], ENT_QUOTES)で表示している。 103 しかし、初めてログインした時には$_POST['name']が定義されていなくエラーが出るので、isset関数を使用する。 --> 104 <input type="text" name="name" size="35" maxlength="255" class="info" value="<?php if(isset($_POST['name'])){echo htmlspecialchars($_POST['name'], ENT_QUOTES);} ?>"> 105 <?php if (isset($error['name']) == 'blank'): ?> 106 <p class="error">*ニックネームを入力して下さい</p> 107 <?php endif; ?> 108 </dd> 109 110 <dt>メールアドレス<span class="required">必須</span></dt> 111 <dd> 112 <input type="text" name="email" size="35" maxlength="255" class="info" value="<?php if(isset($_POST['email'])){echo htmlspecialchars($_POST['email'], ENT_QUOTES);} ?>"> 113 <?php if (isset($error['email']) == 'blank'): ?> 114 <p class="error">*メールアドレスを入力して下さい</p> 115 <?php endif; ?> 116 <?php if(isset($error['email']) == 'duplicate'): ?> 117 <p class="error">*指定されたメールアドレスはすでに登録されています</p> 118 <?php endif; ?> 119 </dd> 120 121 <dt>パスワード<span class="required">必須</span></dt> 122 <dd> 123 <input type="password" name="password" size="10" maxlength="20" class="info" value="<?php if(isset($_POST['password'])){echo htmlspecialchars($_POST['password'], ENT_QUOTES);} ?>"> 124 <?php if (isset($error['password']) == 'blank'): ?> 125 <p class="error">*パスワードを入力して下さい</p> 126 <?php endif; ?> 127 <?php if (isset($error['password']) == 'length'): ?> 128 <p class="error">*パスワードは4文字以上で入力して下さい</p> 129 <?php endif; ?> 130 </dd> 131 132 <dt>写真等</dt> 133 <dd> 134 <input type="file" name="image" size="35"> 135 <?php if(isset($error['image']) == 'type'): ?> 136 <p class="error">*写真などは「.jpg」「.gif」「.png」「.jpeg」「.heic」の画像を指定して下さい</p> 137 <?php endif; ?> 138 <?php if(isset($error) && !empty($error)): ?> 139 <p class="error">*恐れ入りますが、画像を改めて指定してください</p> 140 <?php endif; ?> 141 </dd> 142 </dl> 143 <div><input type="submit" value="入力内容の確認" class="btn"></div> 144 </form> 145 </div> 146 147</body> 148</html> 149

試したこと

if構文を別パターンでも試してみましたがうまくいきませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんばんは。
あと少しなのでヒントだけ書きますね。
両方のパターンにおいて nothing.jpg になるということは、どちらもこのifに入っているということです。

if(($_POST['image']) == ''){

postされたデータをprint_r($_POST);で確認してみるとよいと思いますよ。

<input type="file" name="image" size="35"> で送ったデータは$_FILEに入るので$_POSTには入りません)


補足です

  • ユーザ入力された値はfilter_varを使うとより安全です

PHPで各種バリデーション

  • アップロードに関してもこちらのQiitaの記事を参考にするとよりセキュアなアプリケーションになりますね

ファイルアップロードの例外処理はこれぐらいしないと気が済まない

投稿2019/08/15 15:29

8zca

総合スコア559

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

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

shutamo

2019/08/15 23:49

回答ありがとうございます! 該当コードを、 if(empty($error)) { //画像をアップロードする if($_FILES['image'] == ''){ $image = 'nothing.jpg'; }else{ $image = date('YmdHis') . $_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], $image); } に変更したのですが、次は画像を選択しなかった時にnothing.jpgが表示されませんでした。 var_dumpで$imageの中身を見るとstring(14) "20190816084600"となっていました。 改善策を教えていただけると嬉しいです。
shutamo

2019/08/16 00:07

$_FILES['image']['name']で解決しました! 補足情報についても確認します! ありがとうございました。
8zca

2019/08/16 15:53

解決されてよかったです! コードの最初の方で $fileName = $_FILES['image']['name']; と代入されてるので if ($fileName) で判定しても良いですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問