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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

Q&A

解決済

2回答

1220閲覧

[PHP]SQLで取得した結果を取得したい

entaro12345

総合スコア75

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

0グッド

0クリップ

投稿2020/07/27 08:45

前提・実現したいこと

PHP言語でPearを使用してDBからデータ取得のファイルを実装しています。
ある程度実装し、確認しようとしたところエラーが発生してしまったので、
お力を貸していただけると幸いです。

接続は問題なくできていて、while文の実行時にエラーが発生しています。

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

Fatal error: Call to a member function fetchRow() on integer

該当のソースコード

PHP

1<?php 2 // DB接続(Pear) 3 require_once('MDB2.php'); 4 5 // データベースに接続 6 $mdb2 = connectDB(); 7 8 if( MDB2::isError( $mdb2 ) ) send_err( 'DB1 connect err' ); 9 10 // データの取得SQL 11 $sql = 'select ' . 12 ' name '. 13 'from m_tabel '. 14 'where 1 = 1 '. 15 'order by code '; 16 17 $types = [ 18 ]; 19 20 // プレースフォルダ 21 $sth = $mdb2->prepare( $sql, $types, MDB2_PREPARE_MANIP ); 22 23 // prepareエラーチェック 24 if ( MDB2::isError( $sth ) ) { 25 $mdb2->rollback(); 26 $mdb2->disconnect(); 27 send_err( 'DB1 prepare err' ); 28 } 29 30 // データのセット 31 $data = [ 32 ]; 33 34 // レコードの挿入 35 $result = $sth->execute( $data ); 36 37 if ( MDB2::isError( $result ) ) { 38 $mdb2->rollback(); 39 $mdb2->disconnect(); 40 send_err( 'DB1 execute err' ); 41 } 42 43 $sth->free(); 44 $datas = array(); 45 $iCnt = 0; 46 47 while ($row = $result ->fetchRow(MDB2_FETCHMODE_ASSOC)){ 48 49 $datas[$iCnt] = [ 50 'name' => $row['name'], 51 ]; 52 $iCnt++; 53 54 } 55 56 // ポートごとに駐輪された回数をカウント 57 for ($i = 0; $i < count($ports); $i++) { 58 echo $ports[$i]['name']; 59 } 60 61 // DB切断 62 $mdb2->disconnect(); 63 64 /** 65 * データベース接続 66 */ 67 function connectDB(){ 68 69 $sqltype = 'mysql'; // mysqlを使用 70 $server = 'localhost'; // サーバー 71 $password = 'XXXXX'; // パスワード 72 73 $dbname = 'XXXXXXXXXX'; // 接続するデータベース名 74 $user = 'XXXXXXXXXX'; // ユーザー名 75 76 // データベースに接続 77 $mdb2 = MDB2::connect($sqltype.'://'.$user.':'.$password.'@'.$server.'/'.$dbname.'?charset=utf8'); 78 79 //接続オブジェクトを返す 80 return $mdb2; 81 } 82 83 function send_err( $msg = 'err' ) { 84 $data = array( 'err' => $msg ); 85 echo json_encode( $data ); 86 exit; 87 } 88?>

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

実行サーバー:Linux
PHP 7.1
MySQL

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

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

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

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

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

guest

回答2

0

きょうびPHPからMySQLへの接続にPEARが必要だとは思えません
PDOでつなぐことを検討してみてはどうでしょうか?

投稿2020/07/27 08:54

yambejp

総合スコア114843

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

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

entaro12345

2020/07/27 23:26

回答ありがとうございます。 PDOで接続することも検討してみます!
guest

0

ベストアンサー

そもそもPearっていうのがもはや懐かしい感がありますね……MDB2って最終更新が2012-10-29みたいですけど使って大丈夫ですかね?

ところで、エラーメッセージは「integer型が持つfetchRow()というメソッドを実行しようとしているがそんなものはintegerのメンバーに存在しない」と言っています。
$sql にはSELECT文を入れているようですが、「// レコードの挿入」というコメントから察するに、途中でINSERT文に変わってないですか?(コードの途中を省略していませんか?)
$sth->execute() はMDB2_Result型またはinteger型を返すようです。ドキュメントを見る限り、SELECT文だとMDB2_Resultが帰ってくるし、INSERT文 (とかUPDATEとか) だと影響を受けた行の数が返ってくるようです。

追記 Jul 28, 2020 11:23 AM

MDB2のソースコード を見ました。
結論を言うとprepare()の第3引数に MDB2_PREPARE_MANIP を渡すと、影響を受けた行数が帰ってくるようです。

というか先述のドキュメントにも書いてありました。

Since DML (data manipulation language - INSERT, UPDATE, DELETE) statements have different return values than data fetches the prepare() accepts a third parameter. This parameter should be set to MDB2_PREPARE_MANIP for DML statements (this way the number of affected rows will be returned). For data reads it should either be set to MDB2_PREPARE_RESULT, an array of data types for each of the columns in the result set or NULL in order to automatically detect the data types in the result set.

投稿2020/07/27 10:56

編集2020/07/28 02:24
thyda.eiqau

総合スコア2982

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

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

entaro12345

2020/07/27 23:28

回答ありがとうございます。 >コードの途中を省略していませんか? 失礼しました。コメントの誤りで修正しているのは、SQLのSelect文の中身のみです。 もう少し勉強してみます!
entaro12345

2020/07/28 02:50

追記ありがとうございます! 貼っていただいたリンク先を読んでいて「MDB2_PREPARE_MANIP」 を削除したところ取得することができました。 が、おっしゃる通りで、使用していて安全ではないと思うため、PDOでの接続に切り替えようかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問