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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

1177閲覧

PHP: データベースの行を指定して表示させたいです。

y-sasaki

総合スコア54

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/01/02 09:41

PHP: データベースの行を指定して表示させたいです。
動くプログラムは書いたのですが、データベースの一行目しか表示されません。
プログラムを修正して、指定された行のデータを表示させたいです。

試したことは
最後の方の
print_r($result);   の部分を

print_r ($result[1]);
と書いてみて動かした。

ソース

<?php $dsn = 'mysql:dbname=chatlog;host=localhost'; $user = 'testuser'; $password = 'yasushi'; try { $dbh = new PDO($dsn, $user, $password); echo "接続成功\n"; } catch (PDOException $e) { echo "接続失敗: " . $e->getMessage() . "\n"; exit(); } $sql = "SELECT * from `chatlog`"; $stmt = $dbh->query($sql); $result = $stmt->fetch(PDO::FETCH_ASSOC); print_r($result); ?>

________________________________

このソースならちゃんと動いてくれます。
結果は  接続成功 Array ( [id] => 1 [name] => ヤスシ [log] => テスト
というように表示されます。

これの最後の方の部分を   print_r ($result[1]);  と書き直すと

Parse error: syntax error, unexpected variable "$result" in C:\xampp\htdocs\php\db.php on line 28

というエラーが出ます。

よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/02 12:52

markdown を適切に使用してください。
y-sasaki

2021/01/02 12:59

読みにくくてすいません。markdown のこと、よくわかってませんでした。
退会済みユーザー

退会済みユーザー

2021/01/02 22:11

質問は編集できます。あとから見る人のためにも修正をしておいてください。
guest

回答3

0

ベストアンサー

エラーが出るのは
print_r ($result[1]); 
の括弧が全角だからじゃないかと思います。
エラーが出ないコードに[1]だけを追加すれば、parseErrorからnoticeに変わると思います。
後述の理由で欲しいデータは入っていませんが。

文法エラーはIDEやエディタにチェックさせるのが楽なので、PHP IDEPHP 開発環境などで検索して効率的な開発環境を構築されることをお勧めします。
(質問中に記述されているのがコピペミスであれば、実際にエラーが出ているコードを質問に追記して下さい)

また、質問中のfetch()では一行しか取り出せないので、
seastar3さんの回答の様にループで全件取得するか、

PDOStatement::fetchAll
を使って全件取得する必要があります。(上記サンプルコードを読んでみるとやりたいことに近いと思います)


事前にID等が分かり、IDを変数で指定したい場合は
PDO::prepareを使ってプレースホルダを使う事で安全に条件指定をすることが出来ます。
条件となる数値や文字列を文字列連結によってSQLに組み込み、PDO::query()で実行することはSQLインジェクションの温床になる可能性が高いうえ、メリットは特に無いので避けるべきです。

投稿2021/01/02 12:09

編集2021/01/02 12:14
tanat

総合スコア18727

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

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

y-sasaki

2021/01/02 12:55

ありがとうございます。:fetchAllにしてみました。 修正したソースは try { $dbh = new PDO($dsn, $user, $password); echo "接続成功\n"; } catch (PDOException $e) { echo "接続失敗: " . $e->getMessage() . "\n"; exit(); } $sql = "SELECT * from chatlog"; $stmt = $dbh->query($sql); $result = $stmt->fetchAll(); print_r($result); ですが、結果が繰り返しで表示されます。 Array ( [0] => Array ( [id] => 1 [0] => 1 [name] => ヤスシ [1] => ヤスシ [log] => テスト [2] => テスト ) のように、これは1行だけですが、すべての行について繰り返し表示されてしまいます。  繰り返さないようにしたいのですが、どうすればいいですか
tanat

2021/01/02 13:05

全行取得している配列を丸ごとprint_r()すれば全行表示されるのは当然です。 (提示したURLのサンプルコードをしっかりと読んで理解するように努めてください。) 質問にあるように$result[1]を直接扱うか、where句でidを指定してfetch()してください。
tanat

2021/01/02 13:11

もし絞り込みをするべきSQL自体がよく分からないという状態であれば `SQL 入門 WHERE`等で調べて基本を学習した上で、PHPMyAdminやMySQL Workbench等のツールを使ってSQLを実際に実行できる環境を用意する事を強くお勧めします。
y-sasaki

2021/01/02 13:13

私の質問の仕方が悪かったです。 全行が表示されるのは、分かっていたのですが、  なぜか、各行で2回ずつ表示されてしまいます。日本語が変でしたら、すいません。
tanat

2021/01/02 13:19

そういう風にデータが格納されてしまってるのではと推測します。 推測を重ねても仕方無いのでまずは前述の通り、 MySQLのデータをPHP以外の方法で確認できる環境(phpMyAdminやMySQL Workbench等)を用意して、データを直接確認してください
y-sasaki

2021/01/02 13:26

表示結果は   接続成功 Array ( [0] => Array ( [id] => 1 [0] => 1 [name] => ヤスシ [1] => ヤスシ [log] => テスト [2] => テスト ) [1] => Array ( [id] => 2 [0] => 2 [name] => ひろし [1] => ひろし [log] => あ [2] => あ ) [2] => Array ( [id] => 3 [0] => 3 [name] => つよし [1] => つよし [log] => い [2] => い ) ) phpMyadmin に入れたデータは 1 ヤスシ テスト 2 ひろし あ 3 つよし い みたいな感じです。
tanat

2021/01/02 13:35

ああ、なるほど。 であれば 回答中の https://www.php.net/manual/ja/pdostatement.fetchall.php の 例2 結果セットから単一カラムの全ての値を取得する のあたりのサンプルを熟読して、fetchAll()のパラメータを指定してください。 `PHP fetchモード`等で検索して調べるのもありです。 実は大体のことはPHPマニュアル(回答中のリンクは全部PHPマニュアルのページです)のサンプルをよく読めば解決するので、とっつきにくいとは思いますがしっかりと読むようにしてください。
y-sasaki

2021/01/02 13:53

マニュアルみたら、、なんとなく 分かりました [name] => ヤスシ [1] => ヤスシ  のように 実際は1回だけの表示なんですが、 表示形式?のせいで 2回繰り返してるように見えただけかもです。 何度もありがとうございます。
guest

0

print_r()は配列情報を吐き出すデバッグ用の関数なので、

php

1print($result[1]);

print($result['id'].' '.$result['name'].' '.$result['log'].'<br>');

のようにして表示します。

また指定した行を表示するには

$sql = "SELECT * from chatlog";

$siteiid = 1010; $sql = 'SELECT * FROM chatlog WHERE id = :id'; $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', $siteiid, PDO::PARAM_INT); $stmt->execute(); while( $result = $sth->fetch(PDO::FETCH_ASSOC) ){ printf("%d|%d|%d\n", $result['id'], $result['name'], $result['log']); }

のようなSQLでの指定で取り出します。

(tanatさんの御指摘の通り、単純なエスケープではSQL対策として不備があるので、PDOを尊重してプレースホルダを用いたコードに改善しました。)

投稿2021/01/02 11:17

編集2021/01/03 04:32
seastar3

総合スコア2287

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

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

y-sasaki

2021/01/02 12:07

丁寧なご回答、 ありがとうございます。 $siteiid = 1010; $sql = "SELECT * from chatlog where id = '".$siteiid."'"; の部分の ".$siteiid."' は ".$siteid."'でよろしいでしょうか $siteidが 2 の時のデータを取り出したい場合。この部分を $siteid = 2; $sql = "SELECT * from `chatlog where id =".$siteid."`"; $stmt = $dbh->query($sql); と書いてみたのですが、エラーが出てしまいました。 エラーメッセージは 致命的エラー:キャッチされないPDOException:SQLSTATE [42S02]:ベーステーブルまたはビューが見つかりません:1146テーブル 'chatlog.chatlog where id = 2'がC:\ xampp \ htdocs \ php \ db.php:25に存在しませんスタックトレース:#0 C:\ xampp \ htdocs \ php \ db.php(25):PDO-> query( 'SELECT * from `...')#1 {main}がC:\ xampp \ htdocs \にスローされました25行目のphp \ db.php です。 ちなみに25行目は $stmt = $dbh->query($sql);   の部分です。 たびたびすいません。
tanat

2021/01/02 15:01 編集

SQLを構築する際にhtmlspecialchars()を使用するのは危険です。 参考: https://blog.tokumaru.org/2013/02/security-measures-of-own-way-are-unsafe.html 元の回答だと直前で変数指定をしているので、ほぼ固定値として扱っていることが分かるのですが、 - htmlspecialchars()は誤ったSQLインジェクション対策として用いられた歴史的経緯がある(割と新しめの記事でもダメな記述が書かれてたりする) - 固定値として扱うのであれば追記する必要がなく、(誤った)SQLインジェクション対策として追記されたように見える ため、低評価といたしました。
tanat

2021/01/02 17:04

修正と追記ありがとうございました。 低評価を取り消しました。
seastar3

2021/01/02 17:13

tanatさん、御助言どうもありがとうございました。 現在のSQLインジェクション対策の常識がよく分かりました。 常に自己研鑽を重ねなければ、おいて行かれることを痛感しましたので、今後とも精進して参ります。
guest

0

SQL で抽出するのがよさそうだと思うけど、質問の箇所は array_filter() で対応かなぁ。。。

php

1<?php 2$arr = [ 3 [ 4 'id' => 1, 5 'name' => 'ヤスシ', 6 'log' => 'テスト', 7 ], 8 [ 9 'id' => 2, 10 'name' => 'ヤスシ2', 11 'log' => 'テスト2', 12 ], 13 ]; 14 15var_dump($arr); 16var_dump($arr[0]); 17var_dump(array_filter($arr, function($x){ 18 return $x['id'] === 2; 19}));
//var_dump($arr); array(2) { [0]=> array(3) { ["id"]=> int(1) ["name"]=> string(9) "ヤスシ" ["log"]=> string(9) "テスト" } [1]=> array(3) { ["id"]=> int(2) ["name"]=> string(10) "ヤスシ2" ["log"]=> string(10) "テスト2" } } //var_dump($arr[0]); array(3) { ["id"]=> int(1) ["name"]=> string(9) "ヤスシ" ["log"]=> string(9) "テスト" } //array_filter array(1) { [1]=> array(3) { ["id"]=> int(2) ["name"]=> string(10) "ヤスシ2" ["log"]=> string(10) "テスト2" } }

~~SQL の文字リテラルを文字列連結で構成している回答がありますが、~~SQL インジェクションの原因となります。
普段から プリペアードステートメントを使用することをおすすめします。

投稿2021/01/02 13:05

編集2021/01/02 22:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問