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

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

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

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

Q&A

1回答

563閲覧

Warning: Illegal string offset

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2018/07/24 07:30

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>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/24 07:35

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

回答1

0

php

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

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

php

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

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

投稿2018/07/24 07:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/24 07:49

$_POSTと$postと$postsが混在するとか、ミスを誘発する書き方も改めないとね。
退会済みユーザー

退会済みユーザー

2018/07/24 07:51 編集

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

退会済みユーザー

2018/07/24 08:06

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

退会済みユーザー

2018/07/24 08:08

初心者だからこそ、いい加減な変数名はつけちゃいかんよ。 $posts = $db->prepare('SELECT number, text, user_name FROM comments WHERE room_id . .. var_dump($post); とやって実行したらどう表示される?
退会済みユーザー

退会済みユーザー

2018/07/24 08:13

そうですね。気をつけます。 Notice: Undefined variable: post in /var/www/www/room.php on line 60 NULLと表示されます。
退会済みユーザー

退会済みユーザー

2018/07/24 08:16

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

退会済みユーザー

2018/07/24 08:25

いえ、いじってないです
退会済みユーザー

退会済みユーザー

2018/07/24 08:29

既にpostとpostsを見誤っているのかもしれませんよ
退会済みユーザー

退会済みユーザー

2018/07/24 08:29

改めて見直すと問題点がいっぱいあるね… 残念なお知らせだが、ほぼ全てのロジック部分書き直しだね。 いったい、何を参考にこのコード書いてるの?
退会済みユーザー

退会済みユーザー

2018/07/24 08:30

> m6u さん おっとそのとおりだ。 var_dump($posts) ですね
退会済みユーザー

退会済みユーザー

2018/07/24 08:31

Yuuさん $posts = $db->prepare('SELECT number, text, user_name FROM comments WHERE room_id . .. var_dump($posts); でした
退会済みユーザー

退会済みユーザー

2018/07/24 08: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 08: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() を使ってレコードセットを取り出すことが必要です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問