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

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

ただいまの
回答率

90.12%

PHP 配列について

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,477

a-_.

score 131

XXX4.phpでループ処理した配列データをデータベースから取得して、メインのクラスで一覧表示するという処理を行いたく、コーディングしてみて分からなくなった箇所があります

メインのクラスのrequire("XXX4.php");からのコーディングで、implode(",", $l_obj);で配列を文字列として返すようにしてみたんですが、配列の引数ではないとエラー表示されました
Warning: implode(): Invalid arguments passed
$dataは$l_objのList_table(配列)を含んでいるという解釈は間違っているのでしょうか

//メインのクラス
<?php
    require_once("XXX.php");

    if (isset($_POST['name'], $_POST['comment'], $_POST['bbs']) && $_POST['bbs'] == "post") {
        require("XXX1.php");
        $p_obj = new Post();
        $p_obj->name = $_POST['name'];
        $p_obj->comment = $_POST['comment'];
        $p_obj->post();
    } elseif (isset($_POST['bbs']) && $_POST['bbs'] == "update") {
        require("XXX2.php");
        $u_obj = new Update();
        $u_obj->name = $_POST['name'];
        $u_obj->comment = $_POST['comment'];
        $u_obj->chk = $_POST['chk'];
        $u_obj->update();
    } elseif (isset($_POST['bbs']) && $_POST['bbs'] == "delete") {
        require("XXX3.php");
        $d_obj = new Delete();
        $d_obj->chk = $_POST['chk'];
        $d_obj->delete();
    }

    require("XXX4.php");
    $l_obj = new List_table();
    $data = $l_obj->List_table();
    echo implode(",", $l_obj);
?>
//XXX4.php
<?php
    require_once("XXX.php");

    class List_table extends Db {
        public $result;
        public $row;
        public function List_table() {
            $this->connect();
            $sql = "SELECT * FROM XXX ORDER BY time DESC";
            $result= $this->class->query($sql);
            $c = 0;
            $this->result = null;
            while($row = $result->fetch_assoc()) {
                $this->result[$c] = array('name' => $this->$row['name'], 'comment' => $this->$row['comment']);
                $c++;
            }
            $this->close();
       return $this->result;
        }
    }
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+3

前にも書いたが、function List_table()にreturnがない。
ちゃんと前の質問を解決してから次に行ってください。

そして、表示したいのはList_table()返り値なんだろうから
echo implode(",", $l_obj);は$dataじゃないの?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/30 15:13

    ご回答ありがとうございます

    returnを質問文のソースにコーディングして訂正しました
    nullの箇所は削除するのを忘れていました

    キャンセル

  • 2016/09/30 15:35

    以前の質問のときにも他の回答者さんに注意を受けたと思いますが、
    質問を編集するときは、追記して、元のコードのどこをどう訂正したかを書いてください。
    他の人が見たときにわからなくなります。

    キャンセル

  • 2016/09/30 15:35

    >nullの箇所は削除するのを忘れていました
    こういうの毎回あるけど見直してない証拠では?もらったコードを組み込んでるだけでしょ

    キャンセル

+2

$l_objはList_tableクラスのインスタンスですよね?
それはimplodeするって状況がよくわからなんですが
何をしたいのかもう少し噛砕いて説明してもらえませんか?

たぶん
$data = $l_obj->result;
を参照するということだと思うんですが・・・

追記

XXX.phpの仕様次第でしょうけど、XXX4.PHPはこんな感じじゃないですか?
ずっと前に書きましたが無駄なクラス分けに見えるので統合し、
機能はfunctionで分ければいいように思えます。

class List_table {
  function __CONSTRUCT(){
    require_once("XXX.php");
    $this->conn=new Db;
    $this->conn->connect();
    $sql = "SELECT * FROM XXX ORDER BY time DESC";
    $result= $this->conn->query($sql);
    $this->result = null;
    while($row = $result->fetch_assoc()) {
      $this->result[] = array('name' => $row['name'], 'comment' => $row['comment']);
    }
    $this->conn->close();
  }
}

これに対して

require("XXX4.php");
    $l_obj = new List_table;
    $data = $l_obj->result;
    echo implode(",", $l_obj);


とすればいけるような気がします

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/30 16:08

    最初に提示されてるコードの、
    $result= $this->class->query($sql);
    ここの部分なんだけど、
    $result= $this->query($sql);
    こうなってたりしてないですか?

    キャンセル

  • 2016/09/30 16:12

    $res= $this->class->query($sql);です

    キャンセル

  • 2016/09/30 16:55

    $resはどこから出てきたのでしょうか…。

    キャンセル

+2

List_table()が戻り値を返していない(returnしていない)
そもそも結果を$resultに格納しており、更にpublicなのだから返す必要もない。
なのでimplodeすべき対象なのは、$resultということになります。
該当箇所はこう書き直せるでしょう。

$l_obj = new List_table();
$l_obj->List_table();
echo implode(",", $l_obj->result);


皆さんの回答でコンストラクタの罠に気付いたので、書き直します。

$l_obj = new List_table();
echo implode(",", $l_obj->result);

余談ですが、配列への要素追加は、変数名[] = 値 と書くことができます。
なのでList_table内の処理はこう書くことができます。

~省略~
$this->result = null;
while($row = $result->fetch_assoc()) {
    $this->result[] = array('name' => $this->$row['name'], 'comment' => $this->$row['comment']);
}
$this->close();

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/30 15:11

    ご回答ありがとうございます

    $l_obj = new List_table();
    echo implode(",", $l_obj->result);で実行してみましたが、改善しませんでした

    キャンセル

  • 2016/09/30 15:23

    他にも原因はありそうですね。
    例えば、$rowとか。
    $rowはList_tableクラスのメンバですが、whileループ内ではローカル変数の$rowに格納してしまっています。
    while($row = $result->fetch_assoc()) {
    なので、このあとで $this->$row['name'] と参照しても値は取れていないと思います。
    こうしないとダメでしょう。
    while($this->row = $result->fetch_assoc()) {

    キャンセル

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

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

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