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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

MySQL

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

PHP

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

Q&A

解決済

2回答

752閲覧

MySQL+PHPでデータの取得方法について

kaya_miyoshi

総合スコア23

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

MySQL

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

PHP

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

0グッド

0クリップ

投稿2018/11/10 21:25

編集2018/11/10 23:44

下記コードで(MySQL8.0、PHP7、Windows 10、sampledb にはデータを格納済み)、

<?php header("Content-Type: text/html; charset=UTF-8"); //データベース接続 $server = "localhost"; $userName = "testuser"; $password = "testuser"; $dbName = "sampledb"; $mysqli = new mysqli($server, $userName, $password, $dbName); $result = $mysqli->query("create table if not exists sample (id integer primary key, name text, age integer)"); /**************/ /* データ取得 */ /**************/ if (isset($_GET["func"]) && $_GET["func"] == "get_data") { $stmt = $mysqli->query("select * from sample"); $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); $insdata = $_POST["insdata"]; $insdata = json_decode($insdata, true); // トランザクション開始 $db->beginTransaction(); // データ削除 if ($delid) { for ($i=0; $i<count($delid); $i++) { $sql = "DELETE FROM sample WHERE id=?"; $stmt = $db->prepare($sql); $stmt->execute(array($delid[$i]["id"])); } } // データ変更 if ($upddata) { for ($i=0; $i<count($upddata); $i++) { $sql = "UPDATE sample SET name=?, age=? WHERE id=?"; $stmt = $db->prepare($sql); $stmt->execute(array($upddata[$i]["name"], $upddata[$i]["age"], $upddata[$i]["id"])); } } // データ追加 if ($insdata) { for ($i=0; $i<count($insdata); $i++) { $sql = "INSERT INTO sample (name, age) VALUES (?, ?)"; $stmt = $db->prepare($sql); $stmt->execute(array($insdata[$i]["name"], $insdata[$i]["age"])); } } // トランザクション終了 $db->commit(); exit(); } $db = null; ?> <html> <center> <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; var url = "sample.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 = '<table border="1" id="sampletb">'; out += '<tr>'; out += '<th>削除</th>'; out += '<th>ID</th>'; out += '<th>氏名</th>'; out += '<th>年齢</th>'; out += '</tr>'; var res = Ajax.responseText; if (res) { rows = JSON.parse(res); for (i in rows) { out += '<tr>'; out += '<td><input type="checkbox" id="'+i+':0" onClick="delCheck(this);"></td>'; out += '<td><input type="text" id="'+i+':1" value='+rows[i]["id"]+' disabled></td>'; out += '<td><input type="text" id="'+i+':2" value="'+rows[i]["name"]+'" onChange="updCheck(this)";></td>'; out += '<td><input type="text" id="'+i+':3" value="'+rows[i]["age"]+'" onChange="updCheck(this)";></td>'; out += '</tr>'; } } out += '</table>'; out += '<p>'; out += '<button type="button" onClick="addRow();">'+"行追加"+'</button>'; out += '<button type="button" onClick="Upd();">'+"更新"+'</button>'; out += '</p>'; document.getElementById("result").innerHTML = out; } } } /**********/ /* 行追加 */ /**********/ function addRow() { var el = document.getElementById('sampletb'); var i = el.rows.length; var insertRow = el.insertRow(i); var insertCell0 = insertRow.insertCell(0); var insertCell1 = insertRow.insertCell(1); var insertCell2 = insertRow.insertCell(2); var insertCell3 = insertRow.insertCell(3); insertRow.style.backgroundColor = 'blue'; // 1:insid, 2:name, 3:age insertCell0.innerHTML = '<td><input type="checkbox"></td>'; insertCell1.innerHTML = '<input type="text" id="'+i+':1" value="'+i+'" style="width:20px;">'; insertCell2.innerHTML = '<input type="text" id="'+i+':2" value="" onChange="insCheck(this)";>'; insertCell3.innerHTML = '<input type="text" id="'+i+':3" value="" onChange="insCheck(this)";>'; } /************/ /* 新規登録 */ /************/ function insCheck(e) { var index = e.id.indexOf(":"); var row = e.id.substring(0, index); var insid = document.getElementById(row+':1').value; var name = document.getElementById(row+':2').value; var age = document.getElementById(row+':3').value; // 最初の登録処理 if (insdata.length == 0) { insdata.push({"insid":insid, "name":name, "age":age}); return; } // 2件目以降の登録処理 // 重複がある場合の登録処理 for (var i=0; i<insdata.length; i++) { if (insdata[i]["insid"] == insid) { // 配列から除外 insdata.splice(i, 1); // 配列に追加 insdata.push({"insid":insid, "name":name, "age":age}); return; } } // 重複がない場合の登録処理 insdata.push({"insid":insid, "name":name, "age":age}); } /********/ /* 変更 */ /********/ function updCheck(e) { e.parentNode.style.backgroundColor = 'yellow'; var row = e.id.substr(0, e.id.indexOf(":")); var tid = document.getElementById(row+':1').value; var name = document.getElementById(row+':2').value; var age = document.getElementById(row+':3').value; // 最初の変更処理 if (upddata.length == 0) { upddata.push({"id":tid, "name":name, "age":age}); return; } // 2件目以降の変更処理 // 重複がある場合の変更処理 for (var i=0; i<upddata.length; i++) { if (upddata[i]["id"] == tid) { // 配列から除外 upddata.splice(i, 1); // 配列に追加 upddata.push({"id":tid, "name":name, "age":age}); return; } } // 重複がない場合の変更処理 upddata.push({"id":tid, "name":name, "age":age}); } /********/ /* 削除 */ /********/ function delCheck(e) { var tid = document.getElementById(e.id.replace(':0',':1')).value; // チェック入れたとき if (e.checked == true) { e.parentNode.parentNode.style.backgroundColor = 'red'; delid.push({"id":tid}); // チェック外したとき } else if (e.checked == false) { e.parentNode.parentNode.style.backgroundColor = ''; for (var i=0; i<delid.length; i++) { if (delid[i]["id"] == tid) { delid.splice(i, 1); } } } } /************/ /* 更新処理 */ /************/ function Upd() { delid2 = JSON.stringify(delid); upddata2 = JSON.stringify(upddata); insdata2 = JSON.stringify(insdata); url = "sample.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> </center> </html>

ー 問題点 ー

・(isset($_GET["func"]))、($_GET["func"] == "get_data") の両方とも FALSE を返す。

・fetchAll() を使うと Call to undefined method mysqli_result::fetchAll() のエラーになる。

データ取得をうまくするにはどうすればよいでしょうか?

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

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

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

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

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

m.ts10806

2018/11/10 23:32

このphpへはどういうurlでアクセスしているのでしょうか。または入力フォームなどからのアクセスであればそちらのhtmlもご提示ください
kaya_miyoshi

2018/11/10 23:47

ソースを追加しました。function getSample() で var url = "sample.php" + "?dummy=" + new Date().getTime() + "&func=" + "get_data"; としています。html も載せています。
m.ts10806

2018/11/11 00:07

同一ファイルなのでしょうか別ファイルなのでしょうか。別ファイルなのであればわけていただきたく。同じファイルに対してajaxというのはあまり考えられません。
退会済みユーザー

退会済みユーザー

2018/11/13 04:46

2つのファイル(phpファイルとhtmlファイル)に分けました。
m.ts10806

2018/11/13 05:10

複数アカウントですか?名前からどういう事情があるかわかりませんが、よくないですね。この質問をどう取り扱うんでしょうか。
退会済みユーザー

退会済みユーザー

2018/11/13 05:30

ログインし直したときに間違ってSNSアカウントで登録ボタンを押してしまったためです。この質問はこのまま続け、解決すれば新しいアカウントのみで質問するようになると思います。不正などの意図は全くないです。
kaya_miyoshi

2018/11/13 07:41 編集

2つのファイル(phpファイルとhtmlファイル)に分けました。ログインし直したときに間違ってSNSアカウントで登録ボタンを押してしまいました。この質問は前のアカウントが使えるようになったため続けられます。
guest

回答2

0

ベストアンサー

要件確認部分もあるのですが、ひとまずわかるほうだけ。

・fetchAll() を使うと Call to undefined method mysqli_result::fetchAll() のエラーになる。

「そんなメソッドないよ」ということです。
そういうときはPHPマニュアルを確認してください。
PHPマニュアル:mysqli_result

/* メソッド */

bool data_seek ( int $offset )
mixed fetch_all ([ int $resulttype = MYSQLI_NUM ] )
mixed fetch_array ([ int $resulttype = MYSQLI_BOTH ] )
array fetch_assoc ( void )
object fetch_field_direct ( int $fieldnr )
object fetch_field ( void )
array fetch_fields ( void )
object fetch_object ([ string $class_name = "stdClass" [, array $params ]] )
mixed fetch_row ( void )
bool field_seek ( int $fieldnr )
void free ( void )

あるのは「fetch_all」ですね。mysqliオブジェクトなので引数のTYPEもPDOではありません。

ただ、PDOの機能を使いたいような記述をされていますが冒頭でmysqliオブジェクトを利用しています。
どちらかに統一されたほうが良いでしょう。

投稿2018/11/11 00:39

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2018/11/13 05:06

$rows = $stmt->fetchAll($resulttype = MYSQLI_NUM); ...で、データは取れて来ているようです。
kaya_miyoshi

2018/11/13 07:41

$rows = $stmt->fetchAll($resulttype = MYSQLI_NUM); ...で、データは取れて来ているようです。
m.ts10806

2018/11/13 08:06

引数渡すときに通常はそのような書き方はしませんよ。 mysqli_resultにはfetchAll()はないはずですけども、質問内容と変わってきませんか? $rowsをvar_dump()するとどうなります?
kaya_miyoshi

2018/11/14 04:15

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>サンプル</title> </head> <body> <?php //データベース接続 $server = "localhost"; $userName = "testuser"; $password = "testuser"; $dbName = "sampledb"; $mysqli = new mysqli($server, $userName, $password, $dbName); $result = $mysqli->query("create table if not exists sample (id integer primary key, name text, age integer)"); $stmt = $mysqli->query("select * from sample"); $resulttype = MYSQLI_NUM; $rows = $stmt->fetch_all($resulttype); var_dump($rows); ?> </body> </html> デバッグ環境か整ってないため上記ファイルで試したら下の結果が出てデータは取れているようです。 C:\Apache24\htdocs\sampletest.php:24: array (size=9) 0 => array (size=3) 0 => string '1' (length=1) 1 => string '織田信長' (length=12) 2 => string '22' (length=2) 1 => array (size=3) 0 => string '2' (length=1) 1 => string '豊臣秀吉' (length=12) 2 => string '20' (length=2) 2 => array (size=3) 0 => string '3' (length=1) 1 => string '真田幸村' (length=12) 2 => string '25' (length=2) 3 => array (size=3) 0 => string '4' (length=1) 1 => string '石田三成' (length=12) 2 => string '26' (length=2) 4 => array (size=3) 0 => string '5' (length=1) 1 => string '徳川家康' (length=12) 2 => string '20' (length=2) 5 => array (size=3) 0 => string '6' (length=1) 1 => string '伊達政宗' (length=12) 2 => string '20' (length=2) 6 => array (size=3) 0 => string '7' (length=1) 1 => string '明智光秀' (length=12) 2 => string '20' (length=2) 7 => array (size=3) 0 => string '8' (length=1) 1 => string '武田信玄' (length=12) 2 => string '17' (length=2) 8 => array (size=3) 0 => string '9' (length=1) 1 => string '宮本武蔵' (length=12) 2 => string '19' (length=2)
m.ts10806

2018/11/14 04:22

デバッグは確かにツール整えるのも良いですが、よほどグループで開発を進めていくようなことでない限りvar_dumpしたりログファイルに吐き出して確認したりで充分です。それも立派なデバッグです。 揚げ足とりではないのですが、 急にfetch_allにかえてますよね。 2018/11/13 16:41時点ではfetchAll でデータが取れていると仰っています。 情報が正確でないとアドバイスも意味がなくなります。 データがとれているということは質問にあるエラーも解消されたと言うことになり、この質問はクローズに向かうと思うのですが、そのあたりは如何でしょうか? 現在起きている問題と質問時点でのか問題が違うのであれば要件の変化となり、「質問内容への回答」にはなりません。 現状を整理して一度クローズして新しく質問を建て直すか、質問文に最新の情報を追記してください。
kaya_miyoshi

2018/11/14 04:32

以前fetchAllでデータは取れていました。さっきやるとエラーが出ました。fetch_allに変えるとデータが取れていますのでfetch_allで行きます。この質問はいったん解決とします。ありがとうございました。
m.ts10806

2018/11/14 04:37

>以前fetchAllでデータは取れていました。さっきやるとエラーが出ました。fetch_allに変えるとデータが取れていますのでfetch_allで行きます。 メソッド名が変更になる仕様変更は滅多にあるものではないので、もともとpdoで書かれていたのではないでしょうか。 回答にも書いたように「これだといける」のような手探りで進めるのではなくphpマニュアルを確認して確実に仕様通りの機能を仕様通りに使ってください。 プログラムは指示した通りにしか動きません。
guest

0

長いので、コードは見ていません。
問題点から、問題箇所っぽいものを想定しています。

(isset($_GET["func"]))、($_GET["func"] == "get_data") の両方とも FALSE を返す。

GET のパラメータがうまく渡っていません。意図したデータが有るかvar_dumpでもしてみてください。変数遷移が追えるよう、デバッグ環境を整えることをオススメします。

・fetchAll() を使うと Call to undefined method mysqli_result::fetchAll() のエラーになる。

mysqli と PDO をごっちゃにして使用してます。
どちらか一方に寄せてください。

投稿2018/11/11 00:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/11/13 05:13

$rows = $stmt->fetchAll($resulttype = MYSQLI_NUM); ...としました。 デバッグ環境ですが、Netbeansで環境を作っているのですが、php.iniに zend_extension="C:/php/php_xdebug-2.7.0beta1-7.2-vc15-x86_64.dll" xdebug.remote_enable=1 xdebug.remote_handler=dbgp xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000 としても、XDebugでブレークポイントを設置してステップ実行できません。 どうすればいでしょうか? $_GETはXDebugでfilter_inputを使うように言われています。 if (filter_input(INPUT_GET, 'func') && filter_input(INPUT_GET, 'get_data')) { ...にしています。 デバッグ環境の作り方を知りたいです。
kaya_miyoshi

2018/11/13 07:42

$rows = $stmt->fetchAll($resulttype = MYSQLI_NUM); ...としました。 デバッグ環境ですが、Netbeansで環境を作っているのですが、php.iniに zend_extension="C:/php/php_xdebug-2.7.0beta1-7.2-vc15-x86_64.dll" xdebug.remote_enable=1 xdebug.remote_handler=dbgp xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000 としても、XDebugでブレークポイントを設置してステップ実行できません。 どうすればいでしょうか? $_GETはXDebugでfilter_inputを使うように言われています。 if (filter_input(INPUT_GET, 'func') && filter_input(INPUT_GET, 'get_data')) { ...にしています。 デバッグ環境の作り方を知りたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問