🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

2回答

3694閲覧

DBから値をドロップダウンリストに表示したいのですが。。。

noizi.

総合スコア27

PHP

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

0グッド

0クリップ

投稿2021/03/06 08:29

前提・実現したいこと

関数をまとめたプログラム(ファイル名:functions.php)にはDBを接続し、SQLで値を得るようにしています。

functions.phpで値を得たら、メインのプログラムで得た値をドロップダウンリストで表示したいのですが、$queryをどのように処理したら良いのでしょうか?
また、$dbh = null;をどこで使うと良いのでしょうか?

個人的には今後switch文でファイルごとにSQL文を実行できるようにしてます。

今の出力結果は値の入っていないドロップダウンリストが表示されます。

どこがおかしいのかご教授お願い致します。

functions.php

<?php function db_access($db){ $dsn = 'mysql:dbname=example;host=localhost'; $user = 'root'; $password = 'shapshap'; $dbh = new PDO($dsn, $user, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); switch($db){ case 'search': $query = $dbh->query('select C_nm from example'); return $query; break: } } ?>

メインのプログラム

<?php try{ $db='search'; echo '<select name="C_num">'; require_once('C:\xampp\htdocs\customer\functions.php'); while ($row = db_access($db)->fetch(PDO::FETCH_ASSOC)) { echo '<option value="'.$row['C_nm'].'">'.$row['C_nm'].'</option>'; } echo '</select>'; } catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } $dbh = null; ?>

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

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

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

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

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

guest

回答2

0

ベストアンサー

1個1個結果を確認してください。

  • 直にDBに対してselect C_nm from exampleを実行して想定の結果が得られるか
  • $dbh->query('select C_nm from example')の返却値
  • db_access($db)の返却値
  • db_access($db)の返却値を一度受け取って->fetch(PDO::FETCH_ASSOC)の返却値

デバッグ環境整えましょう。
デバッガを入れるのが確実ですが、せめてvar_dump()でポイントポイントの変数を確認するくらいは癖づけましょう。

蛇足:

require_once('C:\xampp\htdocs\customer\functions.php');

完全環境依存になるのでこのパスの書き方はやめてください。
__DIR__定義済み)など利用して環境依存をなくす実装を(これに限らず、DIRECTORY_SEPARATOR なども有用)

投稿2021/03/06 08:38

編集2021/03/06 10:43
m.ts10806

総合スコア80875

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

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

0

下記のようにしたら上手く動作しました。

functions.php

1<?php 2function db_access($db){ 3 $dsn = 'mysql:dbname=example;host=localhost'; 4 $user = 'root'; 5 $password = 'shapshap'; 6 $dbh = new PDO($dsn, $user, $password); 7 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 8 switch($db){ 9 case 'search': 10 $query = $dbh->query('select C_nm from example'); 11 while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 12 echo '<option value="'.$row['C_nm'].'">'.$row['C_nm'].'</option>'; 13 } 14 return $row; 15 break; 16 default: 17 break; 18 } 19} 20?>
<?php try{ $db='search'; echo '<select name="C_num">'; require_once('C:\xampp\htdocs\customer\functions.php'); db_access($db); echo '</select>'; } catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } $dbh = null; ?>
<?php function db_access($db){ try{ $dsn = 'mysql:dbname=example;host=localhost'; $user = 'root'; $password = 'shapshap'; $dbh = new PDO($dsn, $user, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); switch($db){ case 'search': echo '<select name="C_num">'; $query = $dbh->query('select C_nm from example'); while ($row = $query->fetch(PDO::FETCH_ASSOC)) { echo '<option value="'.$row['C_nm'].'">'.$row['C_nm'].'</option>'; } echo '</select>'; $result = $row; break; case 'search_ans'; if (isset($_POST['C_num'])){ $get_C_nam[] = $_POST['C_name']; $get_C_nm[] = $_POST['C_num']; $get_C_phn[] = $_POST['C_phon']; $get_C_add[] = $_POSt['C_add']; } else { $C_nm = $_GET['C_num']; $sql = 'select * from example where C_nm= '.$C_nm.''; foreach ($dbh->query($sql) as $row) { $get_C_nam[] = $row['C_nam']; $get_C_nm[] = $row['C_nm']; $get_C_phn[] = $row['C_phn']; $get_C_add[] = $row['C_add']; } } $result = [$get_C_nam, $get_C_nm, $get_C_phn, $get_C_add]; break; case 'search_fix_a'; $stmt = $dbh->prepare('UPDATE example SET C_nam = :C_nam, C_nm = :C_nm, C_phn = :C_phn, C_add = :C_add WHERE example.C_nm = :C_nm'); $stmt->execute(array(':C_nam' => $_POST['C_name'], ':C_nm' => $_POST['C_num'], ':C_phn' => $_POST['C_phon'], ':C_add' => $_POST['C_sa'])); break; default: break; } } catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } if(isset($result)==true){ return $result; } $dbh = null; } ?>

投稿2021/03/06 13:34

編集2021/03/07 07:46
noizi.

総合スコア27

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

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

m.ts10806

2021/03/06 13:43

いや かなり グチャッと
noizi.

2021/03/07 04:29

一応、綺麗に整理されたプログラムって何なのかを教えていただけますか?
m.ts10806

2021/03/07 07:35

ヒントは既に別の回答で教えてくれていますし、 https://teratail.com/questions/326144 私の回答にも表したつもりです。 私が書くと私のプログラムにしかなりませんよ。
m.ts10806

2021/03/07 07:36

「役割分担」意識してください。 データ接続とアクセスと出力が同じところに書かれていては依存しまくってます。
noizi.

2021/03/07 07:48

こんな感じでしょうか(自分の回答プログラムの3つ目)?
m.ts10806

2021/03/07 07:50

(2回目)データ接続とアクセスと出力が同じところに書かれていては依存しまくってます。 役割を決めないまま思いつくままに書いているからです。 ファットコントローラ、ファットモデルまっしぐらですね。 db_accessという名前を付けた関数にどれだけ多くの役割を持たすのでしょうか。。。
noizi.

2021/03/07 08:49

では、データ接続とアクセスと出力を別々に書くコツはあるのでしょうか?
m.ts10806

2021/03/07 08:53 編集

コツって、そのまま別々で関数作って動的なところを引数で処理するくらいしかないですけど、そもそも「関数とは」「変数とは」が理解できてないと難しいのでは? 「考え方」についてもいい回答がありますよ。 https://teratail.com/questions/326144#reply-451842 それに「役割を決めないまま思いつくままに書いているからです。」と指摘されてるのですから「じゃあ役割を考えて書いてみよう」となると思ったのですが、コメント読んでないのか理解できてないのかはたまた。 分からないことを分からないと言っても何も恥ではないですが、そのあたり何も言及されない=分かってる と普通は認識されます。 でも答えばかり求めてくるので「わかってないじゃん」となって、赤の他人ゆえに同じことを何度も指摘するのは億劫なのでどんどん冷たくあしらわれるようになっていきます。 何が理解できていて何ができてないかと明確にしてください。 プログラミングは答えを考える問題解決の手段です。
m.ts10806

2021/03/07 08:57

「質問するときのヒント」にもありますね。 https://teratail.com/help/question-tips#questionTips2-1 もし「全部わからない」だと「質問と回答」という形では片付かないので入門書(ここ最近出版されたもの)を一通り通すことを強くすすめます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問