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

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

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

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

Q&A

解決済

2回答

558閲覧

1行Fetch時のデータアクセスの仕方

ratezou

総合スコア55

PHP

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

0グッド

1クリップ

投稿2022/12/25 05:39

編集2022/12/28 05:24

PHPの勉強中です。

ネットを参考に勉強しているのですが、データ表示のところで疑問にあたりました。
複数行の場合はforeachで回して、データにはオブジェクト->カラム名でアクセスしますが、一行フェッチのときは、オブジェクト名[”カラム名”]でアクセスしなければ表示できませんでした。

表記が統一出来ればいいのにな。と思ったのですが、そんなものなのでしょうか?

ちなみに、こんなコードです。

index.php

1<?php 2 3define('DSN', 'mysql:host=127.0.0.1;dbname=drh;charset=utf8mb4'); 4define('DB_USER', 'root'); 5define('DB_PASS', 'a61CXdhaSCKt'); 6 7try { 8 $pdo = new PDO( 9 DSN, 10 DB_USER, 11 DB_PASS, 12 [ 13 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 14 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, 15 PDO::ATTR_EMULATE_PREPARES => false, 16 ] 17 ); 18} catch (PDOException $e) { 19 echo $e->getMessage(); 20 exit; 21} 22 23function h($str) 24{ 25 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 26} 27 28function getBundle($pdo) 29{ 30 $stmt = $pdo->query("select * from bundle"); 31 $bundle = $stmt->fetch(PDO::FETCH_ASSOC); 32 return $bundle; 33} 34 35$bundle = getBundle($pdo); 36 37?> 38<!DOCTYPE html> 39<html lang="ja"> 40<head> 41 <meta charset="UTF-8"> 42 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 43 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 44 <title>Tools</title> 45 <meta http-equiv="Content-Style-Type" content="text/css"> 46 <link rel="stylesheet" href="css/styles.css"> 47</head> 48<body> 49<div class="doc"> 50 <h1>2F 食堂</h1> 51 <ul> 52 <li><label for="2FA4">A4</label><input class="bundle" type="number" name="2FA4" value=<?= h($bundle["2FA4"]); ?>></li> 53 <li><label for="2FA3">A3</label><input class="bundle" type="number" name="2FA3" value=<?= h($bundle["2FA3"]); ?>></li> 54 <li><label for="2FB5">B5</label><input class="bundle" type="number" name="2FB5" value=<?= h($bundle["2FB5"]); ?>></li> 55 <li><label for="2FB4">B4</label><input class="bundle" type="number" name="2FB4" value=<?= h($bundle["2FB4"]); ?>></li> 56 </ul> 57 <h1>3F 会議室</h1> 58 <ul> 59 <li><label for="3FA4">A4</label><input class="bundle" type="number" name="3FA4" value=<?= h($bundle["3FA4"]); ?>></li> 60 <li><label for="3FA3">A3</label><input class="bundle" type="number" name="3FA3" value=<?= h($bundle["3FA3"]); ?>></li> 61 <li><label for="3FB5">B5</label><input class="bundle" type="number" name="3FB5" value=<?= h($bundle["3FB5"]); ?>></li> 62 <li><label for="3FB4">B4</label><input class="bundle" type="number" name="3FB4" value=<?= h($bundle["3FB4"]); ?>></li> 63 </ul> 64 <button id="done" class="done">Done</button> 65</div> 66</body> 67<script src="js/main.js"></script> 68</html>

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

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

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

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

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

m.ts10806

2022/12/25 06:08

>複数行の場合はforeachで回して、データにはオブジェクト->カラム名でアクセスしますが、 実際のコードを提示されたほうが良いと思います。 あくまでfetchにあたえる引数によってどういう形で格納するかが決まるだけの話です。 https://www.php.net/manual/ja/pdostatement.fetch.php
ratezou

2022/12/25 07:15

初心者のため、マニュアルを読むのも難しいです。 コードに書いている。$bundle["2FA4"]を$bundle->2FA4と書くために必要なfetchの引数は何にすれば良いのでしょうか?
m.ts10806

2022/12/25 10:36

初心者の最初の目標が「PHPマニュアルを参照できるようになること(読み方を覚えること)」です。 それだけで聞くまでもなく解決できるようになることが一気に増えますよ。時間かけてでも読んでいった方がいい(日本語ですし、説明は丁寧ですし、サンプルコードもあるし、何より公式なので正しい情報です)
guest

回答2

0

自己解決

やはりカラム名の先頭が数値だったからエラーになっていました。
アルファベットに変更したとろこ、思い通りになりました。

また、ini_set('display_errors', 1 ); も動作するようになり、エラーの見通しが立つようになるかもしれません。
拙い質問でしたが、アドバイス頂きありがとうございました。

投稿2022/12/27 20:24

ratezou

総合スコア55

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

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

0

PHP

1$bundle = $stmt->fetch(PDO::FETCH_ASSOC);

PHP

1$bundle = $stmt->fetch();

もしくは

PHP

1$bundle = $stmt->fetch(PDO::FETCH_OBJ:);

でやりたい事が出来ませんか?
うまく出来たら、質問中のコードと比較してコメントにもあるPHPマニュアル
https://www.php.net/manual/ja/pdostatement.fetch.php
を読み込んでみると理解が進むかと思います。

追記

$bundle["2FA4"]を$bundle->2FA4と書くために必要なfetchの引数は何にすれば良いのでしょうか?

これはできません。というよりも、
普通のデータベース構造だと
$bundle["2FA4"]
も出来ないはずです。(ブラウザで右クリック→ソースの表示 で実際に全ての値が表示されているか確認してみてください。)

仮に2FA42FA3が格納されているカラム名がnameの場合は
$bundle->nameで値へのアクセスが可能です。

普通のデータベース構造だと、
2FA42FA3はカラム名では無く、カラムに格納されている値であり、
$bundle->カラム名でのアクセスは可能ですが、$bundle->値だと、そんなカラムは存在しないというエラーが出ます。
(fetch()の引数がPDO::FETCH_ASSOCの場合は、warningは出ますがエラーにはなりません)

(無いとは思いますが)もし、2FA42FA3がカラム名ということであれば、それはデータベース設計が誤っているので別の教材を探されることをお勧めします。

投稿2022/12/25 07:23

編集2022/12/25 08:11
tanat

総合スコア18709

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

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

ratezou

2022/12/25 07:42

function getBundle($pdo) { $stmt = $pdo->query("select * from bundle"); $bundle = $stmt->fetch(); return $bundle; } $bundle = getBundle($pdo); var_dump($bundle->2FA4); exit; としてみましたが、「このページは動作していません」になります。 (本来は0が表示されるハズ) 引数を「PDO::FETCH_OBJ:」にしても変わらないです。 何か、初心者ならではの間違いをしているような気もします。
tanat

2022/12/25 07:55

「このページは動作していません」 は他に何か問題があってエラーが発生している状態ですね。 <?php の直後に ini_set('display_errors', "On"); ini_set('error_reporting', E_ALL); を挿入して、エラーを表示して、エラーメッセージで調べてみてください。 また、「PHP デバッグ方法」で検索してみて、デバッグ方法を調べてみてください。 初学者ということであれば、エラー表示やデバッグ方法について記載のある教材を探してみることを強くお勧めします。(デバッグ方法が分からない状態だと適切に質問をすることすら難しい状態になってしまいます)
tanat

2022/12/25 07:56

ああ、質問を読み違えていました。 回答修正します。
ratezou

2022/12/25 08:35

的外れかもしれませんが、SQLです。 create table drh.bundle ( 2FA4 int default 0, 2FA3 int default 0, 2FB5 int default 0, 2FB4 int default 0, 3FA4 int default 0, 3FA3 int default 0, 3FB5 int default 0, 3FB4 int default 0 ); insert into drh.bundle (2FA4, 2FA3, 2FB5, 2FB4, 3FA4, 3FA3, 3FB5, 3FB4) values(0, 0, 0, 0, 0, 0, 0, 0); commit;
ratezou

2022/12/25 08:44

エラー表示ですが、変化ありませんでした。 php.iniの修正が必要かもしれませんが、これも位置やらを調べなくてはならず、時間がかかりそうなので後日致します。
tanat

2022/12/25 09:54

うーん、そういうテーブル構造なんですね。 であれば、当初の回答通りで動くはずなのでエラー表示もしくは、エラーログ(環境によって異なりますが、Apache+mod_phpならApacheのログ)を確認してみてください。
tanat

2022/12/25 11:31

たしかに、これはありそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問