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

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

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

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

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

2680閲覧

php,html,jQuery.ajax()で画像ファイルとテキストをアップロードしたい

zuka3

総合スコア3

MySQL

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

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/07/15 12:31

編集2020/07/15 15:28

jQuery.ajax()を用いて、画像とテキストデータを同時にアップロードしたいです。現状、テキスト入力、画像選択はできます。しかし、送信ボタンを押しても、postもされず、dbに保存もできてません。chromeにデベロッパツールには、エラーが出てこないです。
詳細↓
index.phpにて、画像とテキストを入力させ、ajaxでget_trip.phpにPOSTする。get_trip.phpは、受けとったデータをmysqlのDBに保存。load_trip.phpでsqlでselectし、index.phpで画像、テキストを表示です。function.phpは、db接続をしてます。DBは、テーブル名がtripsで,カラム詳細は,id,user_id,comment,image_name,image_content,image_type,image_size です。

画像ファイルのパスを一時的に保存したいです。

とりあえずの目的は、画像、テキストをDBに保存させる!!ことです。

php

1//index.php 2//関係あるところのみ 3 <div class="input_form"> 4 <div class="container mt-5"> 5 <div class="row"> 6 <div class="col-md-4 pt-4 pl-4"> 7 <form id="trip_data" method="post" enctype="multipart/form-data" > 8 <div class="form-group"> 9 <label>画像選択</label> 10 <input type="file" name = "image" accept=".jpg, .png" required> 11 </div> 12 <textarea class="comment"></textarea> 13 <button class="trip_button">Trip</button> 14 </form> 15 </div> 16 </div> 17 </div> 18 </div> 19 20<script> 21// ****************trip_buttonが押された時************************* 22 $(".trip_button").on("click", function(event){ 23 24 function file_upload(){ 25 // フォームデータを取得 26 var formdata = new FormData($('#trip_data').get(0)); 27 28 // POSTでアップロード 29 $.ajax({ 30 url : "get_trip.php", 31 type : "POST", 32 data : { 33 formdata, 34 "id": $(".list:first").data("list"), 35 "user_id": "<?php echo $_SESSION['user_id']; ?>", 36 "comment": $(".comment").val() 37 }, 38 cache : false, 39 contentType : false, 40 processData : false, 41 dataType : "json", 42 success: console.log('send!'); 43 }) 44 .done(function(data, textStatus, jqXHR){ 45 update(); 46 $(".comment").val(""); 47 }) 48 .fail(function(jqXHR, textStatus, errorThrown){ 49 fail_err_msg(XMLHttpRequest, textStatus, errorThrown); 50 }); 51 52 } 53 54 }); 55</script>

php

1//get_trip.php 2<?php 3 header("Content-type: application/json; charset=UTF-8"); 4 5 date_default_timezone_set("Asia/Tokyo"); 6 7 require("function.php"); 8 9 $sql = null; 10 $stmt = null; 11 12 $db = db_connect(); 13 14 $id = $_POST["id"]; 15 $user_id = $_POST["user_id"]; 16 $comment = $_POST["comment"]; 17 $datetime = new DateTime(); 18 $datetime = $datetime->format("Y-m-d H:i:s"); 19 20 if ($_SERVER['REQUEST_METHOD'] != 'POST') { 21 // 画像を取得 22 }else{ 23 // 画像を保存 24 if(!empty($_FILES['image']['name'])){ 25 $name = $_FILES['image']['name']; 26 $type = $_FILES['image']['type']; 27 $image_content = file_get_contents($_FILES['image']['tmp_name']); 28 $size = $_FILES['image']['size']; 29 30 $sql = "INSERT INTO trips(id,user_id,comment,image_name,image_type,image_content,image_size,created_at) 31 VALUES(null,?,?,:image_name,:image_type,:image_content,:image_size,?)"; 32 $stmt->$db->prepare($sql); 33 $stmt->bindValue(':image_name', $name, PDO::PARAM_STR); 34 $stmt->bindValue(':image_type', $type, PDO::PARAM_STR); 35 $stmt->bindValue(':image_content', $image_content, PDO::PARAM_STR); 36 $stmt->bindValue(':image_size', $size, PDO::PARAM_INT); 37 $stmt->execute( array($user_id, $comment,$image_content, $datetime) ); 38 } 39 40 unset($db); 41 header('Location:index.php'); 42 exit(); 43 } 44 45 unset($db); 46 47 ?> 48 49

get_trip.phpのSQL文が違うのか、while文のとこが、違うの、合ってたとしたら、index.phpのajaxのコードが違うか...
どこがどのように違うのかわかりません。どなたか助けてください。色んなサイトを参考にして書いたのですが、うまくいきません...
DBにデータが保存させできれば、あとは頑張れそうなのですが、そこができないです。
おそらく、補足情報が足りないと思いますので、質問してください。

回答がついた後に指摘を受けて修正したので、既存の回答とは相違があります

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

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

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

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

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

guest

回答3

0

(他もあるけど直接関係しそうなところで)気になったところだけ。

var formdata = new FormData($('#trip_data').get(0));

trip_dataというIDは提示されたHTML内にはありません。

if(!empty($_FILES['image']['name'])){

imageというnameがついた入力コントロールはどこにもありません。

追記:

header('Location:get_trip.php');

Ajaxですが、どこに遷移させようとしているのでしょうか?
基本は「リクエストを送ってきた元」に返します。

try-catchによるエラーハンドリングは必ず入れましょう。

投稿2020/07/15 12:35

編集2020/07/15 13:46
m.ts10806

総合スコア80850

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

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

zuka3

2020/07/15 12:40

コードを間違えました、修正します
m.ts10806

2020/07/15 12:47

それはどういう意味の「間違えた」でしょうか。 現在のコードをコピペしたのではないですか?
zuka3

2020/07/15 12:49

いろいろ試していて、複数のファイルがあるので、違うファイルをコピペしてしました。修正しました。
m.ts10806

2020/07/15 13:21

このままだと、編集履歴から確認できるとはいえ、私の回答が「存在しないコードに対する回答」になっているので、一言但し書きを入れておいてもらえたらと。
m.ts10806

2020/07/15 13:21

あと、 $_POST、$_FILESは送信できているのでしょうか。 デバッグしてみてください。
m.ts10806

2020/07/15 13:31

しかしながら >trip_dataというIDは提示されたHTML内にはありません。 ここは結局、違ったままですね。 trip_dataというclassはあるけど、idはないです。
zuka3

2020/07/15 13:44

>このままだと、編集履歴から確認できるとはいえ、私の回答が「存在しないコードに対する回答」になっているので、一言但し書きを入れておいてもらえたらと。 teratailの使い方にまだ慣れてないので、どのように直せは良いですか?
m.ts10806

2020/07/15 13:47

>いろいろ試していて、複数のファイルがあるので、違うファイルをコピペしてしました。修正しました。 です。あと「回答がついた後に指摘を受けて修正したので、既存の回答とは相違があります」とか。
guest

0

ベストアンサー

PHP は知らない自分がレスするのもなんですが・・・

しかし、送信ボタンを押しても、postもされず、dbに保存もできてません。

サーバー側の話をする以前に jQuery ajax を使って送信できてないところを解決しないと先に進めないという話でしょうか?

jQuery ajax のコードの data の設定は正しいのでしょうか? form データを post するのですよね? 自分が試した限りですが以下記事の View のコードのスクリプトのように FormData オブジェクトだけを data に設定すれば送信できるはずなのですが?

MVC でファイルのアップロード
http://surferonwww.info/BlogEngine/post/2019/08/03/file-upload-on-aspnet-mvc-application.aspx

スクリプトのみを抜粋すると以下の通りです。

<script type="text/javascript"> //<![CDATA[ $(function () { $('#ajaxUpload').on('click', function (e) { // FormData オブジェクトの利用 var fd = new FormData(document.querySelector("form")); // 追加データを以下のようにして送信できる。フォーム // データの一番最後に追加されて送信される fd.append("CustomField", "This is some extra data"); $.ajax({ url: '/home/upload', method: 'post', data: fd, processData: false, // jQuery にデータを処理させない contentType: false // contentType を設定させない }).done(function(response) { $("#result").empty; $("#result").text(response); }).fail(function( jqXHR, textStatus, errorThrown ) { $("#result").empty; $("#result").text('textStatus: ' + textStatus + ', errorThrown: ' + errorThrown); }); }); }); //]]> </script>

中身が sample text file というテキストファイルを送信すると以下のようになります(Fiddler によるキャプチャ画像)。multipart の一番上が隠しフィールドのトークン、2 番目がテキストファイル、3 番目が上のコードの fd.append("CustomField", "This is some extra data"); で追加したデータです。

イメージ説明

質問者さんも Fiddler を使ってどうなっているか確認してみてはいかがですか?

投稿2020/07/15 13:27

編集2020/07/15 13:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2020/07/15 13:30

>FormData オブジェクトだけを data に設定すれば送信できるはずなのですが? やはり、そこから突っ込むべきでした・・
guest

0

単に「data:formdata」でよくないですか?
「dataType: "json"」もホントのjsonが返ってくる確信がないなら不要。
successとdoneを併用するのもやめてくださいや(successsは非推奨)

投稿2020/07/16 00:35

編集2020/07/16 00:36
yambejp

総合スコア114829

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問