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

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

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

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

Q&A

3回答

3483閲覧

PHP 配列について

a-_.

総合スコア133

PHP

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

0グッド

0クリップ

投稿2016/09/30 04:46

編集2016/09/30 06:10

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

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

PHP

1//メインのクラス 2<?php 3 require_once("XXX.php"); 4 5 if (isset($_POST['name'], $_POST['comment'], $_POST['bbs']) && $_POST['bbs'] == "post") { 6 require("XXX1.php"); 7 $p_obj = new Post(); 8 $p_obj->name = $_POST['name']; 9 $p_obj->comment = $_POST['comment']; 10 $p_obj->post(); 11 } elseif (isset($_POST['bbs']) && $_POST['bbs'] == "update") { 12 require("XXX2.php"); 13 $u_obj = new Update(); 14 $u_obj->name = $_POST['name']; 15 $u_obj->comment = $_POST['comment']; 16 $u_obj->chk = $_POST['chk']; 17 $u_obj->update(); 18 } elseif (isset($_POST['bbs']) && $_POST['bbs'] == "delete") { 19 require("XXX3.php"); 20 $d_obj = new Delete(); 21 $d_obj->chk = $_POST['chk']; 22 $d_obj->delete(); 23 } 24 25 require("XXX4.php"); 26 $l_obj = new List_table(); 27 $data = $l_obj->List_table(); 28 echo implode(",", $l_obj); 29?>

PHP

1//XXX4.php 2<?php 3 require_once("XXX.php"); 4 5 class List_table extends Db { 6 public $result; 7 public $row; 8 public function List_table() { 9 $this->connect(); 10 $sql = "SELECT * FROM XXX ORDER BY time DESC"; 11 $result= $this->class->query($sql); 12 $c = 0; 13 $this->result = null; 14 while($row = $result->fetch_assoc()) { 15 $this->result[$c] = array('name' => $this->$row['name'], 'comment' => $this->$row['comment']); 16 $c++; 17 } 18 $this->close(); 19 return $this->result; 20 } 21 } 22?>

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

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

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

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

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

guest

回答3

0

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

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

投稿2016/09/30 05:04

jm1156

総合スコア866

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

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

a-_.

2016/09/30 05:14

ご回答ありがとうございます returnの件すいません、他の箇所の処理に没頭していて忘れてしまっていました
jm1156

2016/09/30 05:42

ちょっとまて、 $this->result = null; なぜnullに…? というか、コンストラクタで DB接続>SQL投げる>変数に代入>DB閉じる って、処理を全部やってしまうのは仕様としてはよくないと思います。 初心者の書くコードの仕様にとやかく言うほどでもないかもしれませんが…。
a-_.

2016/09/30 06:13

ご回答ありがとうございます returnを質問文のソースにコーディングして訂正しました nullの箇所は削除するのを忘れていました
jm1156

2016/09/30 06:35

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

2016/09/30 06:35

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

0

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

PHP

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

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

PHP

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

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

PHP

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

投稿2016/09/30 05:17

編集2016/09/30 05:20
ttyp03

総合スコア16998

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

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

a-_.

2016/09/30 06:11

ご回答ありがとうございます $l_obj = new List_table(); echo implode(",", $l_obj->result);で実行してみましたが、改善しませんでした
ttyp03

2016/09/30 06:23

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

0

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

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

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

PHP

1class List_table { 2 function __CONSTRUCT(){ 3 require_once("XXX.php"); 4 $this->conn=new Db; 5 $this->conn->connect(); 6 $sql = "SELECT * FROM XXX ORDER BY time DESC"; 7 $result= $this->conn->query($sql); 8 $this->result = null; 9 while($row = $result->fetch_assoc()) { 10 $this->result[] = array('name' => $row['name'], 'comment' => $row['comment']); 11 } 12 $this->conn->close(); 13 } 14}

これに対して

PHP

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

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

投稿2016/09/30 04:58

編集2016/09/30 05:22
yambejp

総合スコア114769

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

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

yambejp

2016/09/30 05:05

ちなみにXXX.phpをrequireしてextendして使用していますが XXX.php内でDBへの接続をしているなら、XXXのDbクラスから データを取ってくる方が効率的ではないでしょうか? それとコンストラクタを古い書き方をしているのは何か意図があるのでしょうか?
a-_.

2016/09/30 05:08

ご回答ありがとうございます 元々行いたい処理はXXX4.phpで配列を取得した後、ループ処理して、その処理後のデータをメインのクラスに出力するという流れです そこでXXX4.phpをrequireして、$l_objにList_table()というオブジェクトを代入、$dataは$l_obj(List_tableオブジェクト)の要素を代入、配列要素を含んだオブジェクトを代入した$l_objをimplodeで文字列として返すということです
a-_.

2016/09/30 05:11

コンストラクタについては、「オブジェクト指向型」で調べているとこのようなコーディングで処理するという説明書きがあったので参考にしました 古い書き方というのは初耳です
jm1156

2016/09/30 05:16

よく見たらコンストラクタでしたか…。 じゃぁ $l_obj = new List_table(); $data = $l_obj->result; echo implode(",", $data); ですかね?
a-_.

2016/09/30 06:19

ご回答ありがとうございます 実行してみましたが、いけませんでした 因みにその時のエラーがこちらです Fatal error: Uncaught Error: Call to undefined method Db::query() in XXX4.php:8 Stack trace: #0 メインのクラス.php(25): List_table->__CONSTRUCT() #1 {main} thrown in XXX4.php on line 8
yambejp

2016/09/30 06:30

エラーになっているのはもとのDbクラスの仕様が想定しているものと違うからでしょうね XXX.phpも例示されたほうが良いかと思います。
toutou

2016/09/30 06:36

そのエラーって投稿者さんはどんなエラーだと思ってるんですか?そしてそれを確認しましたか?
jm1156

2016/09/30 06:36

Dbにquery()というメソッドが見つかりませんという意味です。 エラーメッセージがでたら、それをネットで検索して調べるようにしましょう。 親クラスのDbクラスはどうなっていますか?
a-_.

2016/09/30 06:37

下記ソースがXXX.phpです <?php class Db { public $class; public function connect() { $this->class = new mysqli("XXX", "XXX", "XXX", "XXX"); $this->class->select_db("XXX"); } public function close() { $this->class->close(); } } ?>
jm1156

2016/09/30 07:08

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

2016/09/30 07:12

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

2016/09/30 07:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問