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

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

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

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

PHP

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

Q&A

解決済

1回答

1377閲覧

mysqli_queryでvar_dumpした内容が理解できない

Hirakin3

総合スコア33

MySQL

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

PHP

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

0グッド

0クリップ

投稿2018/06/01 06:22

編集2018/06/01 08:26

PHPで簡単な編集フォームを作成しています。
アドバイスを頂ければ幸いです。

前提・実現したいこと

PHPでMySQLのSELECT、UPDATEを、それぞれ関数化して呼び出す部分を作りたい。

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

var_dumpした結果の内容がわかっておりません

該当部分(後述のUPDATEのメソッド経由でvar_dump結果の一部)

["info"]=> string(40) "Rows matched: 1 Changed: 0 Warnings: 1"

後述するexecuteメソッド部分が理由で発生している認識です

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\member\lib\Database.class.php on line 62

var_dumpしている箇所

public function execute($sql){  $sqli = mysqli_query($this->db_con, $sql);  var_dump($this->db_con);  return $sqli; }

SELECTのメソッド経由でのvar_dump結果

object(mysqli)#12 (19) { ["affected_rows"]=> int(1) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 38fea24f2847fa7519001be390c98ae0acafe387 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(22) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(21) "5.5.5-10.1.31-MariaDB" ["server_version"]=> int(50505) ["stat"]=> string(134) "Uptime: 28284 Threads: 2 Questions: 545 Slow queries: 0 Opens: 26 Flush tables: 1 Open tables: 20 Queries per second avg: 0.019" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(199) ["warning_count"]=> int(0) }

UPDATEのメソッド経由でのvar_dump結果

object(mysqli)#12 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.12-dev - 20150407 - $Id: 38fea24f2847fa7519001be390c98ae0acafe387 $" ["client_version"]=> int(50012) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "localhost via TCP/IP" ["info"]=> string(40) "Rows matched: 1 Changed: 0 Warnings: 1" ["insert_id"]=> int(0) ["server_info"]=> string(21) "5.5.5-10.1.31-MariaDB" ["server_version"]=> int(50505) ["stat"]=> string(134) "Uptime: 28375 Threads: 2 Questions: 551 Slow queries: 0 Opens: 26 Flush tables: 1 Open tables: 20 Queries per second avg: 0.019" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(203) ["warning_count"]=> int(1) }

SELECTでDatabaseクラスに渡している内容

$data = $db->select('*', 'member', 'mem_id =' . $db->quote($mem_id)); //$db->quote($mem_id) は定数14にしています

UPDATEでDatabaseクラスに渡している内容

下記の$dataArrを$var_dumpした内容

array(18) { ["family_name"]=> string(6) "捕鯨" ["first_name"]=> string(6) "太郎" ["family_name_kana"]=> string(9) "ほげい" ["first_name_kana"]=> string(12) "いちろう" ["sex"]=> string(1) "1" ["year"]=> string(4) "1948" ["month"]=> string(2) "08" ["day"]=> string(2) "01" ["zip1"]=> string(3) "110" ["zip2"]=> string(4) "0003" ["address"]=> string(24) "東京都台東区根岸" ["email"]=> string(14) "hoge@gmail.com" ["tel1"]=> string(3) "090" ["tel2"]=> string(4) "0000" ["tel3"]=> string(4) "1111" ["traffic"]=> array(2) { [0]=> string(1) "0" [1]=> string(1) "4" } ["contents"]=> string(0) "" ["mem_id"]=> string(2) "14" }

UPDATE部分の内容

case 'update_complete': unset($_POST['update_complete']); $dataArr = $_POST;              var_dump($dataArr); $_POST['traffic'] = implode('_', $_POST['traffic']); $column = ''; foreach ($dataArr as $key => $value) { if (is_array($value)) { $column .= $key . '=' . "'" . implode('_', $value) . "'" . ','; } else { $column .= $key . '=' . "'" . $value . "'" . ','; } } $res = $db->update($column . "update_date='11'", 'member',"mem_id=" . $dataArr['mem_id']);

該当のソースコード

Databaseクラス

class Database{ public $db_con = NULL; public $db_host = ''; public $db_user = ''; public $db_pass = ''; public $db_name = ''; public function __construct($db_host, $db_user, $db_pass, $db_name){ $this->db_con = $this->connectDB($db_host, $db_user, $db_pass, $db_name); $this->db_host = $db_host; $this->db_user = $db_user; $this->db_pass = $db_pass; $this->db_name = $db_name; } private function connectDB($db_host, $db_user, $db_pass, $db_name){ $tmp_con = mysqli_connect($db_host, $db_user, $db_pass, $db_name); if($tmp_con !== false){ return $tmp_con; }else{ printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } } public function execute($sql){ $sqli = mysqli_query($this->db_con, $sql); var_dump($this->db_con); return $sqli; } public function select($column,$table,$where=''){ if($where === ''){ $sql = ' SELECT ' . $column . ' FROM ' . $table; }else{ $sql = ' SELECT ' . $column . ' FROM ' . $table . ' WHERE ' .$where; } $res = $this->execute($sql); $data = []; while ($row = mysqli_fetch_array($res)){ array_push($data, $row); } return $data; } public function update($column,$table,$where=''){ if($where === ''){ $sql = ' UPDATE ' . $table . ' SET ' . $column; }else{ $sql = ' UPDATE ' . $table . ' SET ' . $column . ' WHERE ' . $where; } $res = $this->execute($sql); $data = []; while ($row = mysqli_fetch_array($res)){ array_push($data, $row); } return $data; } public function quote($int){ return mysqli_real_escape_string($this->db_con, $int); } public function str_quote($str){ return "'" . mysqli_real_escape_string($this->db_con, $str) . "'"; } public function getLastId(){ return mysqli_insert_id($this->db_con); } public function close(){ mysqli_close($this->db_con); } }

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

MySQL
XAMMPローカル環境

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

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

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

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

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

m.ts10806

2018/06/01 06:31

$tmp_conをvar_dump()してみてください。
Hirakin3

2018/06/01 07:02

var_dumpの結果を追記しました。メッセージ自体は確認中です。
m.ts10806

2018/06/01 07:04

var_dumpの結果を追記しました >どれでしょうか。コード上部に何かしら注釈を入れていただければと思います(毎回全ての人が編集履歴を見るわけではありません)
Hirakin3

2018/06/01 07:16

失礼しました。エラーメッセージ部分に追記でしたが、読み取れないので補足と、コード部分でもvar_dumpした箇所を追加しました。
退会済みユーザー

退会済みユーザー

2018/06/01 07:20 編集

class Databaseのみでなく、全体のソースを開示することは出来ますか? 要は、class Databaseをどう呼び出しているのかを知りたい。それと、update文クエリーを実行するときの引数の渡し方も。このクラスでmysqli_query()に入力する直前のクエリ文字列がどうなっているかも。余談だけど、MySQLってテーブル名やカラム名をバッククォート文字で囲むよね(UPDATE `table_1` SET `field_1` = 'foo' WHERE `id` = 1;みたいな)、バッククォート文字で括ったら回避できる話だったりしないのかな。
退会済みユーザー

退会済みユーザー

2018/06/01 07:22

「エラーになる」のエラーメッセージがそもそも掲載されていない件。
m.ts10806

2018/06/01 07:27

再掲しておきます。$this->db_conでエラーが発生している >発生しているエラーメッセージを追記してください。https://teratail.com/help/question-tips#questionTips3-4 また、そのエラーメッセージの意味自体は調べられましたか?Google翻訳にかけると結構いい感じに訳してくれます。
退会済みユーザー

退会済みユーザー

2018/06/01 09:00

部分的にソースを切り出されても、class Databaseのインスタンスが初期化されているかとか、どういう順番にメソッドを叩いているのかとかわからないので、class Databaseを呼び出している側のphpソースの全体をなるべく示してほしい。
Hirakin3

2018/06/02 06:23

こちら確認できてませんでした。先に回答も頂きありがとうございます。
guest

回答1

0

ベストアンサー

全体のソースが全く開示される気配がないので、以下当てずっぽうの回答になります。

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given

1つ目のパラメータがmysqli_result型であるべきところをboolean型を与えられた、って意味です。
SELECT文クエリーを与えてみたけど何らかの理由で失敗しているっていう状況ではないかと。
select文文字列がわかれば、解決できそう。

コードで気になって点:
$res = $db->update($column . "update_date='11'", 'member',"mem_id=" . $dataArr['mem_id']);
もしも$columnが「foo」だったら「fooupdate_date='11'」になるね、いいのかな。

select()メソッドを叩くとき「*」じゃなく丁寧にカラム名を与えてみたらどうなるかね。

投稿2018/06/01 08:53

編集2018/06/01 09:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Hirakin3

2018/06/02 06:25

ありがとうございます!こちらを参考にして解決できました。 select()メソッド~ こちらも書き換え参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問