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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

1回答

618閲覧

PHPで既存の画像を新しい画像に変更するSQLの書き方

emi_ono

総合スコア83

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

1クリップ

投稿2022/09/15 11:54

前提

PHPとSQLでスタッフの名前と画像を管理するページを作っています。
登録した画像を別の画像に差し替えする方法を教えていただきたいです。

新しくファイルを選択した場合、sqlのUPDATE文を使ってデータのアップデートをしようと思ったのですが、SQL文を実行すると画像が表示されません。
sqlのUPDATE文が間違えているのでしょうか?
画像の登録、削除、表示はできました。

教えていただきたいです。よろしくおねがいします。

実現したいこと

  • 既存の画像を新しい画像に変更する

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

ブラウザでは

filename = IMG_3217.JPG
tmp_path = /tmp/phpSM2nUn
error = 0
filesize = 103226
save_path = ../../../img/staff/20220915151849IMG_3217.JPG
staffname = name4
shop_id = 1
image_id = 8
old_file_name = IMG_3218.JPG
old_file_path =
スタッフ名OK
新しいファイルあり。
ファイルサイズOK。
ファイルエラーなし。
IMG_3217.JPGを../../../img/staff/20220915151849IMG_3217.JPGにアップしました。
データベースに保存しました。

と表示されるのですが、データベースでは
" file_name"と"staff_name"は更新されているのですが、"file_path"は空白になってしまいます。

該当のソースコード

test-edit_file_upload.php

PHP

1<?php 2session_start(); 3require_once "./dbc.php"; 4 5if ( !isset( $_SESSION[ "shop_name" ] ) ) { 6 $no_login_url = "login_form.php"; 7 header( "Location: {$no_login_url}" ); 8 exit; 9} 10//セッションの値を受け取る 11$shop_id = $_SESSION[ 'shop_id' ]; 12//ファイル関連の取得 13$file = $_FILES[ 'img' ]; 14$filename = basename( $file[ 'name' ] ); 15$tmp_path = $file[ 'tmp_name' ]; 16$file_err = $file[ 'error' ]; 17$filesize = $file[ 'size' ]; 18$upload_dir = '../../../img/staff/'; 19$save_filename = date( 'YmdHis' ) . $filename; 20$err_msgs = array(); 21$file_err_msgs = array(); 22$save_path = $upload_dir . $save_filename; 23$old_file_name = htmlspecialchars( $_POST[ "old_file_name" ] ); 24$old_file_path = htmlspecialchars( $_POST[ "old_file_path" ] ); 25//スタッフ関連の取得 26$staffname = htmlspecialchars( $_POST[ "staffname" ] ); 27$image_id = htmlspecialchars( $_POST[ "image_id" ] ); 28 29 30//確認用表示 31echo 'filename = ' . $filename . '<br>'; 32echo 'tmp_path = ' . $tmp_path . '<br>'; 33echo 'error = ' . $file_err . '<br>'; 34echo 'filesize = ' . $filesize . '<br>'; 35echo 'save_path = ' . $save_path . '<br>'; 36echo 'staffname = ' . $staffname . '<br>'; 37echo 'shop_id = ' . $shop_id . '<br>'; 38echo 'image_id = ' . $image_id . '<br>'; 39echo 'old_file_name = ' . $old_file_name . '<br>'; 40echo 'old_file_path = ' . $old_file_path . '<br>'; 41 42 43//スタッフ名のバリデーション 44//未入力 45if ( empty( $staffname ) ) { 46 //echo 'スタッフ名を入力してください。'; 47 array_push( $err_msgs, 'スタッフ名を入力してください。' ); 48} 49//10文字以内か 50if ( mb_strlen( $staffname, 'utf8' ) > 10 ) { 51 //echo 'スタッフ名は10文字以内で入力してください。'; 52 array_push( $err_msgs, 'スタッフ名は10文字以内で入力してください。' ); 53} 54 55if ( count( $err_msgs ) === 0 ) { 56 echo 'スタッフ名OK<br>'; 57 //ファイルはあるかどうか? 58 if ( is_uploaded_file( $tmp_path ) ) { 59 echo '新しいファイルあり。<br>'; 60 //ファイルのバリデーション 61 //ファイルサイズが5MB未満か 62 if ( $filesize > 5242880 || $file_err == 2 ) { 63 array_push($err_msgs, 'ファイルサイズは5MB未満にしてください。'); 64 } else { 65 echo 'ファイルサイズOK。<br>'; 66 } 67 //拡張は画像形式か 68 $allow_ext = array( 'jpg', 'jpeg', 'png' ); 69 $file_ext = pathinfo( $filename, PATHINFO_EXTENSION ); 70 71 if ( !in_array( strtolower( $file_ext ), $allow_ext ) ) { 72 array_push( $err_msgs, '「jpg」「jpeg」「png」の画像を添付してください。' ); 73 } 74 if ( count( $err_msgs ) === 0 ){ 75 echo 'ファイルエラーなし。<br>'; 76 }else{ 77 foreach ( $err_msgs as $msg ) { 78 echo '<p class="errmsg">' . $msg . '</p>'; 79 } 80 } 81 if(move_uploaded_file($tmp_path, $save_path )){ 82 echo $filename.'を'.$save_path.'にアップしました。'; 83 84 //DBに保存(ファイル名、ファイルパス、スタッフ名、店舗ID) 85 $result = fileEdit($filename, $save_path, $staffname, $shop_id, $image_id); 86 87 if($result){ 88 echo '<p>データベースに保存しました。</p>'; 89 }else{ 90 echo '<p class="errmsg">データベースへの保存が失敗しました。</p>'; 91 } 92 93 }else{ 94 echo '<p class="errmsg">ファイルが保存できませんでした。</p>'; 95 } 96 } else { 97 echo '新しいファイルなし。<br>'; 98 99 } 100} else { 101 foreach ( $err_msgs as $msg ) { 102 echo '<p class="errmsg">' . $msg . '</p>'; 103 } 104}

dbc.php(DB接続部分は省略)

PHP

1/** 2 * ファイルデータを編集保存 3 * @param string $filename ファイル名 4 * @param string $save_path 保存先のパス 5 * @param string $staffname スタッフ名 6 * @param int $shop_id 店舗ID 7 * @param int $image_id スタッフID 8 * @return bool $result 9 */ 10 11 function fileEdit($filename, $save_path, $staffname, $shop_id, $image_id) 12 { 13 $result = False; 14 15 16 $sql = "UPDATE 17 staff 18 SET 19 file_name = :file_name, 20 file_path = :file_path, 21 staff_name = :staff_name, 22 shop_id = :shop_id 23 WHERE 24 shop_id = :shop_id 25 AND 26 image_id = :image_id 27 "; 28 29 try{ 30 $stmt = dbc()->prepare($sql); 31 $stmt->bindValue(':file_name',$filename); 32 $stmt->bindValue(':file_path',$file_path); 33 $stmt->bindValue(':staff_name',$staffname); 34 $stmt->bindValue(':shop_id',$shop_id); 35 $stmt->bindValue(':image_id',$image_id); 36 $result = $stmt->execute(); 37 return $result; 38 39 }catch(Exception $e){ 40 echo '捕捉した例外: ', $e->getMessage(), "\n"; 41 return $result; 42 } 43 }

データベース構造

MySQL

1-- 2-- テーブルの構造 `staff` 3-- 4 5CREATE TABLE IF NOT EXISTS `staff` ( 6 `image_id` int(11) NOT NULL COMMENT 'データのID', 7 `file_name` varchar(255) NOT NULL COMMENT '画像の名前', 8 `file_path` varchar(255) NOT NULL, 9 `staff_name` varchar(140) NOT NULL COMMENT 'スタッフ名', 10 `shop_id` int(11) NOT NULL COMMENT '店舗ID', 11 `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日時' 12) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; 13

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

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

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

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

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

guest

回答1

0

ベストアンサー

引数は$save_pathですがバインドしてるのは$file_pathになっています。

PHP

1 function fileEdit($filename, $save_path, $staffname, $shop_id, $image_id) 2 3 $stmt->bindValue(':file_name',$filename); 4 $stmt->bindValue(':file_path',$file_path); 5 $stmt->bindValue(':staff_name',$staffname); 6 $stmt->bindValue(':shop_id',$shop_id); 7 $stmt->bindValue(':image_id',$image_id);

今回のエラーとは関係ありませんが、htmlspecialchars()の使い方が間違っています。
DBに保存するときではなく、HTML表示するときに使用してください。

PHP

1$staffname = htmlspecialchars( $_POST[ "staffname" ] ); 2$image_id = htmlspecialchars( $_POST[ "image_id" ] );

投稿2022/09/15 12:26

javahack

総合スコア1088

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

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

emi_ono

2022/09/15 14:03

ありがとうございました! $save_pathに変更してうまくできました。 htmlspecialchars()の使い方もありがとうございます。 こちらも修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問