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

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

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

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

Q&A

解決済

3回答

809閲覧

arrayの中に複数データを入れた変数を入れるには

aoihello

総合スコア31

PHP

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

0グッド

1クリップ

投稿2022/09/13 08:43

前提

投稿データを出力する画面を作っています。
そもそも、arrayには複数データを保持した変数は入れられないのでしょうか。
変数展開をしたいので""で囲ったのですが、予期しないと言われてしまいました。

実現したいこと

15件の取得したtitleデータを順に出力したい。

発生している問題・エラーメッセージ

Parse error: syntax error, unexpected string content "", expecting "-" or identifier or variable or number

該当のソースコード

php

1<?php 2 $db = new PDO('mysql:host=------'); 3 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 4 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 5 $sql = 'SELECT title FROM post ORDER BY post . id DESC LIMIT ?, 15'; 6 $stmt = $db->prepare($sql); 7 $stmt->bindValue(1, $minvalue, PDO::PARAM_STR); 8 $stmt->execute(); 9 $result = $stmt->fetch(); 10 $stmt = null; 11 $db = null; 12 if(!empty($result)){ 13 $title[] = array("$result['title']"); 14 }else{ 15 echo 'データを取得できませんでした。リロードして下さい。'; 16 } 17 for($i=0;$i<15;$i++){ 18 echo" 19 <div> 20 <article class='question'> 21 <div class='questionInfo'> 22 <h2 class='questionTitleAround titlesize titlebase'> 23 <a class='questionTitle questionTitleColor'>$title[$i]</a> 24 </h2> 25 </div> 26 </article> 27 </div>"; 28 } 29 ?>
-- テーブルの構造 `post` -- CREATE TABLE `post` ( `id` int(10) NOT NULL, `subject` varchar(15) DEFAULT NULL, `grade` varchar(15) DEFAULT NULL, `post` varchar(2000) DEFAULT NULL, `pictures` int(11) DEFAULT NULL, `title` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

試したこと

arrayを消すと太宰治1が最初に一件だけ表示されます。
for文でif文を囲うようにして書いてみたのですが、どれも上手くいきませんでした。
複数データではない変数をarrayの中に書いてというのはインターネットで見つけたのですが、複数のものが見つかリませんでした。
"ではなく{}や[]でも代用できるというのを見つけたので、行ってみたのですが、どれも求めているものは出力できませんでした。

補足情報(FW/ツールのバージョンなど)

エラーは66行目で出ていて該当箇所はarrayの部分です。
テーブルの中身です。
イメージ説明

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

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

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

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

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

guest

回答3

0

まずPDOでエラーモードを設定したらtry/catchで処理してください
LIMITに与えられるのは整数値のみです

を前提に

配列の文字列を展開する場合は以下

PHP

1$result['title']="test"; 2$title[] = array($result['title']); 3$title[] = array("${result['title']}"); 4$title[] = array("{$result['title']}"); 5print_r($title);

投稿2022/09/13 09:42

yambejp

総合スコア114843

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

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

aoihello

2022/09/14 01:38

ご回答誠にありがとうございます。 並びに、ご指摘誠にありがとうございます。 今回は、適切に出力までm.ts10806様の助言で行えた為、m.ts10806様をベストアンサーにさせていただいた所存です。 今後ともよろしくお願いいたします
guest

0

ベストアンサー

$stmt->fetch();

そもそもfetchは1件しかとってこないので、結果セット全件取得したいなら、fetchの場合はwhile()で回してwhileの中で出力するか、いっそfetchAllで全て取得すればそのままforeachなどにセットできるので、いちいち詰め替える必要もないです

何を参考にしたのか全く分からない不思議なコードを書かれてるように見えますが、
各機能をPHPマニュアルで確認してください。

投稿2022/09/13 09:04

編集2022/09/14 00:56
m.ts10806

総合スコア80850

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

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

aoihello

2022/09/13 09:42

ご回答誠にありがとうございます。 ``` foreach($result as $title){ echo" <div> <article class='question'> <div class='questionInfo'> <h2 class='questionTitleAround titlesize titlebase'> <a class='questionTitle questionTitleColor'>$title</a> </h2> </div> </article> </div>"; } ``` 見づらいのですが、ifの下をこのように書き換えてみました。 Warning: Array to string conversionというエラーが出ました。 https://www.fenet.jp/dotnet/column/language/7046/ 上記のサイトを見たところarrayで解決するのですが、それ以外にもあるのでしょうか。
m.ts10806

2022/09/13 09:47

$result および $title の内容をvar_dumpで確認すればなぜダメなのか分かりますよ。
aoihello

2022/09/13 10:34

何度も申し訳ありません。 if(!empty($result)){ foreach($result as $title){ var_dump($title); echo" <div> <article class='question'> <div class='questionInfo'> <h2 class='questionTitleAround titlesize titlebase'> <a class='questionTitle questionTitleColor'>$title</a> </h2> </div> </article> </div>"; } } 上記のように書いたプログラムで array(1) { [0]=> array(2) { ["title"]=> string(10) "太宰治1" [0]=> string(10) "太宰治1" } } array(2) { ["title"]=> string(10) "太宰治1" [0]=> string(10) "太宰治1" } の値を出力しました。どちらも"title"となっていて間違えているようにも感じるのですが、stringになっていたため、なぜダメなのかが分かりませんでした。
m.ts10806

2022/09/13 10:47 編集

配列、もしくは連想配列の参照の仕方、扱い方を確認してください。 確認というか、学んでください。
m.ts10806

2022/09/13 10:45

もっと言えば文字列も。 もっと根本的な変数の扱い方を身に着けてください。 ループとか条件分岐とかまだ早いと思います。
m.ts10806

2022/09/13 11:09

ひとまず SELECT title FROM post ORDER BY post . id DESC LIMIT 1, 15 で想定のデータが取れるならいいですが、1なら1件目取れませんがいいんですかね。 LIMIT N,M のNは0からスタートです。 https://dev.mysql.com/doc/refman/5.6/ja/limit-optimization.html https://www.javadrive.jp/mysql/select/index12.html DBが何かしらないですが、PHPからいきなり実行ではなく DBに対して直接コマンド実行して「欲しいデータが取れるか」は確認を。 あとはLIMITはバインドじゃなく直接数値書いて(バインドしないのでbindValue不要) $stmt->execute(); $list = $stmt->fetchAll(); foreach($list as $row){ echo $row['title']."<br />" } こんな感じでタイトルだけ出ませんか?(データが1件でも取れるSQLなら) PHPの実装だけ確認したいのでミニマムにしています。fetchAllの結果がどうかも確認してません。 変数名も取得できる内容にあわせて勝手に変えました。 レイアウトは後からすれば良し(モックはモックで作って後でハメれば良し)
aoihello

2022/09/13 12:52 編集

<?php $db = new PDO('mysql:--------'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $sql = 'SELECT title FROM post ORDER BY post . id DESC LIMIT 1, 15'; $stmt = $db->prepare($sql); $stmt->execute; $list = $stmt->fetchAll(); foreach($list as $row){ echo $row['title']."<br />" ;} ?> で実行してみました。いまだにエラーが解除できずなのですが、これを実行したところ、 syntax error, unexpected token "}", expecting "," or ";" のエラーがずっと消えません。 やはりどこか取得の部分で間違えていたのでしょうか。 12行目がエラーが出ていた箇所で下から二段目です。
m.ts10806

2022/09/13 21:59

>$stmt->execute; ステートメントにはexecuteというメンバー(プロパティ、フィールド)はありません。 感覚で書くのではなく、各機能をPHPマニュアルで確認してください。 他にもありそうですけど、せめて構文エラーくらいは自身でなんとかしましょう。
m.ts10806

2022/09/14 00:57

低評価された方、理由をコメントを。 嫌がらせ目的ならやめてください(禁止行為として運営から対処されます)
aoihello

2022/09/14 01:14 編集

ご返事が遅くなり申し訳ありません。 その後上記のリンクを元に下記のように書き直しましたところ出力されました。 しかし、古い順に15件取得し新しい順に出力している状況です。 <?php try{ $db = new PDO('mysql:host=-------'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $sql = 'SELECT title FROM post ORDER BY post . id DESC LIMIT 1, 15'; $stmt = $db->prepare($sql); $stmt->execute(); $list = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach($list as $row){ echo $row['title']."<br />" ;} } catch (PDOException $e){ echo "DB接続に失敗しました。\n"; echo $e->getMessage() . "\n"; exit(); } ?> 実行結果 遠藤周作14 志賀直哉13 二葉亭四迷12 国木田独歩11 森鴎外10 島崎藤村9 樋口一葉9 正岡子規8 川端康成7 宮沢賢治6 三島由紀夫5 夏目漱石4 与謝野晶子3 芥川龍之介2 太宰治1
m.ts10806

2022/09/14 01:12

催促の意図はなかったです(そのように取られたなら申し訳ない) さて、結局「細分化」「ミニマム構成で確認」をしていないために手段だけを追い求めて 本来抱える必要のない問題を抱える人は多いです(特に入門者・初心者) いずれにしても1つずつ確実に確認することだと思います。 ①どのようなレイアウトにするか(お絵描き) ②そのレイアウトを実現するHTMLを組む(表示内容は仮でOK) ③取得したいデータを取得できるSQLを作成(直に実行) ④③のSQLを利用して取得したいデータをPHPで取得できるか(単にechoだけでOK) ⑤④で取得したデータを②のHTMLに当てはめる それぞれミニマムで確認していけば、どこで間違ったかが追えるので、 1ターンずつ区切って対応してみてください。 決して一気にしようとしないことです(どんな熟練者でも作業を細分化してミニマム構成で確認してから結合して完成を目指します。そのほうが間違いがなく、何かあった時に問題を追いやすいから)
aoihello

2022/09/14 01:30

ご回答誠にありがとうございます。 いえ、m.ts10806様からはそのような意図は感じ取れませんでした。 私としましては、m.ts10806様の貴重なお時間を毎度、私の勉強不足で煩わせてしまい、申し訳ありません。 ミニマム構成で確認していくことの大切さを学びました。誠にありがとうございます。 大変恐縮なのですが、もし差し支えなければお教えいただきたいのですが、m.ts10806様はどのようにプログラミングを学ばれたのでしょうか。 今私は独学で学んではいるのですが、基礎の部分が抜けていることなどから、やはりプロの方に基礎を習った上で、独学の方がいいのではないかと思った故お伺いしている所存です。 よろしくお願いいたします。
m.ts10806

2022/09/14 01:41

回答者は暇つぶしでやってる人がほとんどじゃないでしょうか。 別に義務でも何でもないですし、人によっては「謎解きが好き」で頑張る人もいるでしょうし。 ただ、サイトの利用にはルールがあるのでちゃんと解決したいならルールに則ってよ という意図で指摘をする方です(あくまで私の感覚ですが) なので、別に気にしなくて良いです。解決する気が見えるなら、暇つぶしの時間に割くのは惜しみません(むしろエンジニアは教えるたり育てるのが好きという人種) むしろ独学のほうが多いという印象です。 強いてならOJT。でも基本は自分で入門書やドキュメントで確認し、 自身で課題を設けて、実現までのプロセスを考え、あとはひたすらミニマムコードをたくさん書く。 やっていくと「まとまったものを作るために必要な部品」が少しずつ見えてくるようになるので、 設計の粒度や確度があがり、結果としてモノづくりの力が身についていきます。 自分で書いたコードはなぜそのようになるのか(不具合になった時も含めて)説明できるようになるのが、 当面やることだと思います。 そうなれば質問の質も上がってきます。(むしろ質問せずに解決できるようになるのでは) 自分で書いたコードが説明できないということは、そこに成長のチャンスがあるとも考えられます。 なので、「質問するときのヒント」に「何が分かっていて何が分からないかを明確にしよう」という項目があるのだと思っています。 「ここが分かれば解決できる」というところが分かっているかどうかですね。 https://teratail.com/help/question-tips#questionTips2 時間はかかりますが、王道はないので地道にやっていくしかありません。 ショートカットしようとしてまったく成長しない人の方が多い現状(teratailの他の質問見ていれば分かります) 小手調べで、実際に回答しないまでも、回答するつもりで質問を見てみてはどうでしょう? 回答できそうならしてもいいし(他に回答がついてるからと引く必要はないと思います) 回答して指摘がつけばそれも成長のチャンスです。 他の質問を見て、「ここが分かれば回答できそう」「この人が何を考えているか伝えてもらえればヒントはあげられそう」みたいなのが分かってきたら、自身の成長にも生かせると思います。 実際私がteratail始めたのが2017年で、回答しかしてないですが、 そこから色んな人の回答や質問を通して成長できた部分があるのも確かです。
aoihello

2022/09/14 02:04

ご返事誠にありがとうございます。 やはりどの学問も、説明できるようになって一人前というのは変わらないのですね。地道に、エラーを一つ一つ処理しながら、成長していきます。 誠にありがとうございました。今後ともよろしくお願いいたします。
m.ts10806

2022/09/14 02:06

>説明できるようになって一人前 いえ、「人を一人前に育てられるようになって一人前」です。 まだ私自身も一人前になったとは思ってません。まだ半人前ですね。
aoihello

2022/09/14 02:09

育てられるようになって、仰る通り教えることができても、その人の悩んでいることを成長できる形で、教えることは難しいことですね。 m.ts10806様で半人前なら、私はいつなれるのでしょう。。。
m.ts10806

2022/09/14 02:14

この手のものはあくまで自分自身との戦いなので、他者と比べる意味はないです。 私が申し上げたのもあくまで一般論で、それが全て当てはまるとも限りません。 成長曲線は個人個人違いますから(「地道にやるしかない」というところだけ同じ) まあ、焦らないことです。 プログラムは書いた通りにしか動かない前提は変わりませんし、やりたいことだけやろうとする我儘を聞いてくれませんから。
aoihello

2022/09/14 02:23

ありがとうございます。精進してまいります。
guest

0

変数展開をしたいので""で囲ったのですが、予期しないと言われてしまいました。

はい、この場合はどういうわけか内側の引用符なしで"$result[title]"と書かなければなりません(PHPマニュアル)。

投稿2022/09/13 09:01

maisumakun

総合スコア145184

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

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

aoihello

2022/09/13 09:48

ご回答誠にありがとうございます。 ご指摘いただいた通り書き直してみました所、 Array to string conversion Array Undefined array key 1 というエラーが出てしまいました。 他のページでは問題なく出力できていたため、よくわかっていないのですが、他のページでは$resultを$_SESSIONに渡していたため、変数出力はできないのでしょうか。
aoihello

2022/09/14 01:33

ご回答誠にありがとうございました。 PHPマニュアルでの例外を読みこむべきでした。 今回は、適切に出力までm.ts10806様の助言で行えた為、m.ts10806様をベストアンサーにさせていただいた所存です。 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問