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

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

ただいまの
回答率

90.33%

  • PHP

    21343questions

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

Warning: Illegal string offset

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 666
退会済みユーザー

退会済みユーザー

 Warning: Illegal string offset

プログラミング&teratail超初心者です。
また質問させていただくのですが、今度はWarning: Illegal string offsetというエラーが出ました。
調べてもイマイチわからなかったのでどういうものなのか、対処法を教えてほしいです。

 エラー

Warning: Illegal string offset 'number' in /var/www/www/room.php on line 87
S
Warning: Illegal string offset 'user_name' in /var/www/www/room.php on line 88
S
Warning: Illegal string offset 'text' in /var/www/www/room.php on line 92
S

<?php
require('dbconnect.php');

$room_id = $_GET['room_id'];
$id = filter_input(INPUT_POST,'id');
$thread_number = filter_input(INPUT_POST,'thread_number');

// ナンバー
$number = $db->prepare('SELECT COUNT(*)+1 FROM comments WHERE room_id = '. $room_id .'');
$result = $number->execute();

if (!empty($_POST)) {
  // エラーの確認


  if ($_POST['text'] == '') {
    $error['text'] = 'blank';
  }
  if ($_POST['user_name'] == '') {
    $error['user_name'] = 'blank';
  }

  if (empty($error)) {
    $_SESSION['join'] = $_POST;
    header('Location: http://192.168.2.52/room.php?room_id='.$id.'');
    exit();
  }

}



//DB挿入
if (!empty($_POST)) {
  $message = $db->prepare("INSERT INTO comments
         (room_id, thread_number, number, text, user_name, modified, created)
  VALUES (?, ?, ?, ?, ?, now(), now())");

  if (empty($_POST['thread_number'])) {
    $threadNumber = null;
  } else {
    $threadNumber = $_POST['thread_number'];
  }
  $res = $message->execute(
    array(
    $room_id,
    $threadNumber,
    $result,
    $_POST['text'],
    $_POST['user_name'])
  );


header('Location: http://192.168.2.52/room.php?room_id='.$id.'');
exit();
}

// コメント表示
$posts = $db->prepare('SELECT number, text, user_name FROM comments WHERE room_id = '. $room_id .' ORDER BY created ASC');
$posts->execute();
// 返信





?>


<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>掲示板</title>
    <link rel="stylesheet" href="roomStyle.css">
  </head>
  <body>
  <div id="room">
    <header>
      <a href="index.php"><h1><span>掲示板**ボールドテキスト**</span></h1></a>
      <div align="right"><?php echo date('Y/m/d') ?></div>
    </header>
    <div>
     <?php foreach ((array)$posts as $post): ?>
          <table>
          <tr class="tr">
            <th><?php echo htmlspecialchars($post['number'], ENT_QUOTES); ?></th>
            <th><?php echo htmlspecialchars($post['user_name'], ENT_QUOTES); ?></th>
            <?php echo "<br>"; ?>
          </tr>
          </table>
          <p class="p"><?php echo htmlspecialchars($post['text'], ENT_QUOTES); ?></p>
        <?php echo "<br>"; ?>
    <?php endforeach; ?>
    </div>

      <div class="comment-Registration">
       <form action="" method="post" />
       <h3>コメント登録</h3>
        <ul>
          <li>
            <input type="hidden" name="room_id" value="<?php echo $room_id; ?>" />
            <label for="number">返信</label>
            <input type="hidden" name="number" />
            <?php echo htmlspecialchars(filter_input(INPUT_POST,'number'), ENT_QUOTES); ?>
            <input type="number" name="thread_number" placeholder="番号" size="30" min="1" max="99" />
            <?php echo htmlspecialchars(filter_input(INPUT_POST,'thread_number'), ENT_QUOTES); ?>
          </li>
          <li>
            <label for="text">コメント</label>
            <textarea type="text" name="text" placeholder="入力してください" cols="100" rows="10"
            value="<?php echo htmlspecialchars(filter_input(INPUT_POST,'text'), ENT_QUOTES); ?>" ></textarea>
            <?php if ($error['text'] != 'blank'): ?>
              <p class="error">* 必ず入力してください</p>
            <?php endif; ?>
          </li>
          <li>
            <label for="user_name">名前</label>
            <input type="text" name="user_name" size="40" placeholder="名前です"
            value="<?php echo htmlspecialchars(filter_input(INPUT_POST,'user_name'), ENT_QUOTES); ?>" />
            <input type="submit" value="登録" class="square_btn"/>
            <?php if ($error['user_name'] != 'blank'): ?>
              <p class="error">* 必ず入力してください</p>
            <?php endif; ?>
          </li>
        </ul>

      </form>
      </div>

  </div>
  </body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Kosuke_Shibuya

    2018/07/24 16:35

    何を調べて、どの部分がわからなかったのか、参考にしたサイトはどこなのかを記述してください。

    キャンセル

回答 1

+3

$posts = $db->prepare('SELECT number, text, user_name FROM comments WHERE room_id = '. $room_id .' ORDER BY created ASC');
$posts->execute();

ここでは $post は PDOStatement オブジェクトです。
にも関わらず、

<?php foreach ((array)$posts as $post): ?>

無理やり配列にキャストして、ループしている。
配列じゃなくて、PDOStatement オブジェクトなのだから、そんな添字(index)はありませんがなってエラーが出てる。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/24 16:49

    $_POSTと$postと$postsが混在するとか、ミスを誘発する書き方も改めないとね。

    キャンセル

  • 2018/07/24 16:50 編集

    その通りですね。回答する側としても、ソースコードが読みにくいですね。
    市販の入門者には必ず、デバッグの仕方を記述することを強制する法制化が必要だな。

    キャンセル

  • 2018/07/24 17:06

    ソースコードが読みづらく申し訳ございません。
    まだ初めて一ヶ月経たない身なのでこのような感じになってしまいました、、、
    もっと勉強します、、、

    キャンセル

  • 2018/07/24 17:08

    初心者だからこそ、いい加減な変数名はつけちゃいかんよ。

    $posts = $db->prepare('SELECT number, text, user_name FROM comments WHERE room_id . ..
    var_dump($post);

    とやって実行したらどう表示される?

    キャンセル

  • 2018/07/24 17:13

    そうですね。気をつけます。

    Notice: Undefined variable: post in /var/www/www/room.php on line 60
    NULLと表示されます。

    キャンセル

  • 2018/07/24 17:16

    おぃおぃって感じだな笑
    こっちはあくまで提示されたコードを前提に回答しているんだけど、何かいじった?

    キャンセル

  • 2018/07/24 17:25

    いえ、いじってないです

    キャンセル

  • 2018/07/24 17:29

    既にpostとpostsを見誤っているのかもしれませんよ

    キャンセル

  • 2018/07/24 17:29

    改めて見直すと問題点がいっぱいあるね…
    残念なお知らせだが、ほぼ全てのロジック部分書き直しだね。

    いったい、何を参考にこのコード書いてるの?

    キャンセル

  • 2018/07/24 17:30

    > m6u さん
    おっとそのとおりだ。
    var_dump($posts) ですね

    キャンセル

  • 2018/07/24 17:31

    Yuuさん
    $posts = $db->prepare('SELECT number, text, user_name FROM comments WHERE room_id . ..
    var_dump($posts);

    でした

    キャンセル

  • 2018/07/24 17:33

    object(PDOStatement)#3 (1) { ["queryString"]=> string(83) "SELECT number, text, user_name FROM comments WHERE room_id = 4 ORDER BY created ASC" }
    と表示されます。

    キャンセル

  • 2018/07/24 17:40

    そこに書かれているように、object(PDOStatement) と書かれていますよね。ということは $posts はPDOStatement ですよってこと。となるとね、やっぱり`$posts`という変数名は不適切なんです。
    PHPでは慣例的に、`$stmt` という変数を使う人が多いのですが、これは `Statement`に由来する変数名だとわかりますよね。

    「php PDOStatement」という感じでGoogle検索すると、http://php.net/manual/ja/class.pdostatement.php のページがヒットします。「php.net」はPHPの公式リファレンスです。
    時間を見つけて、こんリファレンスには全てのページをさらっとでも目を通しておくべきだとは思っていますが、時間を作ってやっておきましょう。(あくまでPHPの習得を目的にするならですが。)

    ちなみに、PDOStatement を foreach で回すことはできません。
    http://php.net/manual/ja/pdostatement.fetchall.php fetchiAll() を使ってレコードセットを取り出すことが必要です。

    キャンセル

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

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

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

  • PHP

    21343questions

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