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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

XAMPP

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

Q&A

解決済

1回答

822閲覧

DBから画像パスが削除されない

nanapon

総合スコア8

MySQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

XAMPP

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

0グッド

0クリップ

投稿2021/04/29 03:47

実現したいことと困っていること

画像投稿機能付きの掲示板を作っています。
画像自体はサーバーへアップロードし、画像パスをDBに保存しています。
サーバーへの画像のアップロードと削除はできます。しかしDBにある画像パスが削除されません(なぜか拡張子だけが消えます)。
どのようにすればDBの画像パスが削除されるのか、ご教示頂けますと幸いです。

その他

・画像は「images」フォルダに保存しています。
・xamppを使用しています。
・sql文の「img_file」という箇所に画像パスが保存されます。

PHP

1//----------thread_change.php------------ 2<?php 3$thread_id = $_GET['thread_id']; 4 5$pdo = new pdo(DSN,DB_USER,DB_PASS); 6$select = $pdo->prepare("SELECT * FROM thread_data WHERE thread_id = :thread_id"); 7$select->bindParam(":thread_id", $thread_id); 8$select->execute(); 9 10?> 11 12<!doctype html> 13<html> 14<head> 15<meta charset="utf-8"> 16<meta name="viewport" content="width=device-width, initial-scale=0"> 17<title>掲示板-スレッドの内容を変更する</title> 18<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@700&display=swap" rel="stylesheet"> 19<link href="css/base.css" rel="stylesheet" type="text/css"> 20<link href="css/common.css" rel="stylesheet" type="text/css"> 21<script src="js/jquery-3.4.1.min.js"></script> 22<script type="text/javascript" src="js/test.js"></script> 23</head> 24<body> 25 <main> 26 <h1>スレッドの内容を変更する</h1> 27 <div class="btn_block"> 28 <a class="btn" href="index.php">トップページに戻る</a> 29 <a class="btn" href="thread.php?thread_id=<?php echo $thread_id ?>">前のページに戻る</a> 30 </div><!--/.btn_block --> 31 <section class="program_wrapper"> 32 <form method="post" action="thread_change_done.php" enctype="multipart/form-data"> 33 <?php foreach($select as $s) : ?> 34 <p>スレッド作成者</p> 35 <input type="text" name="thread_author" value="<?php echo h($s['thread_author']) ?>"> 36 <p>スレッドタイトル</p> 37 <input type="text" name="thread_title" value="<?php echo h($s['thread_title']) ?>"> 38 <p>スレッドの内容</p> 39 <textarea name="thread_contents"><?php echo h($s['thread_contents']) ?></textarea> 40 <p>添付されている画像</p> 41 <p class="delete_img"> 42 <a class="link" href="images/<?php echo $s['img_file'] ?>" target="_blank"><?php echo h($s['img_file']) ?></a> 43 <label><input type="checkbox" name="delete_img" value="<?php echo 'images/' . $s['img_file'] ?>">削除する</label> 44 </p><!--/.delete_img --> 45 <p>画像を投稿する</p> 46 <p style="padding-bottom: 40px;"><input type="file" name="img_file"></p> 47 <?php endforeach; ?> 48 <input type="submit" value="スレッドの内容を変更する"> 49 <input type="hidden" name="thread_id" value="<?php echo $thread_id ?>"> 50 </form> 51 </section><!--/.program_wrapper --> 52</main> 53<script type="text/javascript" src="js/test2.js"></script> 54</body> 55</html> 56

PHP

1//----------thread_change_done.php------------ 2<?php 3$pdo = new pdo(DSN,DB_USER,DB_PASS); 4 5$thread_id = $_POST['thread_id']; 6$thread_author = $_POST['thread_author']; 7$thread_title = $_POST['thread_title']; 8$thread_contents = $_POST['thread_title']; 9date_default_timezone_set('Asia/Tokyo'); 10$created_at = date('Y/m/d H:i:s'); 11 12$delete_img; 13if(!empty($_POST['delete_img'])){ 14 $delete_img = $_POST['delete_img']; 15 chmod($delete_img, 0750); 16 if(file_exists($delete_img)){ 17 unlink($delete_img); 18 } 19 echo $delete_img; 20} 21$img_file; 22$file; 23if(!empty($_FILES['img_file'])){ 24 $img_file = uniqid(mt_rand(), true); //ファイル名をユニーク化 25 $extension = substr(strrchr($_FILES['img_file']['name'], '.'), 1); //拡張子を取得 26 $img_file .= '.' . $extension; 27 if(!empty($_FILES['img_file']['name'])){ 28 $file = "images/$img_file"; 29 if($extension == "jpg" || $extension == "png" || $extension == "gif"){ 30 move_uploaded_file($_FILES['img_file']['tmp_name'], './images/' . $img_file); 31 }else{ 32 header('Location:thread_add.php'); 33 exit(); 34 } 35 } 36} 37 38 $regist = $pdo->prepare("UPDATE thread_data SET thread_title = :thread_title, thread_author = :thread_author, thread_contents = :thread_contents, 39 created_at = :created_at, img_file = :img_file WHERE thread_id = :thread_id"); 40 $regist->bindParam(":thread_title", $thread_title); 41 $regist->bindParam(":thread_author", $thread_author); 42 $regist->bindParam(":thread_contents", $thread_contents); 43 $regist->bindParam(":created_at", $created_at); 44 $regist->bindParam(":img_file", $img_file); 45 $regist->bindParam(":thread_id", $thread_id); 46 $regist->execute(); 47 header('Location:thread.php?thread_id=' . $thread_id); 48 exit(); 49?>

よろしくお願い致します。

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

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

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

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

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

m.ts10806

2021/04/29 03:54

bindParamする前に$img_fileに何が保持されているか確認されましたか?
nanapon

2021/04/29 04:59

確認していませんでしたので確認をしましたところ、拡張子が消えてファイル名のみが表示されました。
m.ts10806

2021/04/29 06:27

いかんせんどうなるのがゴールだと目指しているのか分かりません。 「DBから消したい」を「カラムの情報を空にしたい」のでしたら画像アップロードしてしまうとUPDATEにより上書きされるのかお分かりかと思いますが、「アップロードしてないときに空になっていない」ということですか?
nanapon

2021/04/29 07:01

分かり辛く申し訳無いです。 >「アップロードしてないときに空になっていない」ということですか? はい。アップロードせず今ある画像を削除した場合にも、画像のファイル名がDBに残ってしまうので、 それも一緒に消したいということです。
m.ts10806

2021/04/29 07:10

ではもう1点。 if(!empty($_FILES['img_file'])){ ↑ここの分岐に入っているか入ってないかは確認しましたか?
nanapon

2021/04/29 07:13

ここの分岐に入っているのは確認をしました。 何もアップロードしていないのになぜか入ります。
nanapon

2021/04/29 07:26

>if(!empty($_FILES['img_file'])) ↑を if($_FILES['img_file']['error'] != 4) このようにしたところ、DBから画像ファイル名を消せました。 協力していただき、ありがとうございました。
guest

回答1

0

自己解決

if(!empty($_FILES['img_file']))

↑を

if($_FILES['img_file']['error'] != 4)

に変更したところ、DBから画像ファイルを消すことができました。

投稿2021/04/29 07:25

nanapon

総合スコア8

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

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

m.ts10806

2021/04/29 07:45

そもそも、img_file自体が送信されているか(リクエストパラメータに含まれているか)、というのも条件必要では。 emptyはこういう時には悪手なのです。 0 も空としてみなしますから。 https://www.php.net/manual/ja/function.empty.php
nanapon

2021/04/29 08:15

img_file自体が送信されているかの判定は if($_FILES['img_file']) でいいのでしょうか。
m.ts10806

2021/04/29 08:20

書いてみればわかりますよ。エラー表示ONにして。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問