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

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

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

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

Q&A

3回答

4683閲覧

if (isset($_GET ... の不可思議

ikawa19660319

総合スコア10

PHP

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

0グッド

2クリップ

投稿2019/03/18 06:27

編集2022/01/12 10:55

HELP! おしえて下さい。

以下のPHPは、前任者作成のページで改修が必要となったもので、
MS SQLデータベースを使用したデータ編集のPHPとなります。
SQLとのアクセス、また、データ編集などの基本的な機能は想定
通りに動作するのですが、以下の点で足踏みしています。

ソースのデータ取得部《 $stmt = $db->query("SELECT ... WHERE ... 》
で、WHERE を使用したいのですが、意図した動作となりません。

それは、《 if (isset($_GET["func"]) && $_GET["func"] == ... 》
以降で、変数渡しが不能のようで、別ページのsubmitボタンで値を
送信し、それをTOP部の《 $_GET['InPass'] 》などで受け、条件指定で
テーブル参照し、表示、編集させたいのですが、...

ところが、《 WHERE pass_master.Pass='$InPass' 》 には変数が
渡らず、固定値(例えば、'HK1640')などでは、WHERE の条件が機能し、
意図した結果が得られるのですが、...

また、別ページからの値は、《 if (isset($_GET["func"]) && ...》
直前の《 print $InPass; 》では意図した通りの結果が得られます。

なぜでしょうか? よろしくお願いします。

以下、ソースコード(page1.php) --------------------------------------------------------------

<?php if(isset($_GET['InPass'])) { $InPass = $_GET['InPass']; } else { $InPass = $_REQUEST['InPass']; } ?> <?php $dsn = 'sqlsrv:server=XXXXXXXX;database=XXXXX'; $user = 'XXX'; $password = 'XXXXXXXXXX'; $db = new PDO($dsn, $user, $password); $columns = "Jcode varchar(20) PRIMARY KEY, Scode varchar(13) PRIMARY KEY, Name varchar(20), SaCode tinyint, SaName varchar(12), KJkyu money, JWarimasi money, SWarimasi money, HWarimasi money, YWarimasi money, DWarimasi money, Koutsu money, Sdatetime datetime" ; $db->exec("CREATE TABLE IF NOT EXISTS TM_webJikyu ($columns)"); /**************/ /* データ取得部 */ /**************/ //print $InPass; if (isset($_GET["func"]) && $_GET["func"] == "get_data") { //$InPass = 'HK1640'; $stmt = $db->query("SELECT pass_master.Pass, TM_webJikyu.SaCode, TM_webJikyu.Scode, TM_webJikyu.* FROM pass_master INNER JOIN TM_webJikyu ON pass_master.id = TM_webJikyu.Jcode WHERE pass_master.Pass='$InPass' ORDER BY TM_webJikyu.SaCode, TM_webJikyu.Scode;"); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); $json = json_encode($rows); echo $json; exit(); /*********************************/ /* データ更新部(削除、変更)*/ /*********************************/ } else if (isset($_POST["func"]) && $_POST["func"] == "upd_data") { // データ受取 $delid = $_POST["delid"]; $delid = json_decode($delid, true); $upddata = $_POST["upddata"]; $upddata = json_decode($upddata, true); // トランザクション開始 $db->beginTransaction(); // データ削除 if ($delid) { for ($i=0; $i<count($delid); $i++) { $sql = "DELETE FROM TM_webJikyu WHERE (((Jcode)=?) AND ((Scode)=?)) "; $stmt = $db->prepare($sql); $stmt->execute(array(1,$delid[$i]["Jcode"], $delid[$i]["Scode"])); } } // データ変更 if ($upddata) { for ($i=0; $i<count($upddata); $i++) { $sql = "UPDATE TM_webJikyu SET KJkyu=? WHERE (((Jcode)=?) AND ((Scode)=?))"; $stmt = $db->prepare($sql); $stmt->execute(array( $upddata[$i]["KJkyu"], $upddata[$i]["Jcode"], $upddata[$i]["Scode"])); } } // トランザクション終了 $db->commit(); exit(); } $db = null; ?> <!doctype html> <html> <head> <!-- スクリプト部分 --> <script type="text/javascript"> var Ajax = new XMLHttpRequest(); // 削除対象IDを格納する配列 var delid = []; // 変更データを格納する配列 var upddata = []; // 新規登録データを格納する配列 var insdata = []; window.onload = getSample; /************/ /* 一覧表示部 */ /************/ function getSample() { var rows, row, i, out; //コメント追加 out=""; var url = "http://1.1.1.1/page1.php" + "?dummy=" + new Date().getTime() + "&func=" + "get_data"; Ajax.open("GET", url, true); Ajax.send(null); Ajax.onreadystatechange = function() { if (Ajax.readyState == 4 && Ajax.status == 200) { out += '<p>'; out += '<th><font size="6">時給マスタ登録</font></th>'; out += '</p>'; out += '<p>'; out += '<table style="text-align: left;" border="0" cellpadding="2" cellspacing="2">'; out += '<td><button type="button" onClick="Upd();" style="width:120px;font-size:18;">'+"更 新"+'</button></td>'; out += '<td style="width: 200px; text-align: right;"><button type="button" onClick="Upd();" style="width:120px;font-size:18;color:red;">'+"削 除"+'</button></td>'; out += '</table>'; out += '</p>'; out += '<table border="1" id="sampletb">'; out += '<tr>'; out += '<th bgcolor=silver ><font Color="black">削除</th>'; out += '<th bgcolor=silver width="130">事業所名</th>'; out += '<th bgcolor=silver width="70">社員コード</th>'; out += '<th bgcolor=silver width="150">社員名</th>'; out += '<th bgcolor=silver width="110"><font size="2">基本時間給</th>'; out += '</tr>'; res = Ajax.responseText; if (res) { var rows = JSON.parse(res); for (i in rows) { out += '<tr>'; //削除flg out += '<td><input type="checkbox" id="'+i+':0" onClick="delCheck(this)";></td>'; //事業所名 out += '<td><input type="text" readonly style="width:130px; background-color:#d3d3d3;" id="'+i+':1" value="'+rows[i]["Jcode"]+'" ></td>'; //社員コード out += '<td><input type="text" readonly style="width:70px; background-color:#d3d3d3;" id="'+i+':2" value="'+rows[i]["Scode"]+'"></td>'; //社員名 out += '<td><input type="text" readonly style="width:150px; background-color:#d3d3d3;" id="'+i+':3" value="'+rows[i]["Name"]+'"></td>'; //基本時間給 if (rows[i]["KJkyu"] == null || rows[i]["KJkyu"] == '') { out += '<td><input type="number" style="width:110px; text-align:right; background-color:#ffffe0;" id="'+i+':6" value='+Math.round(rows[i]["KJkyu"])+' onChange="updCheck(this)";></td>'; } else { out += '<td><input type="number" style="width:110px; text-align:right; background-color:#ffffff;" id="'+i+':6" value='+Math.round(rows[i]["KJkyu"])+' onChange="updCheck(this)";></td>'; } out += '</tr>'; } } document.getElementById("result").innerHTML = out; } } } /**********/ /* 変更部 */ /**********/ function updCheck(e) { e.parentNode.style.backgroundColor = 'darkgreen'; var row = e.id.substr(0, e.id.indexOf(":")); var tid = document.getElementById(row+':1').value; var Scode = document.getElementById(row+':2').value; var Name = document.getElementById(row+':3').value; var SaCode = document.getElementById(row+':4').value; var SaName = document.getElementById(row+':5').value; var KJkyu = document.getElementById(row+':6').value; // 最初の変更処理 if (upddata.length == 0) { upddata.push({"Jcode":tid, "Scode":Scode, "Name":Name, "SaCode":SaCode, "SaName":SaName, "KJkyu":KJkyu, "JWarimasi":JWarimasi, "SWarimasi":SWarimasi, "HWarimasi":HWarimasi, "YWarimasi":YWarimasi, "DWarimasi":DWarimasi, "Koutsu":Koutsu, "Sdatetime":Td_date}); return; } // 2件目以降の変更処理 // 重複がある場合の変更処理 for (var i=0; i<upddata.length; i++) { if ((upddata[i]["Jcode"] == tid) || (upddata[i]["Scode"] == Scode)) { // 配列に追加 upddata.push({"Jcode":tid, "Scode":Scode, "Name":Name, "SaCode":SaCode, "SaName":SaName, "KJkyu":KJkyu, "JWarimasi":JWarimasi, "SWarimasi":SWarimasi, "HWarimasi":HWarimasi, "YWarimasi":YWarimasi, "DWarimasi":DWarimasi, "Koutsu":Koutsu, "Sdatetime":Td_date}); return; } } // 重複がない場合の変更処理 upddata.push({"Jcode":tid, "Scode":Scode, "Name":Name, "SaCode":SaCode, "SaName":SaName, "KJkyu":KJkyu, "JWarimasi":JWarimasi, "SWarimasi":SWarimasi, "HWarimasi":HWarimasi, "YWarimasi":YWarimasi, "DWarimasi":DWarimasi, "Koutsu":Koutsu, "Sdatetime":Td_date}); } /**********/ /* 削除部 */ /**********/ function delCheck(e) { var tid = document.getElementById(e.id.replace(':0',':1')).value; var Scode = document.getElementById(e.id.replace(':0',':2')).value; // チェック入れたとき if (e.checked == true) { e.parentNode.parentNode.style.backgroundColor = 'crimson'; delid.push({"Jcode":tid, "Scode":Scode}); // チェック外したとき } else if (e.checked == false) { e.parentNode.parentNode.style.backgroundColor = ''; for (var i=0; i<delid.length; i++) { if ((delid[i]["Jcode"] == tid) || (delid[i]["Scode"] == Scode)) { delid.splice(i, 1); delid.splice(i, 2); } } } } /**************/ /* 更新処理部 */ /**************/ function Upd() { delid2 = JSON.stringify(delid); upddata2 = JSON.stringify(upddata); insdata2 = JSON.stringify(insdata); url = "http://1.1.1.1/page1.php"; Ajax.open("POST", url, true); Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); Ajax.send("func=" + "upd_data" + "&delid=" + delid2 + "&upddata=" + upddata2 + "&insdata=" + insdata2); Ajax.onreadystatechange = function() { if (Ajax.readyState == 4 && Ajax.status == 200) { getSample(); // 配列初期化 delid.length=0; upddata.length=0; insdata.length=0; } } } </script> </head> <body> <div id="result"></div> </body> </html> <?php //クエリー結果の開放 sqlsrv_free_stmt($stmt); sqlsrv_free_stmt($stmt2); //コネクションのクローズ sqlsrv_close($conn); ?>

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

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

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

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

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

m.ts10806

2019/03/18 06:30

コードはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/help#about-markdown また「初心者」と書くのではなく「初心者アイコン」を質問につけてください。 質問は編集できます。
guest

回答3

0

$_REQUESTつかうならif(isset($_GET['InPass'])) {は不要だと思います。
PHPマニュアルにある通り$_GET、 $_POST そして $_COOKIE の内容をまとめた連想配列です。なので、$_GETの値も持ってます。

ただ、$_REQUESTを使うとどんなリクエストメソッドも受け入れてしまうのでよろしくないです。
POSTなら$_POST、GETなら$_GETを使うのが望ましく、それ以外は無効とすべきかと思います。

というより、より望ましいのはfilter_input()の利用です。


この処理は一般的なHTMLで組まれたフォームから送信されるわけではなく、
ajaxから利用されるということで良いですか?

いずれにしても$_REQUEST['InPass']など受け取るように書いていますが、
どこにもInPassと言う名前で送信するように書かれていないように見受けられます。
どのように渡されているのでしょうか。このコードだけではないということですか?

Ajax.send()の中身ですね。
まずはきちんと渡すように書く必要がありそうです。

func=get_dataが指定されたときにきちんと必要なデータは渡されていますか?
これはコード見れば分かりますね。


蛇足:

また、idやclass名に数値始まりが使えないという規則もあるので、
getElement系の関数では取得できるとはいえ、そこは守られた方が良いかと。

あとは地道にデバッグですね。
Ajax使われてますが、画面が表示されるファイル自身を使うのはあまりよろしくないかと思います。
グチャグチャになってしまいます。別ファイル、URLで対応されたほうが良いです。

コードの見づらさもそうですが、定義されていない$stmt2がsqlsrv_free_stmt()されるなど見直すべきところも結構あります。

投稿2019/03/18 07:41

編集2019/03/18 07:43
m.ts10806

総合スコア80765

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

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

ikawa19660319

2019/03/18 08:18

ご返信、ありがとうございます。 InPassを送信する別ページがあるのですが、それは以下となります。 <html> <head> <title>(login Menu)</title> <style type="text/css"> table{ } .hdr{background-color:gainsboro} TD { font-size: 10pt } </style> </head> <body> <form action="page1.php" method="post"> <table border="0" width="30%" align="center"> <caption> <tr> <td align=center><h1>パスワード認証</h1></td> </tr> <tr> <td align=center><font size="3">パスワードを入力して下さい。</font></td> </tr> <tr> <td colspan="2" align="middle"> <P><input type="password" name="InPass" size="100" style='width:150px;height=24px'></P> </tr> <tr> <td colspan="2" align="middle"> <P>&nbsp;</P> <P><input type="submit" value="認証" size=100 style="width: 120px; height: 24px"></P> </td> </tr> </table> </caption> </form> </body> </html> 尚、上記の InPass の値は、問題ページの page1.php では以下の print で確認することが出来ます。 $InPass = $_REQUEST['InPass']; print $InPass; if (isset($_GET["func"]) && $_GET["func"] == "get_data") { $stmt = $db->query("SELECT pass_master.Pass, TM_webJikyu.SaCode, TM_webJikyu.Scode, TM_webJikyu.* FROM pass_master INNER JOIN TM_webJikyu ON pass_master.id = TM_webJikyu.Jcode WHERE pass_master.Pass='$InPass' ... また、以下の固定値のセットでも問題なく意図した結果が得られます。 if (isset($_GET["func"]) && $_GET["func"] == "get_data") { $InPass = 'HK1640'; $stmt = $db->query("SELECT pass_master.Pass, TM_webJikyu.SaCode, TM_webJikyu.Scode, TM_webJikyu.* FROM pass_master INNER JOIN TM_webJikyu ON pass_master.id = TM_webJikyu.Jcode WHERE pass_master.Pass='$InPass' ... しかしながら、以下の順序とすると print では InPass 値を確認することが出来ません。 if (isset($_GET["func"]) && $_GET["func"] == "get_data") { $InPass = $_REQUEST['InPass']; print $InPass; $stmt = $db->query("SELECT pass_master.Pass, TM_webJikyu.SaCode, TM_webJikyu.Scode, TM_webJikyu.* FROM pass_master INNER JOIN TM_webJikyu ON pass_master.id = TM_webJikyu.Jcode WHERE pass_master.Pass='$InPass' ...
m.ts10806

2019/03/18 08:32

こちらにコードを貼り付けられてもかなり見づらいので質問本文に追記してください。他の回答者の目にもつき難いです。 いずれにしても回答に書いてある通りのことですね。 POSTで送信してるみたいですが、どこにもGETでfuncを送信してませんよね。 コメントで提示されたコードのREQUEST_METHODはPOSTですし、提示のコードの条件は $_GETにfuncがあってそれがget_dataという値をもってたときだけですから、その分岐には入りません。
m.ts10806

2019/03/18 08:34

action="page1.php?func=get_data" とでもすればいくとは思いますが、コードとしてはかなりグチャグチャです。 処理系をまとめすぎなので、もっと処理を細分化させたほうがいいです。 長くダラダラと書かれているだけのコードではデバッグも困難になります。
m.ts10806

2019/03/18 08:37

deleteやupdateでも使われているプリペアドステートメントをselectでもすべきですね。 これでは攻撃し放題です(「SQLインジェクション」で検索) セキュリティも考慮するなら全体的に作り直さないとかなりまずいコードです。
ikawa19660319

2019/03/18 08:39

追記ですが、上記最上段例(以下の同例)の場合、 print で InPass 値を確認することは出来ますが、 SQL値を表示するという目的の結果は得られません。 $InPass = $_REQUEST['InPass']; print $InPass; if (isset($_GET["func"]) && $_GET["func"] == "get_data") { $stmt = $db->query("SELECT pass_master.Pass, TM_webJikyu.SaCode, TM_webJikyu.Scode, TM_webJikyu.* FROM pass_master INNER JOIN TM_webJikyu ON pass_master.id = TM_webJikyu.Jcode WHERE pass_master.Pass='$InPass' ...
m.ts10806

2019/03/18 08:42

先にコメントしましたが全体的に作り直さなければならないコードなので小手先だけいじってても意味がありません。今の問題だけ片付けてもそれ以上にNGな実装てんこもりです。
guest

0

データは取れているはず、ということですが、$_GET, $_POST, $_REQUEST には何が入ってきていますか?
※先頭のところで var_dump($_GET); などとやれば出力できます

投稿2019/03/18 07:45

tacsheaven

総合スコア13703

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

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

ikawa19660319

2019/03/18 08:27

ご返信、ありがとうございます。 $_REQUEST は意図した値が返ってきます。 しかしながら、$_GET, $_POST は Null 値か "" と思われます。
tacsheaven

2019/03/18 08:37

だとすると、 if (isset($_GET["func"]) && $_GET["func"] == "get_data") が不成立になるのですから、当然その先の処理もしてくれませんよね。 $_GET, $_POST を使わず、すべて $_REQUEST に書き換えてだとどうなりますか。
guest

0

シングルクオートなんで「$InPass」という文字列が指定されてるのでは?
SQL をなんか変数に入れて、全体を表示されてみてください。
--- 追記 ---
とか思ったけど、強制的に入れてたらうまくいく?
ちなみに、submitで$_GETは設定されませんよ。

投稿2019/03/18 07:17

編集2019/03/18 07:22
takasima20

総合スコア7458

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

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

ikawa19660319

2019/03/18 07:43

早速のご返信、ありがとうございます。 詳細で以下となります。 if (isset($_GET["func"]) && $_GET["func"] == "get_data") { $stmt = $db->query("SELECT pass_master.Pass, TM_webJikyu.SaCode, TM_webJikyu.Scode, TM_webJikyu.* FROM pass_master INNER JOIN TM_webJikyu ON pass_master.id = TM_webJikyu.Jcode WHERE pass_master.Pass='HK1640' ... 結果OK if (isset($_GET["func"]) && $_GET["func"] == "get_data") { $InPass = 'HK1640'; $stmt = $db->query("SELECT pass_master.Pass, TM_webJikyu.SaCode, TM_webJikyu.Scode, TM_webJikyu.* FROM pass_master INNER JOIN TM_webJikyu ON pass_master.id = TM_webJikyu.Jcode WHERE pass_master.Pass='$InPass' ... 結果OK if (isset($_GET["func"]) && $_GET["func"] == "get_data") { $InPass = $_REQUEST['InPass']; $stmt = $db->query("SELECT pass_master.Pass, TM_webJikyu.SaCode, TM_webJikyu.Scode, TM_webJikyu.* FROM pass_master INNER JOIN TM_webJikyu ON pass_master.id = TM_webJikyu.Jcode WHERE pass_master.Pass='$InPass' ...
takasima20

2019/03/18 11:47

ぱっと見た感じ、「情報の取得」と「パスワード云々」は別のタイミングでは? Webシステムの場合、1回のやり取りごとに情報はなくなります ということを認識されていますでしょうか。そのために、取得した情報は (必要に応じて)なんらかの方法で持ち回ったりします。 とりあえず、そのシステムの全体の流れ及びデータの流れを 検証しなおしてみるのが早道のような気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問