前提・実現したいこと
ここに質問の内容を詳しく書いてください。
PHPで投稿フォームからDBにデータを登録するのですが、投稿されたデータを連想配列に格納して、PDOクラスを使ってprepared、executeしてデータを登録しようと考えています。
発生している問題・エラーメッセージ
1,move_uploaded_file関数でファイルを任意のディレクトリへ移動、ファイル名も正しく命名されているのですが、絶対パスを用いてファイルを指定しても画像を表示することができません。 ファイルが移動されていても正しく移動されていなければ、ファイルパスを指定しても表示できないのでしょうか? 2, ポストされた値を連想配列に格納したもの$dataArrをvar_dumpすると以下のようになります。 array(10) { ["gift_name"]=> string(18) "スタバカード" ["detail"]=> string(49) "スタバで使えるギフトカード3000円分" ["price"]=> string(4) "3000" ["rel"]=> string(6) "友達" ["sex"]=> string(6) "男性" ["age"]=> string(2) "28" ["scene"]=> string(9) "誕生日" ["reason"]=> string(27) "スタバが好きだから" ["whereBuy"]=> string(36) "スターバックス二子玉川店" [0]=> array(1) { ["image"]=> array(5) { ["name"]=> string(13) "IMG_4787.HEIC" ["type"]=> string(10) "image/heic" ["tmp_name"]=> string(36) "/Applications/MAMP/tmp/php/php37MztZ" ["error"]=> int(0) ["size"]=> int(1410017) } } } この時、$dataArr[0] = [0]=> array(1) { ["image"]=> array(5) { ["name"]=> string(13) "IMG_4787.HEIC" ["type"]=> string(10) "image/heic" ["tmp_name"]=> string(36) "/Applications/MAMP/tmp/php/php37MztZ" ["error"]=> int(0) ["size"]=> int(1410017) } } となっている部分を["image] => array(5) { ["name"]=> string(13) "IMG_4787.HEIC" ["type"]=> string(10) "image/heic" ["tmp_name"]=> string(36) "/Applications/MAMP/tmp/php/php37MztZ" ["error"]=> int(0) ["size"]=> int(1410017) } }にしたいのですが、多次元連想配列の階層?を一つ浅くする方法はあるのでしょうか。言語化するのが難しく検索に困っています。
該当のソースコード
form.html.twig
コード
<body> <br> <br> <div class="border col-5"> <br> <h2>Gift</h2> <br> <div class="row mb-10"> <div class="col-md"> <input type="hidden" name="entry_url" id="entry_url" value="{{constant('gift\Bootstrap::ENTRY_URL')}}"> <form method="post" action="giftconfirm.php" enctype="multipart/form-data"> <div class="form-group" > <label> 写真:</label> <input type="file" name="image" /> <br><span class="red" >{{errArr.image}}</span> <br><p>{{ImgMsg}}</p> </div>---省略---
<button type="submit" name="back" class="btn btn-outline-secondary btn-block">戻る</button>
</div>
<div class="col-5">
<button type="submit" name="confirm" class="btn btn-outline-primary btn-block">確認</button>
</div>
<br>
<br>
<br>
</div>
</form>
</div>
</div>
</div>
<input type="hidden" name="entry_url" id="entry_url" value="{{constant('gift\Bootstrap::ENTRY_URL')}}"> <form method="post" action="giftconfirm.php"> <table> <tr> <th>写真:</th> <td><img src="{{IMAGE}}" /></td> </tr> ---省略--- <div> <input type="submit" name="back" value="戻る" /> <input type="submit" name="complete" value="登録完了" /> {% for key,value in dataArr %} <!-- ↓下記メソッドで配列か否かチェックしている --> {% if value is iterable %} {% for v in value %} <input type="hidden" name="{{key}}[]" value="{{v}}" /> {% endfor %} {% else %} <input type="hidden" name="{{key}}" value="{{value}}" /> {% endif %} {% endfor %} </div>
<?php namespace gift; require_once dirname(__FILE__) . '/Bootstrap.class.php'; use gift\lib\Session; use gift\lib\PDODatabase; use gift\lib\Common; $db = new PDODatabase(Bootstrap::DB_HOST, Bootstrap::DB_USER, Bootstrap::DB_PASS,Bootstrap::DB_NAME,Bootstrap::DB_TYPE); $common = new Common(); $ses = new Session($db); $loader = new \Twig_Loader_Filesystem(Bootstrap::TEMPLATE_DIR); $twig = new \Twig_Environment($loader,[ 'cache' => Bootstrap::CACHE_DIR ]); $_SESSION['IMAGE'] = ''; //モード判定(どの画面から来たかの判断) //登録画面から来た場合 if (isset($_POST['confirm']) === true) { $mode = 'confirm'; } //戻る場合 if (isset($_POST['back']) === true) { $mode = 'back'; } //登録完了 if (isset($_POST['complete']) === true) { $mode = 'complete'; } //ボタンのモードによって処理を変える switch ($mode) { case 'confirm'://新規登録 //データを受け継ぐ //↓この情報は入力には必要ない unset($_POST['confirm']); // var_dump($_FILES); $dataArr = $_POST; $dataArr[] = $_FILES; var_dump($dataArr); // var_dump($dataArr[0]['image']['type']); //エラーメッセージの配列作成 $errArr = $common->errorGiftCheck($dataArr); // var_dump($errArr['image']); $err_check = $common->getErrorFlg($errArr); //err_check = false →エラーがありますよ! //err_check = true →エラーがないですよ! //エラーがなければconfirm.tpl あるとregist.tpl // var_dump($errArr); $path = str_replace('/Applications/MAMP/tmp/php/','', $_FILES['image']['tmp_name']); $_SESSION['IMAGE'] = Bootstrap::TMP_FILE_DIR . $path . '.jpg'; echo 'セッションイメージ'; var_dump($_SESSION['IMAGE']); var_dump($_FILES['image']['tmp_name']); $template = ($err_check === true) ? 'gift_confirm.html.twig' : 'gift_form.html.twig'; break; ---省略--- case'complete': //登録完了 $dataArr = $_POST; //↓この情報はいらないので外しておく unset($dataArr['complete']); var_dump($dataArr); // $table = 'user_tb'; // $errArr = $common->errorGiftCheck($dataArr); // $err_check = $common->getErrorFlg(); // $res = $db->insert($table, $dataArr); // if ($res === true) { // //登録成功時は完成ページへ // header('Location: ' . Bootstrap::ENTRY_URL . 'complete.php'); // } else { // //登録失敗時は登録画面に戻る // $template = 'gift_form.html.twig'; // foreach ($dataArr as $key => $value) { // $errArr[$key] = ''; // } // } break; } $relArr = [ '友達', '家族', '親戚', '上司・先輩', '部下・後輩', 'その他' ]; $sceneArr = [ '誕生日', '門出', '記念日', 'お祝い(就職、入学、結婚)', 'お礼', '挨拶', 'その他' ]; $context['dataArr'] = $dataArr; $context['errArr'] = $errArr; $context['relArr'] = $relArr; $context['sceneArr'] = $sceneArr; $context['IMAGE'] = $_SESSION['IMAGE']; $template = $twig->loadTemplate($template); $template->display($context); ``` ``` ```Common.class.php ``` <?php private function ImageCheck($dataArr) { var_dump($dataArr); // var_dump($_POST); if (isset($dataArr[0]['image']) !== 0){ $tmp_image = $dataArr[0]['image']; // var_dump($_POST['image']); // var_dump($tmp_image); // エラーなく、サイズが0でないか if ($tmp_image['error'] === 0 && $tmp_image['size'] !== 0) { //正しくサーバーにアップされているかどうか if (is_uploaded_file($tmp_image['tmp_name']) === true){ echo 'ファイルはアップロードされている'; } // }else{ // echo 'ファイルはアップロードされていない'; // } //画像情報を取得する $image_info = getimagesize($tmp_image['tmp_name']); $image_mime = $image_info['mime']; //画像サイズが利用できるサイズ以内かどうか if ($tmp_image['size'] > 10485760) { $ImgErrMsg = 'アップロードできる画像のサイズは、10MBまでです'; // 画像の形式が利用できるタイプかどうか } elseif (preg_match('/^image/jpeg|image/HEIC$/', $image_mime) === 0) { $ImgErrMsg = 'アップロードできる画像の形式は、JPEGまたはHEIC形式だけです'; } $str = $tmp_image['tmp_name']; $path = str_replace('/Applications/MAMP/tmp/php/','', $str); //パスを作るために、一時ファイル名の内のディレクトリの部分を取り除く $res = move_uploaded_file($tmp_image['tmp_name'], Bootstrap::TMP_FILE_DIR . $path . '.jpg'); } else { $ImgErrMsg = 'アップロードに失敗しました'; } } else { $this->errArr['image'] = 'ファイルを選択して下さい'; } } ``````giftconfirm.php
回答2件
あなたの回答
tips
プレビュー