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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

5回答

3199閲覧

php:書いたコードを自分で理解できません

chimo

総合スコア55

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

1クリップ

投稿2020/05/30 10:59

編集2020/05/31 07:05

CREATE文でカラムだけ作成し、カラムがきちんと作成できたかをブラウザに表示したいと思いいろいろ調べた結果以下のコードだと、カラムの内容をブラウザに表示することができました。

書いて、ある程度予想通りに表示されましたが、なんとなくで書いているため、何故上手くいったのかよくわから②部分も多いです。初学者ですが、この先のことも考えて一つひとつ理解しながらコードを書いていきたいと考えているため、以下のコードについて何点か説明をお願いしたいです。できればあまり専門用語使わずに教えていただければ嬉しいです。

php

1<?php 2 3try{ 4 //DBへ接続 5 $pdo = new PDO('mysql:host=localhost;dbname=*****;charaset=utf8','****','****'); 6 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 7 echo "接続成功"; 8 echo "<br>"; 9 10}catch(PDOException $e){ 11 echo "接続失敗".$e->getMessage(); 12 echo "<br>"; 13 exit; 14} 15 16$sql = 17 "CREATE TABLE keijiban ( 18 number INT(11) AUTO_INCREMENT PRIMARY KEY, 19 name VARCHAR(20), 20 message VARCHAR(100), 21 regi_date TIMESTAMP 22 )ENGINE=InnoDB DEFAULT CHARSET=utf8"; 23 24foreach ($pdo->query('show tables') as $row) { 25 printf('%s<br>', $row[0]); 26 echo "<ul>"; 27} 28 29foreach ($pdo->query('show columns from ' . $row[0]) as $row) { 30 printf('<li>%s:%s</li>', $row['Field'], $row['Type']); 31} 32 33 34//接続を閉じる 35$pdo = null; 36 37?>

【質問】

php

1foreach ($pdo->query('show tables') as $row) { 2 printf('%s<br>', $row[0]); 3 echo "<ul>"; 4}

この部分ですが、何故foreach文で「$pdo->query('show tables')」が使えているのか分かりません。**配列として扱われているものなんでしょうか?**また、printf関数も調べてもよくわかりません。sprintf関数が何故か出てきてしまいます。printf関数とはなんですか?

php

1foreach ($pdo->query('show columns from ' . $row[0]) as $row) { 2 printf('<li>%s:%s</li>', $row['Field'], $row['Type']); 3}

「$row['Field'], $row['Type']」の部分にあるように、$rowは配列だと思うのですが、何故[]の中に数字ではなく文字が入っているのでしょう?

【連想配列】
phpからMySQLにアクセスするためのサイトをよくみるのですが、だいたいみなさん連想配列を使ってらっしゃいます。ただ、私は「いつ連想配列つくったの?」となってしまいます。ふつうだったら、

php

1$fruits = array("apple" => "リンゴ", "orange" => "ミカン", "lemon" => "レモン"); 2$value1 = $fruits["apple"];

こんな感じで"apple"に"リンゴ"を入れますよーという宣言をすると思うのですが、私が見たサイト「例)https://noumenon-th.net/programming/2016/01/19/mysql/」はこのサイトさん以外でもそうですが、いつ$row['id']とか$row['name']をいつ設定したの・・・?と思ってしまいます。。。。

【printf関数】
phpマニュアルを読みましたが、「%」の意味が分かりません
「% 文字通り、パーセント文字です。 引数は不要です。 」とかかれていましたが、
実際に動かしたコードの中で「printf("%%b = '%b'\n", $n); 」のところは実行すると
「%b = '10100111101010011010101101'」となっていました。これをみても、%の働きがよくわかりません。演算子の余りを求めてくれる働きの%とは違い気もしますし...。何故ないとだめなのでしょうか・・・?
phpマニュアル:https://www.php.net/manual/ja/function.printf.php

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

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

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

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

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

hentaiman

2020/05/30 18:00

書いた翌日以降に分からないならありえるが書いた傍から書いてるコードが分からない状態は異常なので、処理1行ごとにgoogleなりマニュアルなり見ながら自分なりに解釈してコメントを書いて理解しなさい
hoshi-takanori

2020/05/30 19:34

「書いたコード」じゃなくて「写したコード」なのでは。
chimo

2020/05/31 02:30

調べて、何が分からなかったのか、そして参考サイトも詳しく載せました。質問の仕方が投げやりになてしまって申し訳ございませんでした。
guest

回答5

0

初学者ですが、この先のことも考えて一つひとつ理解しながらコードを書いていきたいと考えているため

書き上げた後に「考える」というやり方をしてはいけません。
つまり「とりあえず書く」のではなく「考えてから書く」が原則です。
設計も何もなしにいきなり書くコードは大抵スパゲッティになり後手後手の対応ばかりになり、リファクタリングに苦労することになります。

まずは「ゴール」を定め、そのゴールへの道筋を考えて、時に図や絵にして具体的にしてからコードを書いてください。
考えながら書けるようになるには相当の経験が必要です。

フローチャートのようなものでざっくり流れを描き、それぞれの処理で何が必要なのか具体的に調べ、時にミニマムコードで検証し、導入検討し、決めていくことです。

確かに提示のコードの目的は複雑なロジックではなく実行したらそれで終わりの内容です(2回目以降はエラーになるから)
でもそういうところから自身で考えて論理的に組み立てることができるようにならないと、1つのアプリケーションを作り上げることは到底無理な話です。

あと、「自分が書いたコードを他人に説明させる」のは「理解したい人」が最もやってはいけない行為です。結局「分かった気になる」以上にはなりません。初学者の自覚があるなら尚更です。
機能はPHPマニュアルを調べれば幾らでも説明がありサンプルコードもあります。そこで理解できるかどうか、自分がやろうとしていることに繋げられるかどうかが今後の成長を大きく左右します。

前の質問の Orlofskyさんのコメントは読まれたのでしょうか?URLを2つ貼ってくれています。
その2つの記事を書かれた人はどちらもteratailの回答者としても活動している(頻度は別として)方です。PHPには確かな知見がある人が書いた記事であり、いずれも回答でよく引用される記事です。
読まれましたか?そしてそれらはどの程度参考にしましたか?

PHPマニュアルへのリンクもあるはずです(mpywさんの方)
それだけPHPマニュアルは大事です。
今まで回答でPHPマニュアルが引用されたアドバイスをもらったことはないですか?私はPHPの回答の多くでPHPマニュアルを引用しています。
質問者さんの質問にも回答したことがあるかと思いますが、出してます(

おそらく機能的なところをPHPマニュアルで確認する癖がついていれば、「printf関数とはなんですか?」という疑問は出てこないのではないでしょうか。
※ちなみに「調べても分かりません」では何を調べたか誰も分かりません。

「理解したい」のであれば、PHPマニュアルからどのような使い方ができそうか考え、簡単なコードを組んでみて模索する、という行為を自ら進んでやらねばなりません。
今回の質問にはその試行錯誤部分が見えませんでした。

、初学者でもわかるように簡単に教えていただけたら幸いです。

こういう風に但し書きしている質問者は非常に多いのですけど、解釈によるかみ砕かれたアドバイスでは本質的な理解には繋がりませんし、先に書いたようにわかった気になるだけです。

例えはあまりよろしくないですけど、
スポーツ、野球とかで「ホームランの打ち方を初心者にも分かるように簡単に教えて!」と言ってどういうアドバイスがくるか想像できますか?それと同じです。
足し算ができないと掛け算もできないのです。
質問者さんは「2*3=6って答えは出せるけどなぜ6になるか分からない」と言っているのと同じです。

プログラムは書いたようにしか動かないので、まずは「動くように書く」こと。
それも「自分が理解できるコードを書く」こと。
他人に説明できないなら理解できてないということになりますし、自分が書いたコードを他人に説明を求めるのは、そもそも理解しようとすらしてないと捉えます。

調べたら知らない単語が出てきてその単語を調べること ありますよね。
そんなものです。
でも自分で調べて自分で解釈して、人に説明して人が理解できてようやく自分が理解できたということになります。

回答者やってみると良いですよ。自分の理解度が知れます。
何をすべきか明確になります。

投稿2020/05/30 12:01

m.ts10806

総合スコア80875

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

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

chimo

2020/05/31 03:17

今Orlofskyさんから頂いたurlを参考にしつつ、目的を紙にかいて、そこから何が必要かをphpマニュアルを読みながら試行錯誤しております。参考サイトと何が分からなかったかをもう一度詳しく追記いたしましたので、お時間あれば、確認して頂きたいです。
m.ts10806

2020/05/31 05:29

>できればあまり専門用語使わずに教えていただければ嬉しいです。 ですから。 そのまま正しい言葉と用語で覚えないと単なる解釈になるんですって。 理解しようとしてないと捉えます。 「英語の原文を日本語訳したもの」は百歩譲って良いとして、それ以上は別の意味の別の言葉です。 既に出ている回答を借りると、PDOStatementはPDOStatementでしかないし、TraversableもTraversableでしかない。 「専門用語」と言うのを「自分が知らない言葉」に対して使うのはやめましょうよ。 そのまま使うのは「素人相手に困らせてやろう」という意地悪な魂胆があるわけではなく、正しい理解をしてもらうためです。
m.ts10806

2020/05/31 05:32

一回、今のコードを捨てて、きちんと目的を確かめてどのように実現するか考えて、書き直してみると良いですよ。 他人に説明を求めるより何百倍も理解が深まります。 質問者さんの今のやり方は単なる依存なので、理解には結びつきません。自分でコードを組めるようにはなりませんし、もちろん、他人にアドバイスできるようにもなりません。
hentaiman

2020/05/31 05:37

初心者に対しては「foreachで回せる特別なものです」で良いと思いますが・・・習熟していけばいずれ調べて分かる事でしょうし pythonV2.xやperlで言うところの文字コードの指定の記述なんかも、初心者に対しては「おまじない」と言って教えれば良いと思ってる派の意見です
hentaiman

2020/05/31 05:38

そしてどうしても知りたかったら自分で調べてねと言って終わりです そこで人に聞かなきゃ理解できないならどうせ無理だと思うので
m.ts10806

2020/05/31 05:41

あ、その「おまじない」については賛成派です。もちろん「きちんと意味がある」という前提込みで。 なんか「専門用語」という言葉で逃げようとしてる人が多いので、「これはそういうもんだ」で飲み込んでほしいと思ってます。 型の概念まで教えるのはここでは無理ですし、「PHPマニュアルに書いてあるinputとoutputはそのままの言葉で理解してほしい」ということですね。 変に例えたり解釈いれると後に必ず引っ掛かるし、間違ったことを人に教えかねないので
m.ts10806

2020/05/31 05:45

>そこで人に聞かなきゃ理解できないならどうせ無理だと思うので はい。私もそう思います。
退会済みユーザー

退会済みユーザー

2020/06/04 19:00

PDO::PARAM_INT の挙動とか、まさにおまじないw
guest

0

配列として扱われているものなんでしょうか?

配列ではありませんqueryの結果はPDOStatement型ですが、これはTraversableを実装していますので、foreachで処理可能です(PHPマニュアル)。

何故[]の中に数字ではなく文字が入っているのでしょう?

「連想配列」といいます。PHPの配列は、添字が文字列でも動きます。

投稿2020/05/30 11:06

maisumakun

総合スコア146018

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

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

chimo

2020/05/31 07:06

わかりやすく対応して頂き、ありがとうございます。
guest

0

ベストアンサー

phpマニュアルを読みましたが、「%」の意味が分かりません
「% 文字通り、パーセント文字です。 引数は不要です。 」とかかれていましたが、
実際に動かしたコードの中で「printf("%%b = '%b'\n", $n); 」のところは実行すると
「%b = '10100111101010011010101101'」となっていました。これをみても、%の働きがよくわかりません。演算子の余りを求めてくれる働きの%とは違い気もしますし...。何故ないとだめなのでしょうか・・・?

printfは第一引数の文字列に、それ以降の引数を埋め込むための関数です。
第一引数の文字列にあいうえお%s、第二引数にかきくけこを入れるとあいうえおかきくけこと置き換えて出力できます。

「% 文字通り、パーセント文字です。 引数は不要です。」は10%upの10を置き換える際に、%d%upとすると%d %uのふたつを置き換えようとしてエラーになります。
それを、%d%%upとすると%dを引数と置き換え10%%%と置き換えて%の、10%upとできるのです。


【PHP: printf - Manual】
https://www.php.net/manual/ja/function.printf.php

変換の仕様は、以下のプロトタイプに従います: %[argnum$][flags][width][.precision]specifier.

argnumとかflags``widthとかも使い慣れると便利。ただ上記ページを見て最初からわかったらすごいとは思う。(読み方には慣れが必要だと思う)

PHP

1// %03d → %d(数値)の0埋めを3桁 2printf( '%03d%%up, %03d%%up', 10, 300 ); // 010%up, 300%up 3// %2$d → %d(数値)を2番目の値(下記例なら300)で置き換え 4printf( '%2$d%%up, %1$d%%up', 10, 300 ); // 300%up, 10%up 5// 例 6printf( '<div data-first-name="%2$s" data-id="%1$06d">受験番号%1$06d番 %2$s %3$s</div>' 7 /* %1$d */ , 10 8 /* %2$s */ , '山田' 9 /* %3$s */ , '太郎' 10); // <div data-first-name="山田" data-id="000010">受験番号000010番 山田 太郎</div>

投稿2020/06/04 17:52

kei344

総合スコア69606

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

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

chimo

2020/06/07 04:41

なるほど!!そういう意味だったんですね!!分かりやすく説明して頂き誠にありがとうございました!本当に助かりました!phpマニュアルをよんで理解できる時もあれば、むしろ全く分からなくなる時もあるので...^-^;;;
guest

0

質問内容に対しては、おおよそ公式読めば分かる内容かと。
関連リンクは他の人の回答にあるので省略します。

タイトルに関して、「コードの挙動を確かめたい」のであれば、変数を追うことになります。
デバッグ環境を整えて、ステップ実行すると良いですよ。

少しまとまった時間が必要となりますが、初学者がエディタとデバッグ環境を整えると、学習効率が飛躍的に上がります。時間を割く価値は十分あるので試すと良いです。

投稿2020/05/31 08:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ちょっと誤解があります

$pdo = new PDO

と$pdoというインスタンスを作ったならsetAttributeは

PHP

1$pdo->setAttribute

としないといけません

投稿2020/05/30 11:20

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問