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

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

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

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

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

Q&A

解決済

2回答

1940閲覧

Ajaxの非同期通信で画像をアップロードしたい。

alyssa703957

総合スコア12

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

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

0グッド

0クリップ

投稿2021/11/12 09:01

編集2021/11/12 10:00

phpとJS(Ajax)を用いてチャットアプリの作成をしています。
ネットに転がっているものを参考にしつつ作成をしています。

メッセージは反映され、表示できるのですが、
画像を送信する機能を作成していたところ、$_filesがからのまま渡っていてDBに送信できません。
どのようにすれば値が渡るか教えて欲しいです。
Ajaxのコードとformのコードを以下に貼ります。
enctype="multipart/form-data"は指定済みです。

form

1<form action="#" class="img_send" method="POST" enctype="multipart/form-data"> 2 <input type="text" name="outgoing_msg_id" value="省いています" hidden> 3 <input type="text" name="incoming_msg_id" value="省いています" hidden> 4   <input type="file" name="msg_img" id="filesend"> 5 6 <button type="button"><i class="fas fa-upload"></i></button> 7 </form>

js

1 2const form = document.querySelector(".img_send"), 3inputField = form.querySelector("input-field"), 4sendBtn = form.querySelector("button"); 5 6sendBtn.onclick = ()=>{ 7 let xhr = new XMLHttpRequest(); 8 xhr.open("POST","insert-img-chat.php", true); 9 xhr.onload = ()=>{ 10 if(xhr.readyState === XMLHttpRequest.DONE){ 11 if(xhr.status === 200){ 12 inputField3.value = ""; 13 scrollToBottom(); 14 } 15 } 16 } 17 let formData = new FormData(form); 18 xhr.send(formData); 19}

insert-img-chat.php↓

<?php session_start(); if(isset($_SESSION['user_unique_id'])){ require_once(ROOT_PATH .'Controllers/UserController.php'); $user = new UserController(); $user->InsertMsgImg(); } ?>

insert-img-chat.phpにおける$user->InsertMsgImg()の処理部分が以下です。

controller

1public function InsertMsgImg(){ 2 $users = $this->PrivateChatRoom->insert_msg_img(); 3 return $users; 4 }
public function insert_msg_img(){ if(isset($_POST['outgoing_msg_id'])){ $outgoing_msg_id = $_POST['outgoing_msg_id']; } if(isset($_POST['incoming_msg_id'])){ $incoming_msg_id = $_POST['incoming_msg_id']; } //画像送信 if($_FILES['msg_img']){ $msg_img_name = $_FILES['msg_img']['name']; $msg_img_type = $_FILES['msg_img']['type']; $msg_img_tmp_name = $_FILES['msg_img']['tmp_name']; $msg_img_explode = explode('.',$msg_img_name); $msg_img_txt = end($msg_img_explode); $extensions = ["png","jpag","jpg"]; if(in_array($msg_img_txt,$extensions) === true){ $time = time(); $new_img_name = $time.$msg_img_name; if(move_uploaded_file($msg_img_tmp_name,"img/".$new_img_name)){ $msg_img = $new_img_name; } } } if(!empty($msg_img)){ $sql = "INSERT INTO $this->table(outgoing_msg_id,incoming_msg_id,msg_img) VALUES(:outgoing_msg_id,:incoming_msg_id,:msg_img)"; $sth = $this->dbh->prepare($sql); } $this->dbh->beginTransaction(); try { $sth = $this->dbh->prepare($sql); $sth->bindParam(':outgoing_msg_id', $outgoing_msg_id, PDO::PARAM_INT); $sth->bindParam(':incoming_msg_id', $incoming_msg_id, PDO::PARAM_INT); $sth->bindParam(':msg_img', $msg_img, PDO::PARAM_STR); $result = $sth->execute(); $this->dbh->commit(); return $result; } catch (\PDOException $e) { echo '更新失敗'.$e->getMessage(); $this->dbh->rollBack(); exit(); } }

insert-img-chat.phpに遷移はデバックでできています。
insert-img-chat.php内でのSQL実行に際に$_filesの値が取得できません。

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

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

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

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

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

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

KAOsaka

2021/11/12 09:31

PHPのソースは記載できますか?
alyssa703957

2021/11/12 10:00

MVCで作成しているためコードを複数追加しました。 よろしくお願いいたします!!
guest

回答2

0

ベストアンサー

擬似的に再現したコードで実行してみましたが、$_FILESの値は問題なく取得できています。

提示いただいているコード以外の部分に問題があるかと思われます。

ブラウザの開発ツールでファイルが送信されてるか確認していただいて、

ブラウザの開発ツールでファイルが送信されてるか確認

送信されているようであればphpのエラーログを確認していただくのが良いかと思います。

擬似的に再現したコード

index.php

php

1<form action="#" class="img_send" method="POST" enctype="multipart/form-data"> 2 <input type="file" name="msg_img" id="filesend"> 3 4 <button type="button">Upload</button> 5</form> 6 7<script> 8const form = document.querySelector(".img_send"); 9const sendBtn = form.querySelector("button"); 10 11sendBtn.onclick = () => { 12 let xhr = new XMLHttpRequest(); 13 14 xhr.open("POST", "insert-img-chat.php", true); 15 16 xhr.onload = () => { 17 console.log(xhr.responseText); 18 } 19 20 let formData = new FormData(form); 21 22 xhr.send(formData); 23} 24</script>

insert-img-chat.php

php

1<?php 2session_start(); 3 4class PrivateChatRoom { 5 public function insert_msg_img() { 6 return $_FILES['msg_img']; 7 } 8} 9 10class UserController { 11 public function __construct() { 12 $this->PrivateChatRoom = new PrivateChatRoom(); 13 } 14 15 public function InsertMsgImg() { 16 $users = $this->PrivateChatRoom->insert_msg_img(); 17 18 return $users; 19 } 20} 21 22if (true) { 23 $user = new UserController(); 24 25 $users = $user->InsertMsgImg(); 26 27 echo json_encode($users); 28}

HTTP Resonse

plain

1{ 2 "name":"1.jpg", 3 "type":"image/jpeg", 4 "tmp_name":"/tmp/phpGUgzMx", 5 "error":0, 6 "size":83122 7}

投稿2021/11/14 06:23

KAOsaka

総合スコア531

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

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

alyssa703957

2021/11/14 08:54

ありがとうございます!解決できました! Ajaxの中のコードにみすがありました!
guest

0

非同期でファイルを転送するならfetchをformdataで送るのが楽です

html

1<script> 2window.addEventListener('DOMContentLoaded',()=>{ 3 document.querySelector('#btn').addEventListener('click',e=>{ 4 const url="test.php"; 5 const body=new FormData(e.target.form); 6 const method="post"; 7 fetch(url,{body,method}).then(res=>res.text()).then(console.log); 8 }); 9}); 10 11</script> 12<form action="#" class="img_send" method="POST" enctype="multipart/form-data"> 13<input type="file" name="msg_img" id="filesend"> 14<button type="button" id="btn">send</button> 15</form>

//test.php

PHP

1<?PHP 2print_r($_FILES);

投稿2021/11/14 05:32

yambejp

総合スコア114837

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

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

alyssa703957

2021/11/14 08:55

ありがとうございます! 参考にさせていただきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問