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

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

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

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

1283閲覧

Reactとサーバーサイドの実装(Reactのコンポーネントの値をphpにPOSTしたい)

caren

総合スコア25

XAMPP

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/09/13 02:41

編集2022/09/14 05:06

前提

Reactの勉強中です。
create react appで作成したフォルダを npm run build し、できたbuildフォルダをドキュメントルートとしてXAMPP上で動かしています。
とりあえず簡単な画面は作成できました。

ドキュメントルート:C:\Users\アカウント名\react_app\build

実現したいこと

私が実現したいのは、そのXAMPP環境にあるreactに書かれているinputタグなどに値を入力し、その値をphpにPOSTし、その値を元にXAMPPのmySQLにアクセスしてDBでなんやかんやしたいという、サーバーサイド側の実装です。Ractとphpをひとつのフォルダなりにまとめるのは難しいのでしょうか?
初心者ですので見当違いな質問でしたらすみません。

jsx(React側について)
POSTする処理は postData に記載しています。
その中ではURLSearchParamsのインスタンスであるparamsを作成し、そのparamsにappendする形でPOSTしたいデータを追加しています。
URLSearchParamsを使用したのはcontent typeをapplication/x-www-form-urlencodedの形式でphpに送信したいと考えたからです。
また、axiosを使ってそのparamsを指定のURLに送るという処理を書いているつもりです。

phpについて
POSTされたデータを受け取って、$_POST[ ]をechoする処理を記載しています。

☆わからない点
通常のHTMLで書かれたformの内容をphpで受け取る時は、HTMLのフォーム内のinputタグのname属性をphpの$_POST[ 'name']のように
指定すると受け取れると思います。URLSearchParamsのappendを利用するとき、phpでどのように受け取ればよいでしょうか?

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

しかしXAMPP環境でReactの開発をしている方が大変少ないようで、ググってもReact側からどうやってDBにアクセスするのかわかりませんでした。

エラーメッセージ

該当のソースコード

jsx

1 2import { useForm } from 'react-hook-form'; 3import axios from "axios"; 4import React, { useState, useEffect } from 'react'; 5import { Button, Checkbox, Form } from 'semantic-ui-react' 6 7function LoginForm() { 8 const [firstName, setFirstName] = useState(''); 9 const [lastName, setLastName] = useState(''); 10 const [checkbox, setCheckbox] = useState(false); 11 12 const postData = () => { 13 console.log(firstName); 14 // console.log(lastName); 15 // console.log(checkbox); 16 var params = new URLSearchParams();  17 params.append('param1', firstName); 18 // params.append('param2', {lastName}); 19 // params.append('param3', {checkbox}); 20 axios.post('localhost/MyWeb0711/index.php', params) 21 .then((res) => { 22 console.log(res.data.text); 23 }) 24 .catch((error) => { 25 console.log(error); 26 }); 27 } 28 29 return( 30 <div> 31 <Form className="create-form"> 32 <Form.Field> 33 <label>First Name</label> 34 <input placeholder='First Name' value={firstName} onChange={(e) => setFirstName(e.target.value)}/> 35 </Form.Field> 36 <Form.Field> 37 <label>Last Name</label> 38 <input placeholder='Last Name' value={lastName} onChange={(e) => setLastName(e.target.value)}/> 39 </Form.Field> 40 <Form.Field> 41 <Checkbox label='I agree to the Terms and Conditions' checked={checkbox} onChange={(e) => setCheckbox(!checkbox)}/> 42 </Form.Field> 43 <Button onClick={postData} type='submit'>Submit</Button> 44 </Form> 45</div> 46 ); 47} 48 49export default LoginForm; 50

php

1<?php 2 if(!empty($_POST)){ 3 if(isset($_POST['param1'])){ 4 echo $_POST['param1']; 5 }else{ 6 echo 'name失敗'; 7 } 8 }else{ 9 echo 'post失敗'; 10 } 11?> 12

試したこと

Fetchで試してみる→phpにリクエストが送れていなさそう
axiosで試してみる→上に同じ

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

kazto

2022/09/13 04:18

- サーバ、クライアントの構成が適切に構築されているか - コードが適切に記述されているか が示されていないため、回答が困難です。 上記を追記おねがいします。
caren

2022/09/13 04:37

サーバ、クライアントの構成が適切に構築されているか、というのがよくわかっていません。 具体的にどのような情報を載せたらよいか教えていただけないでしょうか。
kazto

2022/09/13 04:45

同一のlocalhostで動かしていたとしても、php側(サーバ側)とReact側(フロントエンド)は分けて考えた方がよいです。 phpのコードは単体で動作することは確認できていますか? また、追記いただいたエラー文から、フロントエンドはwww.my-react-app.com という外部ホストから動作しているように見受けられます。このホストに関する情報を記載おねがいします。
caren

2022/09/13 04:55

XAMPPのバーチャルホストという設定を変更していて、configファイルは下記のように変更しております。 変更したファイル "C:\xampp\apache\conf\extra\httpd-vhosts.conf" <VirtualHost 127.0.0.1:80> ServerName my-react-app.com ServerAlias www.my-react-app.com ServerAdmin webmaster@my-react-app.com DocumentRoot "C:\Users\アカウント名\react_app\build" <Directory C:\Users\アカウント名\react_app\build> Options Indexes FollowSymLinks MultiViews AllowOverride all Order Deny,Allow Allow from all Require all granted </Directory> </VirtualHost> 初歩的な質問で申し訳ないのですが、php側でも受け取る処理を書かないとエラーになってしまうのでしょうか?とりあえずまずクライアント側からサーバ側へPOSTできたらいいかな、位に考えていたので。php側が単体で動作する、というのはエラーがなければOKなのでしょうか?例えばクライアント側からPOSTが受け取れたらechoで出力する程度のもので大丈夫でしょうか?(何もわからずまだphpのHTMLしか書けていないため。)
kazto

2022/09/13 06:15

> php側でも受け取る処理を書かないとエラーになってしまうのでしょうか? おっしゃるとおりです。受け取ることができないところにデータを送信しても、エラーとなります。 > 例えばクライアント側からPOSTが受け取れたらechoで出力する程度のもので大丈夫でしょうか? そうですね、まずはそれくらいで問題ないと思います。
caren

2022/09/13 23:52 編集

ご回答ありがとうございます。とりあえずjsxとphp側を修正しました。 php側は問題なく動くことは確認済みです。 jsxの方のコードに関してお聞きしたいです。 まず、jsxからpostする方法についてです。コードの中でURLSearchParamsのインスタンスを作り、それをaxiosでpostする、ということをやっています。しかしFormDataの方がよいという記事もみかけました。どちらが良いのか知識をお持ちでしたら教えていただきたいです。 また、最終的な目標はinputで入力された値をpostすることなのですが、Reactでなければformタグで囲ってaction属性で送信先を指定して、みたいな形で実現できると思うのですが、それをReactで実現する方法をご存じであれば教えていただきたいです。React Hook Formを使うか、使わないで実装するかも迷いました。React Hook Formを使うと制御コンポーネント(Reactのstateが管理する)、使わなければ非制御コンポーネント(DOMが管理する)位の知識しかありませんが、ご回答くだされば幸いです。
guest

回答1

0

jsxからpostする方法についてです。コードの中でURLSearchParamsのインスタンスを作り、それをaxiosでpostする、ということをやっています。しかしFormDataの方がよいという記事もみかけました。どちらが良いのか知識をお持ちでしたら教えていただきたいです。

axiosを使う方法というのと、FormDataを使う、というのは相反する方法ではありません。
axiosでFormDataを投げる方法だってあります。どちらが優れている、というものではありません。

React Hook Formを使うか、使わないで実装するかも迷いました。

こちらも同様に、React Hook Formを使う方法と使わない方法両方が存在しますが、どちらが優れているというものではありません。carenさんが、こっちでやる、と決めて実装するものです。この際ですので、両方試してみて長所短所を実感してみてはいかがでしょうか。

投稿2022/09/14 03:02

kazto

総合スコア7196

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

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

caren

2022/09/14 03:41

回答ありがとうございます。 現在のソースをchrome上でデバッグしたところ、axios.postのthenにもcatchの処理にも入らず、そのまま処理を抜けてしまいます。また、前まで出ていたエラーも出ず、コンソールにログが吐かれることもありません。 私が書いたコードで間違っている点があれば教えていただきたいです。 HTTPリクエストについてはもう少し自分で調べてみます。また、とりあえず今はReact Hook Formを使わずに実装してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問