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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

1403閲覧

データベースの値の更新処理に関して

newyee

総合スコア213

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2019/03/23 07:52

編集2019/03/23 08:49

PHPの学習中に、記載されているコード内で分からない部分があった為、お聞きしたくご質問させて貰いました。
下記のコード、「bindParam_form.php」はデータベースに接続しbookテーブルより入力されているデータを一覧表示し、更新したい箇所があった際は、フォーム内のテキストエリアを書き換え、更新ボタンを押し、「bindParam_process.php」より、bookテーブル内のデータを書き換える、といった流れの処理になります。

php

1<?php 2require_once '../DbManager.php'; 3require_once '../Encode.php'; 4 5try { 6 $db = getDb(); 7 $stt = $db->query('SELECT * FROM book ORDER BY published DESC'); 8 $cnt = 0; 9?> 10<!DOCTYPE html> 11<html> 12<head> 13<meta charset="UTF-8" /> 14<title>既存データの更新</title> 15</head> 16<body> 17<form method="POST" action="bindParam_process.php"> 18<input type="submit" value="更新" /> 19<table border="1"> 20<tr> 21 <th>ISBNコード</th><th>書名</th><th>価格</th> 22 <th>出版社</th><th>刊行日</th> 23</tr> 24<?php 25 while ($row = $stt->fetch(PDO::FETCH_ASSOC)) { 26 $cnt++; 27?> 28 <tr> 29 <td> 30 <?=e($row['isbn']) ?> 31 <input type="hidden" name="isbn<?=e($cnt) ?>" 32 value="<?=e($row['isbn']) ?>" /> 33 </td><td> 34 <input type="text" name="title<?=e($cnt) ?>" 35 value="<?=e($row['title']) ?>" size="35" /> 36 </td><td> 37 <input type="text" name="price<?=e($cnt) ?>" 38 value="<?=e($row['price']) ?>" size="5" /> 39 </td><td> 40 <input type="text" name="publish<?=e($cnt) ?>" 41 value="<?=e($row['publish']) ?>" size="12" /> 42 </td><td> 43 <input type="text" name="published<?=e($cnt) ?>" 44 value="<?=e($row['published']) ?>" size="12" /> 45 </td> 46 </tr> 47<?php 48 } 49} catch (PDOException $e) { 50 print "エラーメッセージ:{$e->getMessage()}"; 51} 52?> 53</table> 54<input type="hidden" name="cnt" value="<?=e($cnt) ?>" /> 55</form> 56</body> 57</html>

下記は、フォーム内のテキストエリアを書き換え、更新ボタンを押した際に、データベースに接続しテーブルのデータを書き換えるための、「bindParam_process.php」になります。

php

1<?php 2require_once '../DbManager.php'; 3 4try { 5 $db = getDb(); 6 $stt = $db->prepare('UPDATE book SET title=:title, price=:price, publish=:publish, published=:published WHERE isbn=:isbn'); 7 $stt->bindParam(':isbn' ,$isbn); 8 $stt->bindParam(':title' ,$title); 9 $stt->bindParam(':price' ,$price); 10 $stt->bindParam(':publish' ,$publish); 11 $stt->bindParam(':published' ,$published); 12 for($i = 1; $i <= $_POST['cnt']; $i++) { 13 $isbn = $_POST['isbn'.$i]; 14 $title = $_POST['title'.$i]; 15 $price = $_POST['price'.$i]; 16 $publish = $_POST['publish'.$i]; 17 $published = $_POST['published'.$i]; 18 $stt->execute(); 19 } 20 header('Location: http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/bindParam_form.php'); 21} catch (PDOException $e) { 22 print "エラーメッセージ:{$e->getMessage()}"; 23} 24

下記は、「bindParam_form.php」にアクセスをし、一行目の書名の欄を、「test」に書き換えた画像です
イメージ説明

お聞きしたい箇所なのですが、「bindParam_process.php」のfor文内の「$title = $_POST['title'.$i];」ここの部分なのですが、 「$_POST['title'.$i]」と$iを追加しています。そして、$titleに代入し、プレイスホルダにセットされていると思うのですが、何故、$iを追加するのかが分かりません。$iを追加した場合、書き換えた文字列に、$iが追加される形となり、結果的に書名の欄には、「test」ではなく、「test1」と数字がつくと思うのですが、そのまま書き換えた文字列が表示されています。何故なのでしょうか...?
ここら辺の部分に関しまして、理解に苦しんでいるため、どなたか、ご助言頂けましたら幸いです。
よろしくお願いします。

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

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

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

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

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

m.ts10806

2019/03/23 08:12 編集

出典書かないと「自分で書いたコードなのになんでわからないの?」という印象しかないわけで。 そうでなくてももう少しコードをきちんと読まれては。回答するのは簡単な内容ですが、あまりにコード読まれないままの「解説依頼」を投げられても困ります。質問サイトなので。
newyee

2019/03/23 08:20

本の出典などは、書いても大丈夫なのでしょうか...? 本の評判にも関わったりすると思いますし、書いてもよいのかなと思ったもので...
m.ts10806

2019/03/23 08:30 編集

評判を気にするような本は参考にしないでください。今までも何度か書籍名出してませんでした? 別に具体名出せないなら出せないで、"自身が書いたコードではない"ことがわかるように書く必要はありますよね。それを「teratailに適した質問の形」にして。
newyee

2019/03/23 08:49

修正しました。
guest

回答3

0

ベストアンサー

$_POST[添字] で値が取れるのは
<input name="添字"> の値だから。

<td> <?=e($row['isbn']) ?> <input type="hidden" name="isbn<?=e($cnt) ?>" value="<?=e($row['isbn']) ?>" /> </td><td> <input type="text" name="title<?=e($cnt) ?>" value="<?=e($row['title']) ?>" size="35" /> </td><td> <input type="text" name="price<?=e($cnt) ?>" value="<?=e($row['price']) ?>" size="5" /> </td><td> <input type="text" name="publish<?=e($cnt) ?>" value="<?=e($row['publish']) ?>" size="12" /> </td><td> <input type="text" name="published<?=e($cnt) ?>" value="<?=e($row['published']) ?>" size="12" /> </td>

送信側のHTMLがここにありますよね?
このフォーム部分をブラウザに出力されたHTMLで確認してください。
winなら ctrl + u , macなら command + u でHTMLソースがひうらきます。

isbn1 isbn2 ...

となっているはずです。


この人、開発に向いてないなーって日頃から思うのは、
自分の使っているツールの機能について全く興味がない人っていまして、
下のスクショはFirefoxのものですが、こういうメニューの機能について押したことすらない人がいます。
自分は初めて使うツールの機能については一通り触ってみます。
何を意味するものかわからなくてもです。
触っているうちにわかってくるんですよ。
メニューの右側についている記号って、なんだろうとか。(⌘U)ってなんだろうとか。
すると、ここに書いてあるのはショートカットなんだと。
そしたら、いろんなソフトも同じようについていることに気づいて、ショートカット忘れても、ここを見ればいいんだな、って学習してゆきます。

開発ツールにしても、ここの機能ってなんだろう、この枠に書かれているのはなんだろうって触ることです。
押すことができるボタンを押してパソコンが壊れることなんてないのですから、そういう好奇心は持って老いるべきだと思います。

イメージ説明

投稿2019/03/23 08:53

編集2019/03/23 10:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

newyee

2019/03/23 09:09

ご回答ありがとうございます。 POSTされた値を取得できるのは、<input name="添字">のように、name属性だったということを何故か勘違いしてしまっていました...かなり初歩的なことだったと、今は分かるのですが...理由が分からず、パニックになってしまっていました...
newyee

2019/03/23 09:11

ctrl + uでHTMlソースが見れるのも、初めて知りました。デベロッパーツールでしか見れないと思っていたもので... 教えてくださりありがとうございました。
guest

0

書籍メイン(というかのみ)で学習するときの弊害です。
おおよその書籍は「書いたら動く喜び」がすぐに感じられるように
まあまあのコード量とそれなりの意味がある設計でコードが書かれています。

でも、それだと「なんとなく書いたらなんとなく動く」という状態から抜けることはできません。
書籍メイン・書籍のみで学習をしてちゃんと成長しようと思ったら、コードの読解力が必要です。

言ってしまえばどこの誰とも知らない赤の他人が書いたコードです。
ある程度書籍にも解説・説明が書いてあるかもしれませんが、コードから要件をきちんと読み取る力が必要です。

teratailで上がってくる質問を読み解いて要件を把握するのと近いです。
つまり、書籍メイン・のみでやっていける人は、実は回答者になることも可能なくらい、「コードからきちんと読み解ける力」が備わっていると言えます。

コードの意図や意味を理解して、自分のやりたいことに取り入れることができる力ですね。
よく書籍を求める人がいますが、そういう人は大体「書ける気になっている」ところから脱せず、いざ、自分が1から何か作ろうとしたときに何も手が出せない状態になっています。
書籍参考するときに「動けばそれでOK」ばかり追い求めて、コードの意味や意図を考えていないからですね。

学校のお勉強とは違います。
プログラミングの本質は問題解決なので、勉強のような「インプット」がメインではなく「アウトプット」がメインとなります。

となると、漢字が書ければそれでいいわけではなく
語句の意味を適切に理解して、適切な場面で適切に使わないとまともなコミュニケーションはとれませんよね。
(つまりコミュニケーション能力の低い人はプログラミングの成長が中々思わしくない人が多いです)

体系的に学ぶには公式マニュアル・リファレンス・ドキュメントメインにしてください。
それ以外ありません。

という前提で、本編。

そもそも、このコードは何を問題解決するために組まれたものでしょうか?
単に「データを表示して更新する」 という大枠だけで「要件を把握できた」と言えるでしょうか?

データの持ち方から、本屋や図書館で管理されている書籍を閲覧・編集するような機能だと思われます。
本屋や図書館だと、本が購入されたり・貸出されたりすると増減しますよね。
となると、データを更新して減らしたり、増やしたりする必要ができてきます。

つまり、データの個数は不定なわけです。

今回のやり方は、データが不定である場合に、「効率的にデータを処理するため」に採用されるよくあるやり方です。

不定であり、1件1件ではなく、一気に入力して一気に更新したい場合、どうするか?ということです。

同じテーブルを利用するため、更新対象のカラムは同じです。
入力画面についても、ループで作っているため、nameも同じようなものになります。
ただ、nameが全く同じものは、最後のものしか送信されません。

となると、「全て送信する」ために工夫が必要になってきますよね。
チェックボックスのように同名で配列にするか、連番つけるか この2つの手段が有用です。

今回は後者「連番をつける」が採用された例です。
配列にした場合はそのままループで回せますが連番をつけた場合は「何件送信されるか(入力データのグループが幾つあるか)を渡す必要があります。
そのためのname='cnt'です。

送信したあとはcntの件数分回すことで送信されたデータを参照することが可能になります。

そのための送信先プログラムで書かれているのが$iです。

forでcntの件数分回して1つずつ取得、更新していっているわけですね。

勘違いしてたらいけないので補足しておきますが、
変数とはいっても格納しているのは文字列だったり配列だったり情報の本体です。
配列のキーに入ってるからって展開されるのは文字列。

$_POST['title1'] というキーにアクセスしているに過ぎません。

文字列連結が多くて分かりづらければ下記のように1つ1つの処理に分解すれば良いです。

php

1$title_key = 'title'.$i; 2$title = $_POST[$title_key];

重要な追記。

よく「デバッグしなさい」と言われると思いますが、
デバッグするのはエラーが起きたり想定通りの動作をしなかったときだけではありません。
コードを読み解くときにも非常に有効です。

現場では新規開発で全部自分で書くということは非常に少ないです。
多くが既存案件の保守、メンテナンスです。
要件定義や詳細設計書がきちんと残っていれば良いですが、それがない現場も多いです。
作った人がすでにいなかったり、コード内のコメントもろくに書いていないことのほうが多いです。

ということは、どこの誰ともわからない他人が書いたコードを
自分の力で読み解いて、意図を理解し、適切にメンテナンスしていく必要があるわけですね。
その際にもデバッグは非常に有用です。
むしろ、デバッグなしには読解は無理です。どんなに熟練者でも魔法使いではないですから、地道なデバッグをしていって理解を深めてメンテナンスをしていけるようになります。

同じことを繰り返しますが、書籍に書いてあるのは他人のロジック・他人のコード。理解をして取り込むにはそれ相応の読解力、デバッグする、そして時間が必要です。

ちなみにWebアプリケーションの開発を進める場合、PHPコードによって出力されたHTMLコードをブラウザ「ソースを表示」で確認することも「デバッグ」のうちです。
意図通りのものが出ているかどうか、画面を見ただけではわかりません。
他人のコードであれば尚更ですね。「このようにHTMLが出ているから、こう処理をしていくのか」考えるヒントになりますね。


ここで逆質問します。
他人の書いたコードを他人に解説されて、きちんと理解できるようになると思いますか?

考えてみてください。
少しでも開発をしていくほうになりたければ、考えていくしかありません。
もともとteratailは「思考するエンジニアのQ&Aプラットフォーム」ですからね。

質問者にも回答をきちんとくみ取る、読み取る能力が必要です。
自分の身にしなければどんな回答も無駄になりますからね。

投稿2019/03/23 09:44

編集2019/03/23 09:53
m.ts10806

総合スコア80765

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

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

newyee

2019/03/24 10:40

ご回答ありがとうございます。 確かにそうですよね。自分で実際に動かしてみなければ、力は付かないとは、僕も思っています。 参考書などに掲載されているコードで分からない部分があったら、まずは実際に自分で動かしてみたいと思います。
m.ts10806

2019/03/24 10:51

大事なことがなにも伝わってなくて非常に残念。 回答の意図や意味をきちんと理解するのも読解力が必要です。 実際に動かしてもないのに質問投げたことにも驚きですが、「まず動かしてみよう」だけの理解でとどまるところがあなたの成長を妨げてます。 意図や意味を理解しようと努めて、考えて考えて考えてください。 聞いていいですか? どこをどう見て「自分で動かしてみよう」という結論になったんですか?書いた覚えないですね。 そんな当たり前のことを伝えるつもりでこの回答を書いた訳じゃない。そのように伝わるのだったらこの回答は何の価値もない。 理解できないのをきちんと「わからない」と言えるのも成長できる人の特徴なんですけどね。 どこまで読んで何を理解したか全く不明(というかほとんど伝わってない)なのは残念としか。 phpで、というかプログラミングでなにをしたいんですか? 学校の単位のとか課題のためだけならteratail使う必要ないです。初心者のままでも単位はとれるので。
m.ts10806

2019/03/24 11:03

まあ、簡単そうなものでいいのでphpに関する質問に答えてみてください。答えないまでも、答えるつもりで回答作ってみてください。 今の自分に何が足りてないか見えてくるんじゃないですかね。やり方が間違ってるところとか。
newyee

2019/03/25 05:22

そうですね...inputではなくアウトプットといった部分でアウトプット=自分でプログラムを動かしてみる、といった意味だと思いました。しかし、mtsさんがおっしゃるように、意味を理解して動かさなければなんの意味もないというのはその通りだと思います。自分としましては、ただ動かすのではなく、意味を理解し、コードを追っていけるようにするといった意味も込め、実際に動かしてみるといった表現をしたのですが、少し、大雑把な表現すぎました。 自分がプログラミングを学んでいる理由は、仕事にしたいと考えているからです。今現在は、PHPを本格的に学習しているので、PHPのプログラマになれたらと考えています。 もう少し、勉強しましたら、teratailの質問に答えられるかもチャレンジしていきたいと考えています。
m.ts10806

2019/03/25 05:30

では尚更、PHPマニュアルメインにしないと仕事では使えませんよ。 「重要な追記。」に書いたとおりです。仕事で取り扱うのは大半が赤の他人が書いたコードです。 実際に私は業務でPHPを取り扱っている者です。私の忠告をあまり真摯に受け止められていないということを切に感じますし、「たぶん無理だろうな」とだいぶ前から思ってます。 厳しいこと言うようですが、今回の回答から学ぶものが何もないようでしたらあなたはそれまでです。 プログラミングの本質は問題解決。であればあなたが質問してきた内容で本当に問題解決が可能となるかどうかは明白です。自己評価ではないですからね。仕事は。 Kosuke_Shibuyaさんが回答の後半に書いてますね。 「この人、開発に向いてないなーって日頃から思うのは」以下。 それだけ性質として致命的な欠点と言えるかもしれません。 もちろん「素質がない、向いてないから無理!」と一刀両断するつもりは全くないです。私も元々文系出身で「プログラムなんかできるかよ」というところから今に至っているわけですから。 でも、それだけ血のにじむような努力と、時間を正しく使ってきたおかげだと思っています。 それでもPHPマニュアルメインとしないのでしたら仕事にするのはやめたほうがいいです。現場では書籍なんて何の役にも立ちません。 他人のコードを読み解くのに書籍開いても何も載ってません。 頭で考えること、PHPマニュアルをきちんと理解して組み込むこと 2点のみ。
newyee

2019/03/25 05:44

mtsさんから、PHPマニュアルをメインにした方が良いというアドバイスを貰ってから、PHPマニュアルを読むようにはしています。実際、最初は敬遠していたのですが、勉強を進める内、マニュアルに書いてあることが、他の書籍なり、ネットの記事などで書いてあることより簡単だと思うこともありましたし。しかし、PHPマニュアルに書いてあることが、難しいと思うことがあることもので、書籍や、ネットの記事を参考にする方が今現在は、割合が多いです。勉強を進めていき、知識が深まってきましたら、マニュアルをメインにしていくつもりではあります。
m.ts10806

2019/03/25 05:48

とりあえず、「長文読むのしんどいとりあえず後半だけ読もう」をやめたらどうでしょうか。 大事なことがほとんど飛ばされてるような気がしてなりません。
newyee

2019/03/25 05:58

いえ、mtsさんには貴重なアドバイスを貰っていますし、全て読ませて頂いています。 実際に業務で、PHPを使われているということですし、自分には、そのような知り合いもいないため、大変、貴重なご意見で、ありがたいです。 取り敢えずは、今までご返信させて貰ったこと(PHPマニュアルをメインにしていく、terateilの質問に答えていく)を実践できるよう、勉強を進めていきたいと思います。
m.ts10806

2019/03/25 06:03

そうですね。 回答側のことがわかれば見えてくることも沢山あると思います。 回答にも書いてますが、赤の他人のコードを読みといて問題解決に導くって本当に大変なことです。 仕事で扱うというのはそれ以上に大変なことです。 自身の現在地を見誤り続けているとい現状は認識してくださいね。私から見ると自己評価が高すぎます。
guest

0

$title = $_POST['title'.$i];
これはループに伴って
$title = $_POST['title1'];
$title = $_POST['title2'];
$title = $_POST['title3'];
ということになります。

POSTするform側も
<input type="text" name="title<?=e($cnt) ?>" value="<?=e($row['title']) ?>" size="35" />
ここがループによって
<input type="text" name="title1" value="$row['title']の値" size="35" />
<input type="text" name="title2" value="$row['title']の値" size="35" />
<input type="text" name="title3" value="$row['title']の値" size="35" />
となります。

「名前が"title1"であるinputに入力した物が$_POST['title1']に入っている」のだから、これは正しい挙動です。

投稿2019/03/23 08:50

sakura_hana

総合スコア11425

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

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

newyee

2019/03/23 09:04

ご回答いただきありがとうございます。 冷静に見直してみましたら、初歩的なことだったと気づかされました... おかげで解決でき助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問