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

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

ただいまの
回答率

88.62%

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 731

chimo

score 48

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

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

<?php

try{
    //DBへ接続
    $pdo = new PDO('mysql:host=localhost;dbname=*****;charaset=utf8','****','****');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "接続成功";
    echo "<br>";

}catch(PDOException $e){
    echo "接続失敗".$e->getMessage();
    echo "<br>";
    exit;
}

$sql = 
    "CREATE TABLE keijiban (
    number INT(11) AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20),
    message VARCHAR(100),
    regi_date TIMESTAMP
    )ENGINE=InnoDB DEFAULT CHARSET=utf8";

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

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


//接続を閉じる
$pdo = null;

?>


【質問】

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


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

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


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

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

$fruits = array("apple" => "リンゴ", "orange" => "ミカン", "lemon" => "レモン");
$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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2020/05/30 20:08

    「printf関数も調べてもよくわかりません」ではなく、どこがわからないかを具体的にしましょう。

    【質問するときのヒント|teratail(テラテイル)】
    https://teratail.com/help/question-tips#questionTips2

    キャンセル

  • hentaiman

    2020/05/31 03:00

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

    キャンセル

  • hoshi-takanori

    2020/05/31 04:34

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

    キャンセル

  • chimo

    2020/05/31 11:30

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

    キャンセル

回答 5

+10

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/31 14:41

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

    キャンセル

  • 2020/05/31 14:45

    >そこで人に聞かなきゃ理解できないならどうせ無理だと思うので

    はい。私もそう思います。

    キャンセル

  • 2020/06/05 04:00

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

    キャンセル

+4

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/30 21:02

    あんまりインターフェースまでPHPマニュアルで見に行くことってないですね・・・
    https://www.php.net/manual/ja/class.traversable.php

    でも読んでおけば深く理解して使えそうに思いました(あくまで私は)

    キャンセル

  • 2020/05/31 16:06

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

    キャンセル

checkベストアンサー

+3

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とかも使い慣れると便利。ただ上記ページを見て最初からわかったらすごいとは思う。(読み方には慣れが必要だと思う)

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/07 13:41

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

    キャンセル

+3

ちょっと誤解があります

 $pdo = new PDO

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

$pdo->setAttribute


としないといけません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る