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

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

ただいまの
回答率

90.84%

  • PHP

    18688questions

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

  • MySQL

    5369questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 170

ASU

score 15

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ローカル環境

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/06/01 16:27

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

    キャンセル

  • m6u

    2018/06/01 18:00

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

    キャンセル

  • ASU

    2018/06/02 15:23

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/02 15:25

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

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18688questions

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

  • MySQL

    5369questions

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