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

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

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

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

データベース

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

Q&A

解決済

2回答

1925閲覧

PHP formで送信した画像がフォルダには保存できるけどDBには保存できない

whyyasai

総合スコア3

PHP

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

データベース

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

0グッド

0クリップ

投稿2021/07/06 04:52

編集2021/11/22 03:14

前提・実現したいこと

PHPでブログサイトを制作しています。
テキストと同時に画像も投稿できるようにしたいです。

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

発生している問題は、テキストと同時に画像をis_uploaded_fileとmove_uploaded_fileを使ってimageフォルダに保存しているのにDBにはテキストも画像も保存されないことです。
固まったように動かなくなりました。

該当のソースコード

試したこと

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

imageフォルダの中に保存されている画像ファイルの名前は、$save_filename = date('YmdHis') . $filename;の通りに保存されています。
このコードを書いて実行した最初の2回だけDBに画像が保存されたのですが、テーブルのfile_nameとfile_pathの中にはファイル名の頭文字しか保存されていません。
それ以降は、投稿さえできなくなってしまいました。

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

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

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

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

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

m.ts10806

2021/07/06 04:56

try-catchによるエラーハンドリングを導入して起きてる現象確認してください。 あとテーブル定義はどうなってますか? create文で提示してください
yambejp

2021/07/06 05:15

分岐が細分化していますが、ご自身の処理がどの分岐に流れているかトレースしていますか?
whyyasai

2021/07/06 05:22

try-catchによるエラーハンドリングのやり方がネットで調べても理解することができなかったため、教えていただきたです。 テーブル定義は、 CREATE TABLE `posts` ( `id` int(11) NOT NULL AUT... こうやって出て来たのですが、これはどういうことなのでしょうか?? 自分の処理がどこに流れているかは、 $message=$db->prepare('INSERT INTO posts SET title=?, file_name=?, file_path=?, message=?, member_id=?, reply_post_id=?, created=NOW()'); if(!isset($_GET['res'])){ $message->execute(array( $_POST['title'], $filename['file_name'], $save_path['file_path'], $_POST['message'], $member['id'], 0 )); }else{ ここに流れていると思っています。 ここの$filenameと$save_pathがダメなのかと考えて$_POSTにしたり、他の変数にしてみたりしましたがうまくいきませんでした。
m.ts10806

2021/07/06 05:34

>こうやって出て来たのですが、これはどういうことなのでしょうか?? テーブル定義がそのデータを受入可能な構造になっているかどうかの確認が必要です。 そのでてきたもの全文質問本文に追記してください
whyyasai

2021/07/06 07:46

先ほど投稿いたしました文が、全文になってます。
m.ts10806

2021/07/06 08:05

いえですから、その結果を質問本文に追記してくださいという話で。
whyyasai

2021/07/06 08:07

勘違いしていました、失礼いたしました。
m.ts10806

2021/07/06 08:22

あの、何度もすみませんが、SQLもコードなのでPHPのところと同じように記載願います。 ``もマークダウンの機能としてあるのでご覧の通り「手元のコードそのまま」ではないのです。
whyyasai

2021/07/06 08:45

すみません、編集しました。 これで合っていますでしょうか?
m.ts10806

2021/07/06 08:50

はい、バッチリです。
guest

回答2

0

INSERT文をこの書き方にすると、画像データがDBにも保存されるようになりました。

投稿2021/07/07 08:10

編集2021/11/19 03:34
whyyasai

総合スコア3

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

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

0

ベストアンサー

なんだ、INSERT INTO文が文法エラーしているだけじゃないか。
INSERT INTO テーブル名(カラム名, カラム名, カラム名, ...) VALUES (データ, データ, データ, ...);
が基本形。

phpコードの分岐や条件は、var_dump()駆使して掌握してほしいところ。

データベースへのアクセスの一連の流れは、こちらの記事を読むとわかりやすい:
PHPでデータベースに接続するときのまとめ - Qiita

mysqlを相手にしているなら、リファレンスマニュアルも目を通すこと:
MySQL :: MySQL 8.0 リファレンスマニュアル
MySQL :: MySQL 5.6 リファレンスマニュアル

投稿2021/07/06 05:40

編集2021/07/06 05:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

whyyasai

2021/11/19 03:32 編集

ありがとうございます! この場合のINSERT文は、 これで合っていますでしょうか??
退会済みユーザー

退会済みユーザー

2021/07/06 07:49

カタチはいいと思うので、それをprepare()してbindValue()してexecute()するやり方で。 なお、SQL文字列中に変数を直接展開するやり方はやってはいけない。 必ずバインドパラメータとプリペアドステートメントのセットで。
whyyasai

2021/11/19 03:32 編集

掲載していただいたQiitaのURLからの引用なのですが、例えば という風にするということですか??
退会済みユーザー

退会済みユーザー

2021/07/06 08:20 編集

「, 0, NOW()」の箇所まで置き換える必要はないですよ。 $_POSTや$filenameなど変数に持っている値を与える箇所に適用します。 PDO::PARAM_INTは数値用、PDO::PARAM_STRは文字列用で、 コレを使えば'?'などとプレースホルダを引用符で囲む必要がありません。 PDOにお任せできます。
whyyasai

2021/11/19 03:33 編集

PHPの知識が乏しくて理解できなかったため別のパターンでコードを書いてみました。 見ていただけると嬉しいです。 これでいけてますでしょうか?
退会済みユーザー

退会済みユーザー

2021/07/06 08:55 編集

「NOW()」はSQL文上にそのまま置いていいので、 わざわざバインドパラメータにする必要はありませんよ。 あと、数値か文字列かの指定が足りてないのが心配。 ':reply_post_id'は多分数値だろうから、第3パラメータにPDO::PARAM_INTを、 他のは文字列だろうから、第3パラメータにPDO::PARAM_STRを。
whyyasai

2021/07/06 11:51

置き換える必要がないの意味を調べてやっとどういうことか理解することができました。 そして、m6uさんのおかげで1ヶ月以上悩み続けた問題を解決することができました!!!!! DBにきちんと画像データが記録されています!!!!!!!!!!!!!! 本当にありがとうございます!!!!!!!!!!!!! あともう1つ質問があって、、、 DBに入っている画像を表示することができない状態で、青い四角の中に?が書いているものが表示されます。 <img src="<?php echo $post['file_path']; ?>" alt=""> コードはこのように書いています。 もし、お時間がありましたらお返事お待ちしております。 厚かましくて申し訳ありません。
退会済みユーザー

退会済みユーザー

2021/07/07 00:08

$post[] ってなんでしょうか。var_dump($post['file_path']); とかかけば中身はわかるはずですけれど、 フォームのPOST送信を受信するのは $_POST[] なので、それとは違いますよね。
whyyasai

2021/11/19 03:33 編集

$post[]は、 このコードの部分を使って、 <?php foreach($posts as $post): ?> <?php echo h($post['title']); ?> : : <img src="<?php echo $post['file_path']; ?>" alt=""> : : <?php endforeach; ?> タイトルやテキストを表示させてます。画像も同じようにできるかなと思ったのですが、出来ませんでした。 別の方の質問を見て、 echo "<img src='image/".$post['file_path']."' width='20%'>"; これを試しましたところ、画像が表示されました。このやり方はあっているのでしょうか? 画像を投稿しなかった場合には青い四角の中に?が書いているものが表示されてしまい、それを無くしたいと思っているところです。
退会済みユーザー

退会済みユーザー

2021/07/07 00:52

画像がない場合にも imgタグを出力してしまうから、そうなってしまうので、 有無を判定するif()を置いて条件分岐しましょうよ。 $post['file_path']が無効であれば img そのものを出力しないという設計で。
whyyasai

2021/07/07 01:29

if(isset($post['file_path'])){ echo "<img src='image/".$post['file_path']."' width='20%'>"; } これでできるようになりました! ありがとうございます!
whyyasai

2021/07/07 01:33

すみません、成功してませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問