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

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回答

558閲覧

ajax使用時にPHPでPDOを行うと正常に返ってこない

tachyonk1

総合スコア1

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クリップ

投稿2023/01/29 13:11

編集2023/01/29 14:05

前提

web系の勉強を行っており、jsとphpの連携としてajaxを学び始めました。
jqueryのバージョンは3.6.3, phpのバージョンは8.12, 使用してるDBはpostgesでバージョンは14.6です。
xampp環境で行っております。

実現したいこと

htmlで入力された値をjsで取得し、PHPで値の判定を行う。
この内、『htmlで入寮された値をjsで取得する』『ajaxを使用してPHPに値を渡し戻り値を表示する』に関しては問題なく動作しました。
その後『PHPからPDOでpostgresに接続を行い、DB内のデータと照合し正誤を判定する』という処理を行おうとした際に問題が発生しました。

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

PDOを使用するとPHPからのechoを受け取ることができなくなりました。PDOを使用している行(PHPソースコード内11行目)をコメントアウトすると問題なく動作します。

該当のソースコード

<html>

html

1<head> 2 <meta charset="UTF-8"> 3 <script type="text/javascript" src="jquery-3.6.3.min.js"></script> 4 <script type="text/javascript" src="top.js"></script> 5</head> 6 7<title>system01</title> 8 9<form> 10 <input placeholder="ユーザーID" id="userid"></input><br> 11 <input placeholder="パスワード" id="password"></input><br> 12 <button onclick="login_button()">ログイン</button> 13</form>

javascript

1function login_button(){ 2 let userid = document.getElementById('userid').value; 3 let password = document.getElementById('password').value; 4 let msg; 5 6 jQuery.ajax({ 7 type: 'post', 8 url: 'top.php', 9 data: {'func' : 'login_check', 'argument': userid,password}, 10 success: function(content){ 11 msg = content; 12 alert(msg); 13 }, 14 error: function(content) { 15 alert("通信失敗"); 16 } 17 }); 18}

PHP

1<?php 2$func = $_POST['func']; 3$argument = $_POST['argument']; 4echo $func($argument); 5 6function login_check($userid=NULL,$password=NULL){ 7 try { 8 $dsn = 'pgsql:dbname=postgres host=localhost port=5432'; 9 $user = 'postgres'; 10 $passwords = ''; //こちらpasswordsの間違いです、申し訳ありません 11 $dbh = new PDO($dsn, $user, $passwords); 12 return "正常値"; 13 }catch(PDOException $e){ 14 return "エラー"; 15 } 16}

試したこと

①PDOのエラーではないかと思い、PHPを単体で動かしました。しかし値は「正常値」が返ってきておりPDO接続でエラーが発生しているわけではないと思いました。

②11行目以降が実行されていないのではないかと思い、login_check内returnの前に「file_put_contents()」を記載し、ファイルが作成されるかどうかを調べました。結果としてファイルが作成されており実行していることがわかりました。

③PDOを使用している11行目をコメントアウトするとどうなるのかを調べました。結果として「正常値」というアラートが表示され、echoされた値を受け取っていることがわかりました。

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

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

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

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

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

guest

回答2

0

自己解決

原因は不明ですが
ajaxの呼び出し前に「event.preventDefault();」を記述することでPDOを使用しても受け取ることができました
内容を調べようと思いますが、今回はこれで閉めさせていただきます

投稿2023/01/29 15:04

tachyonk1

総合スコア1

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

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

0

JavaScriptサイドとPHPサイドに、少なくとも1つずつ問題点がありました。

data: {'func' : 'login_check', 'argument': userid,password}のように書いた場合、argumentuseridは無視されてpasswordしか送られません。

また、$func($argument)のように渡した場合、引数は1つしか渡すことができません。


それ以前の問題として、「DBパスワードをJavaScriptに書く」ことや「実行する関数もJavaScriptから自由に指定可能」など、プログラム構造が致命的に脆弱です。

投稿2023/01/29 13:43

maisumakun

総合スコア145184

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

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

tachyonk1

2023/01/29 14:08

ありがとうございます、PHP内変数名を誤って記載していたため訂正いたしました JSからの戻り値にはDBのパスワードはありません 練習中なのでできるだけシンプルに記載しているため脆弱性対応はしておりません DBもユーザー名は「postgres」パスワードはなしです。 私がほしいのは脆弱性に関する話ではなく、なぜPDOを記述するとAJAXで受け取れないのかという点についてです 練習時点で脆弱性対応を行うのは効率として非常によろしくないと思います
maisumakun

2023/01/29 14:27

> 私がほしいのは脆弱性に関する話ではなく、なぜPDOを記述するとAJAXで受け取れないのかという点についてです 前半部分に書いたように、意図通りにコードが動いていない部分があると思われます。
maisumakun

2023/01/29 14:28

> 練習時点で脆弱性対応を行うのは効率として非常によろしくないと思います 練習段階でセキュリティ上まずい変な癖がついてしまうともっと厄介だと考えます。
tachyonk1

2023/01/29 14:38

ありがたいですが今は遠慮しておきます 分かりやすい修正としてAJAXで渡す値を1つにし、PHPの引数も1つにしましたが何も変わらないようです
maisumakun

2023/01/29 14:49

> 何も変わらないようです ブラウザで実行したときのリクエストとレスポンスの内容は確認してみましたか?(ブラウザの開発ツールで確認可能です)
tachyonk1

2023/01/29 15:05

ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問