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

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

ただいまの
回答率

90.12%

PHP エラーの場所が分からない

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,023

a-_.

score 131

PHPのクラスで各メソッド毎にファイルを作成してデータベースにアクセスし、そこから出力するという処理を行いたいんですが、ここでお聞きしたいのが大きく2つあります

⓵メインのクラスでParse error: syntax error, unexpected '$i' (T_VARIABLE)
とエラー表示されました
原因がよく分からないんですが、$iの何がエラーなんでしょうか

⓶全クラスについてなんですが、手続き型でコーディングしていた箇所をオブジェクト指向型に全て書き換えてみて、クラス分けしている為に直ぐエラーに気付けないんですが、オブジェクト指向型とはこのようなコーディングで正しいのでしょうか
初めてこの書き方にしたため、本などで見比べても理解しづらい点もあるのでご指摘お願いします

//メインのクラス
<?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();
    echo strlen($data);
?>
//XXX.php データベース接続クラス
<?php
    class Db {
        public $class;
        public function connect() {
            $mysqli = new mysqli("XXX", "XXX", "XXX", "XXX");
            $mysqli->select_db("XXX");
        }

        public function close() {
            $mysqli->close();
        }
    }
?>
//XXX1.php
<?php
    require_once("XXX.php");

    class Post extends Db {
        public $name;
        public $comment;
        public function post() {
            $this->connect();
            $stmt = $mysqli->prepare("INSERT INTO XXX(name, comment) VALUES(?, ?)");
            $stmt->bind_param('ss', $_POST["name"], $_POST["comment"]);
            $stmt->execute();
            $this->close();
        }
    }
?>
//XXX2.php
<?php
    require_once("XXX.php");

    class Update extends Db {
        public $name;
        public $comment;
        public $chk;
        public function update() {
            $this->connect();
            for($a = 0; $a < count($this->chk); $a++) {
                $stmt = $mysqli->prepare("UPDATE XXX SET name = '$this->name', comment = '$this->comment' WHERE id = '".$this->chk[$a]."'");
            }
            $stmt->execute();
            $this->close();
        }
    }
?>
//XXX3.php
<?php
    require_once("XXX.php");

    class Delete extends Db {
        public $chk;
        public function delete() {
            $this->connect();
            for($b = 0; $b < count($this->chk); $b++) {
                $stmt = $mysqli->prepare("DELETE FROM XXX WHERE id = '".$this->chk[$b]."'");   
            }
            $stmt->execute();
            $this->close();
        }
    }
?>
//XXX4.php
<?php
    require_once("XXX.php");

    class List_table extends Db {
        public $result;
        public $row;
        public function bbslist() {
            $this->connect();
            $sql = "SELECT * FROM XXX ORDER BY time DESC";
            $result = $mysqli->query($sql)
            $i = 0;
            $this->result = null;
            while(row = $result->fetch_assoc($sql)) {
                $this->result[$i] = array('name' => $this->row['name'], 'comment' => $this->row['comment']);
                $i++;
            }
            $this->close();
        }
    }
?>

追記
XXX4.phpです
他のクラスのも念の為訂正します

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m6u

    2016/09/27 16:34 編集

    $i があちこちで使われているので、どのファイルの何行目なのかわかるように示してください。たとえば一行コメントなどで書き加えていただけると助かります。

    キャンセル

  • jm1156

    2016/09/27 16:38

    1つの書き込みで、2つ質問しないでください。
    2つに分けましょう。

    キャンセル

回答 5

checkベストアンサー

+3

//XXX4.php
    $result = $mysqli->query($sql)


末尾にコンマがないですね。あと

//XXX4.php
            while(row = $result->fetch_assoc($sql)) {


のrowもシンタックスエラーになるのではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+3

$result = $mysqli->query($sql)

セミコロンが無い。
syntax errorの意味わかってますか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/27 16:50

    ここも
    while(row = $result->fetch_assoc($sql)) {

    while($row = $result->fetch_assoc($sql)) {

    キャンセル

+2

「$i」を「$j」「$k」などと変えていき、発生源を特定してみては?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/27 16:47 編集

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

    見づらくてすいませんでした

    発生源はXXX4.phpでした

    キャンセル

+1

直接の回答じゃないけど、class Dbにてconnect()メソッドで獲得している$mysqliをクラス内変数として保持していない場合、connect()メソッドを抜けたら内容は保証されない気がするんですが、問題ないのかなぁ。
継承クラスのメソッドでなんの宣言もなく$mysqliにアクセスしているのが、どうにも気持ち悪くて。

さらには、public $class;ってあるけど、本当はpublic $mysqli;の間違いなのかも?

phpだから大丈夫、なの?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/28 01:20

    > phpだから大丈夫、なの?

    大丈夫じゃないです。
    PHPの場合クラス内へのアクセスは必ず$this->xxって書かないといけない(Javaみたいに同名ならthis.を省略とかできない)ので、インスタンス変数宣言にかかわらず全く継承ができてません。

    まあ元投稿者へのアドバイスとしては「まともな入門書を一冊買え」ですかね。

    キャンセル

0

PHP2を取り込んでると思ったら4を取り込んでたのがちょっとわからなかった。
エラー文のsyntax error, unexpectedをちょっとググルだけで情報がいっぱい出てきました。
いままでエラーはどうしてたんでしょうか。ノーミスで行ってたんでしょうか。だとしたらすごいと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/28 08:43

    いままでのエラーは、答えを聞いて、コピペして終わり。
    そんな感じの流れがもう数か月…。

    キャンセル

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

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

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