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

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

ただいまの
回答率

89.71%

PHPでアイコン画像変更機能をつけようとしました

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 93

Smith.A

score 1

前提・実現したいこと

PHPで作った簡易掲示板に後からアイコン画像を変更できるシステムを作っています。

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

試してみたところ、ページが遷移せず、エラーメッセージもでません。
エラーメッセージ
なし

該当のソースコード

<?php
session_start();

if(!empty($_POST)) {
  print('ポストが送信されました');
  if ($_POST['reimage'] === ''){
    $error['icon'] = 'blank';
  } 
  $fileName = $_FILES['reimage']['name'];
  if(!empty($fileName)){
    // 画像がアップロードされていれば
    $ext = substr($fileName, -3);
    if($ext !== 'jpg' && $ext !== 'gif' && $ext !== 'png' ){
      $error['icon'] = 'type';
    }
  }
  if(empty($error)) {
    print('エラーの中身は空でした。');
    //$errorの内容が空であるかを確認する
    $image = date('YmdHis') . $_FILES['reimage']['name'];
    move_uploaded_file($_FILES['reimage']['tmp_name'], 'member_picture/' . $image);
    $_SESSION['icon'] = $_POST;
    // ポストで送信した内容をセッションに保存する
    $_SESSION['icon']['reimage'] = $image;
    var_dump($image);
    header('Location: iconcheck.php');
    exit();
  }
}
if(!empty($error)) {
  header('Location: changeicon.php');
  exit();
}
if ($_REQUEST['action'] === 'rewrite' && isset($_SESSION['icon'])) {
  $_POST = $_SESSION['icon'];
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF=8">
<meta name="viewport" content="width=device-width, initial-scale=1,0">
<meta http-equiv="X-UA=Compatible" content="ie=edge">
<title>アイコンの変更</title>

<link rel="stylesheet" href="style.css" />
</head>

<body>
  <div id="wrap">
    <div id="head">
      <h1>アイコンの変更画面</h1>
        <div id="content">
        <form action="" method="post" enctype="multipart/form-data"><!-- ファイルを付け加える時にはこのenctypeの部分は必須項目 --> 
        <dl>
        <dt>写真など</dt>
        <dd>
              <input type="file" name="reimage" size="35" value="test"  />
              <?php if($error['icon'] === 'type'):?>
              <p class="error">[.jpg]  [.png]  [.gif]の画像を設定してください</p>
              <?php endif; ?>
              <?php if($error['icon'] === 'blank'):?>
              <p class="error">画像を選択してください</p>
              <?php endif; ?>
              <?php if(!empty($error)): ?>
              <p class="error">恐れ入りますが画像を改めて選択ください</p>
              <?php endif; ?>
          </dd>
          </dl>
            <div><input type="submit" value="画像を確認する"/></div>
        </form>
   </div>
  </div>
</body>

【iconcheck.php】
<?php 
session_start();
require('dbconnect.php');

if(!isset($_SESSION['icon'])) {
  // sessionに値が保存されていなかった場合にこのこの後の処理をする
  // ブラウザから直接このページを呼び出した場合は戻ってもらう
  header('Location: changeicon.php');
  exit();
}
if(!empty($_POST)){
    $statement2 = $db->prepare('UPDATE members SET picture=?, created=NOW()');
    echo $statement2->execute(array(
    $_SESSION['icon']['reimage']
    ));
    unset($_SESSION['icon']);

    header('Location: index.php');
    exit;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>画像変更チェック</title>

  <form action="" method="post">
  <iuput type="hidden" name="action" value="submit"/>
  <dl>
  <dd>
    <?php if($_SESSION['icon']['reimage'] !== ''): ?>
    <img src="/member_picture/<?php print(htmlspecialchars($_SESSION['icon']['reimage'], ENT_QUOTES)); ?>">
    <?php endif; ?>
  </dd>
  </dl>
  <div><a href="changeicon.php?action=rewrite">&laquo;&nbsp;選び直す</a> | <input type="submit" value="登録する" /></div>
  </form>

試したこと

udemyで質問したのですが対応範囲外と言われました。
またそのときに少しだけヒントをもらい、var_dump($image)を入れてみたら?とアドバイスをいただいたので試してみましたが変化はありませんでした。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • キャンセル

  • m.ts10806

    2020/01/14 15:48

    コードはマークダウンのcode機能を利用してご提示ください

    キャンセル

  • Smith.A

    2020/01/15 00:03

    ご指摘ありがとうございました。

    キャンセル

回答 1

checkベストアンサー

+2

ページが遷移せず、エラーメッセージもでません。

いえ、エラーは出るはずです。

header()
header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。

こんな感じのエラーが出ます(正確にはWarning)
Warning: Cannot modify header information - headers already sent by (output started at …

学習段階、開発段階では常にエラー表示はONにしておくべきでしょう。

またデバッグについてはvar_dump()だけではなく「ここを通っている」という確認もする必要があります。
とりあえずheader()部分はコメントアウトしておくとして
echo __LINE__.PHP_EOL; を各分岐の前後に設置して、どういう結果が出るか確かめてください。
これにより「処理がどこを通っているか」が確認できます。

想定の手順で画面を操作して想定の場所を通っていなければ、
その分岐で使われている変数を出力し、想定の情報が来ているか確かめます。

まずは、ここまでやってみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/15 09:59

    ありがとうございます。
    まだ始めたばかりなので基本の知識が定着していないまま質問をしてしまってすみません。
    確認してみます。ありがとうございました。

    キャンセル

  • 2020/01/15 10:07

    いえ、謝る必要はないかなと思います。
    むしろudemyが本来ちゃんと教えるべきことを教えず、これくらいのことを範囲外として対応していないことの方が問題ですね。
    プログラミング言語のほとんどはオープンソースでやろうと思えば独学で全て無料でできるものでもあります。
    udemyよりも未経験就職でojtしてもらったほうがより実践的なスキルが身に付くとは思います(年齢や状況による。アウトソーシングが多くなる可能性もある)

    キャンセル

  • 2020/01/15 10:55

    ありがとうございました。
    参照していただいたサイトなどを見て勉強したいと思います。

    キャンセル

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

  • ただいまの回答率 89.71%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る