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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

4回答

7589閲覧

ID最大値のレコードのみをPHPで表示

bigin

総合スコア67

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2017/08/22 15:04

MYSQLでテーブルを作成しており、AUTO_INCREMENTでidを付与しています。
以下がテーブル'present'の中身です。

+-------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | text | YES | | NULL | | | introduce | text | YES | | NULL | | | gazou | text | YES | | NULL | | | companyname | text | YES | | NULL | | | url | text | YES | | NULL | | +-------------+---------+------+-----+---------+----------------+

上記のテーブルからidが最大のレコードのみをphpで出力したいと考えており、下記phpを作りましたがうまくいきません。

おそらくecho文が違うのではないかと思いますが、初心のため何が違うかわかりません。
ご教示いただけますと幸いです。

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>プレゼント登録</title> </head> <body> <?php $dsn = 'mysql:dbname=2017_t_autumn;host=localhost;charset=utf8'; $user = 'root'; $password = ''; try{ $dbh = new PDO( $dsn, $user, $password ); }catch( PDOException $error ){ echo "接続失敗:".$error->getMessage(); die(); } $sql ="select * from present Where id = (Select Max(id) From present)"; $stmt = $dbh->query( $sql ); echo $result; ?> </body> </html>

ブラウザ表示結果

Array

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

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

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

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

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

guest

回答4

0

$stmt = $dbh->query( $sql );
echo $result;

queryの結果を$stmtに代入してますが、表示しようとしているのは$resultになってるのでまずここがおかしいです。

$stmtはデータそのものではなく「結果セット」というオブジェクトになっていますので、しかるべき方法でデータを取り出してやる必要があります。

  • foreach を使って一行ずつ取り出す
  • fetch、fetchAllなどの関数を使う
例1 foreach($stmt as $row) { echo "$row[0] $row[1] $row[2] <br>"; } 例2 $result = $stmt->fetch(PDO::FETCH_ASSOC); echo $result["id"]

詳細はマニュアル読んでください
http://php.net/manual/ja/class.pdostatement.php
http://php.net/manual/ja/pdostatement.fetch.php


蛇足ですが、SQLおかしいです。

$sql = "select * from present Where id = (Select Max(id) From present)";

idの逆順でソートして先頭を取り出せば良いです。

$sql = "select * from present order by id desc limit 1;

投稿2017/08/23 01:37

suzukis

総合スコア1449

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

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

bigin

2017/08/26 04:43

sqlの説明とてもためになりました。ありがとうございます!
guest

0

var_dumpを使用して変数resultの内容がどのようになっているのかを確認してみてください。

HTML

1<html> 2<head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 4 <title>プレゼント登録</title> 5</head> 6<body> 7<?php 8 9$dsn = 'mysql:dbname=2017_t_autumn;host=localhost;charset=utf8'; 10$user = 'root'; 11$password = ''; 12 13try { 14 $dbh = new PDO($dsn, $user, $password); 15} catch (PDOException $error) { 16 echo "接続失敗:" . $error->getMessage(); 17 die(); 18} 19$sql = "select * from present Where id = (Select Max(id) From present)"; 20$stmt = $dbh->query($sql); 21var_dump($result); 22?> 23</body> 24</html>

追記

PHP

1foreach ($result as $val) { 2 echo $val; 3}

投稿2017/08/22 15:06

編集2017/08/22 23:27
s8_chu

総合スコア14731

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

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

bigin

2017/08/22 15:22

ありがとうございます。 NULL でした。
bigin

2017/08/22 15:29 編集

かっこをつけるとちゃんとレコードだvar_dumpで表示されました。 while( $result = $stmt->fetch( PDO::FETCH_ASSOC ) ){ var_dump($result); } array(6) { ["id"]=> string(1) "3" ["name"]=> string(9) "りんご" ["introduce"]=> string(15) "美味しいよ" ["gazou"]=> string(9) "ringo.jpg" ["companyname"]=> string(9) "りんご" ["url"]=> string(15) "http://www.test" } このレコードの中身だけをうまくブラウザで表示させたいのですが、、、
s8_chu

2017/08/22 15:39

追記したようにforeachを使用することで可能だと思いますが、いかがでしょうか?
bigin

2017/08/23 00:14

ありがとうございます。やってみましたが、エラーになりました。te2jiさんの言われるように、$resultの定義づけが必要ということでしょうか?
s8_chu

2017/08/23 00:17

何というエラーでしょうか?また、現状のソースコードを追記していただけませんか?
bigin

2017/08/23 00:37

$stmt = $dbh->query( $sql ); foreach ($result as $val) { echo $val; } エラーコード Warning: Invalid argument supplied for foreach() in /home/ubuntu/workspace/bootstrap-3.3.7-dist/test.php on line 23 line23-> foreach ($result as $val) { です。
s8_chu

2017/08/23 00:39 編集

$resultには何が入っているのでしょうか?
bigin

2017/08/23 00:48

まだ定義していないですよね^^;ちょっと定義してやり直してみます。 ただ、どう定義するかがうまくわからず!
guest

0

s8_chu さんが気が付かせるための回答をしていますが、スルーしちゃってますね^^;

そもそも変数の概念が理解できていないので、この先、スクリプトを修正していっても思うような操作ができないと思います。

PDO による DB 操作は、スクリプトの基本動作が分かるようにならないと理解できないと思うので、もう少し基本を学ばれてはいかがでしょうか。

ちなみに、s8_chu さんの回答は、「$result って何も代入してないですよね」って気が付かせるものです。

あと、学習が進んだ後に見直してほしいのですが、PDO の接続設定に
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
を追加しておいてください。

追記
なんか迷走しているので、サンプルあげときます。
*わかりやすくするため修正しました。(あと、=が全角になってた^^;)

php

1$result = $stmt->fetch( PDO::FETCH_ASSOC ); 2foreach($result as $key => $val){ 3echo '$result[\''.$key.'\']:'.$result[$key].'<br>'; 4}

投稿2017/08/22 23:18

編集2017/08/23 01:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/08/22 23:49 編集

追記見ると、s8_chu さん、気が付かせる意図は無かったみたいですね。 何やってるんですか s8_chu さん^^;
bigin

2017/08/23 00:16

ありがとうございます。おっしゃる通り、まだ概念がうまくできていないところが多々あります。PD0の接続のアドバイスもありがとうございます。 ちなみに$resultの定義づけが必要だと思いますが、どうするのがいいでしょうか?
退会済みユーザー

退会済みユーザー

2017/08/23 00:36

今回のケースだと、1件なので特に $result を作らなくても echo $stmt->fetch( PDO::FETCH_ASSOC ) ; でいけると思いますよ。 使うなら、 $result = $stmt->fetch( PDO::FETCH_ASSOC ); var_dump($result); でイケるかと。
退会済みユーザー

退会済みユーザー

2017/08/23 00:51

失礼。echo じゃなくて var_dump($stmt->fetch( PDO::FETCH_ASSOC )); ですね^^;
bigin

2017/08/23 00:58

さっそくやってみました!var_dump($stmt->fetch( PDO::FETCH_ASSOC )); array(6) { ["id"]=> string(1) "3" ["name"]=> string(9) "りんご" ["introduce"]=> string(15) "美味しいよ" ["gazou"]=> string(9) "ringo.jpg" ["companyname"]=> string(9) "りんご" ["url"]=> string(15) "http://www.test" } ブラウザに上記のように表示されましたが、値だけをうまく取り出せる方法はありますか? echoにするとArrayとだけ表示されました。
退会済みユーザー

退会済みユーザー

2017/08/23 01:07

回答に追記しています。 が、ここまで値が取れていて、取り出せないのはやはり基本が理解できていません。 PHP のマニュアルは非常に優秀なので、一読されることをオススメします。 http://php.net/manual/ja/index.php
guest

0

ベストアンサー

s8_chuさんの回答をよく見てないで、勝手な回答になっておりました。失礼しました。
(オリジナルに対して回答てました)

一応サンプルです。

<?php $dsn = 'mysql:dbname=dbhoge;host=127.0.0.1;charset=utf8'; $user = 'hoge'; $password= 'hoge'; try{ $dbh = new PDO( $dsn, $user, $password ); }catch( PDOException $error ){ echo "接続失敗:".$error->getMessage(); die(); } $sql ="select * from present Where id = (Select Max(id) From present)"; $stmt = $dbh->query( $sql ); foreach ($stmt->fetchAll() as $result){ echo " id:" . $result['id']; echo " name:" . $result['name']; echo " introduce:". $result['introduce']; echo " gazou:" . $result['gazou']; echo " companyname:". $result['companyname']; echo " url:" . $result['url']; } ?>

投稿2017/08/22 23:03

編集2017/08/23 01:14
A.Ichi

総合スコア4070

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

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

bigin

2017/08/23 00:15

いつもありがとうございます。 $stmt = $dbh->query( $sql ); のあとどうすればうまく表示できるかわからず、、、、お力をお貸しいただけますと幸いです。
A.Ichi

2017/08/23 00:22 編集

他の方と同じものだった様なので削除しました。一応載せますね(変更した部分) $stmt = $dbh->query( $sql ); foreach ($stmt->fetchAll() as $result){ echo " $result['id']"; echo " $result['name']"; echo " $result['introduce']"; echo " $result['gazou']"; echo " $result['companyname']"; echo " $result['url']"; }
A.Ichi

2017/08/23 00:30 編集

こちらも追記します。 $stmt = $dbh->query( $sql ); $result_ar = $stmt->fetchAll(); foreach ($result_ar as $result){ echo " $result['id']"; echo " $result['name']"; echo " $result['introduce']"; echo " $result['gazou']"; echo " $result['companyname']"; echo " $result['url']"; }
bigin

2017/08/23 00:44

前者試してみましたが、下記エラーが出ました。 Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /home/ubuntu/workspace/bootstrap-3.3.7-dist/test.php on line 23
bigin

2017/08/23 00:45

コードは以下でやってみました。 $stmt = $dbh->query( $sql ); foreach ($stmt->fetchAll() as $result) { echo "$result['name']"; }
bigin

2017/08/23 00:53

echo "$result['name']"; ↓ echo "$result[name]"; でできました!
A.Ichi

2017/08/23 00:58

自環境では両方でテストしてうまく行っていましたので、、、良かったです。有難うございます違いを調べてみます。
bigin

2017/08/23 00:59

ご丁寧にありがとうございます。ちなみにcloud9でやっていることと何か関係があるかもです。
s8_chu

2017/08/23 01:24

横から失礼します。 `"$result['name']"`の場合、「'name'」という定義されていないキーへアクセスしようとするため、エラーとなるのではないかとおもいます。 以下のように波括弧で囲うことでもこのエラーを解消することができます。 `"{$result['name']}"`
A.Ichi

2017/08/23 01:37

そですねご指摘ありがとうございます。
bigin

2017/08/23 06:33

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問