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

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

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

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

Q&A

解決済

3回答

2029閲覧

気づけばプロ並み foreach文について

xo_yo

総合スコア54

PHP

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

0グッド

0クリップ

投稿2022/01/04 14:52

php

1<?php 2session_start(); 3session_regenerate_id(true); 4if(isset($_SESSION['member_login'])==false){ 5 echo'ようこそゲスト様 '; 6 echo'<a href="./membert_login.html">会員ログイン</a><br/>'; 7 echo'<br/>'; 8}else{ 9 echo $_SESSION['member_name']; 10 echo'様<br/>'; 11 echo'<a href="member_logout.php">ログアウト</a><br/>'; 12 echo'</br>'; 13} 14?> 15<!DOCTYPE html> 16<html lang="en"> 17<head> 18 <meta charset="UTF-8"> 19 <title>Document</title> 20</head> 21<body> 22<?php 23try{ 24 25$cart=$_SESSION['cart']; 26$kazu=$_SESSION['kazu']; 27$max=count($cart); 28 29 30$dsn='mysql:dbname=shop;host=localhost;charset=utf8'; 31$user='kakeaki'; 32$password='kakeaki'; 33 34$dbh=new PDO($dsn,$user,$password); 35$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 36 37foreach($cart as $key=>$val){ //セッションに入っているcodeを入れている 38 $sql='SELECT code,name,price,gazou FROM mst_product WHERE code=?'; 39 $stmt=$dbh->prepare($sql); 40 $data[0]=$val; 41 $stmt->execute($data); 42 43 44 45 46 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 47 48 $pro_name[]=$rec['name']; 49 $pro_price[]=$rec['price']; 50 if($rec['gazou']==''){ 51 $pro_gazou[]=''; 52 }else{ 53 $pro_gazou[]='<img src="../product/gazou/'.$rec['gazou'].'">'; 54 } 55} 56 57$dbh=null; 58 59}catch(Exception $e){ 60 echo'ただいま障害により大変ご迷惑をお掛けしています '; 61 exit(); 62 63} 64?> 65カートの中身</br> 66</br> 67<form method="post" action="kazu_change.php"> 68<?php for($i=0;$i<$max;$i++){ ?> 69<?php echo $pro_name[$i];?> 70<?php echo $pro_gazou[$i];?> 71<?php echo $pro_price[$i];?>72<input type="text" name="kazu<?php echo $i;?>" value="<?php echo $kazu[$i];?>"> 73<?php echo $pro_price[$i]*$kazu[$i];?>74<br/> 75<?php } ?> 76<br/> 77<input type="hidden" name="max" value="<?php echo $max;?>"> 78<input type="submit" value="数量変更"><br/> 79<input type="button" onclick="history.back()" value="戻る"> 80</form> 81 82</body> 83</html>

気づけばプロ並みPHP改訂版で勉強をしています。
foreach文についての質問です。

「$data[0]=$val;」ここの部分の[0]の役割がよくわかりません。本書では、「0と明示的に書いたのは、ルーフが回るたびに1,2,3,となってしまわないためです。」と書いてあるのですが理解できませんでした。

試しに、0ではなく1や2と書くとうまく機能しませんでした。また、「$data =$val;」このような形にしてもうまく機能しませんでした。

なぜ、「$data[0]=$val;」この形にしなければうまく機能しないのかわかりません。ご教授の方をよろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

その本には私の名前も入っていますが、セキュリティ上の協力をしたということでして、そうなった経緯は以下のブログ記事に書いております。

気づけばプロ並みPHP 副読本:お助け電子BOOKへの寄稿の顛末

上記の段階では「副読本」への協力だったのですが、その後副読本の内容が本体に取り込まれて改訂版となっております。

ただ、元々の内容がよろしくないので、やはり行きがかり上、私からもフォローしたいと思います。

以下において、executeメソッドの引数(この場合は$data)には配列を渡す決まりになっています。配列の要素数は、プレースホルダ「?」の数です。すなわち、この場合は 1 になります。

$stmt->execute($data);

すなわち、$value の値1つだけを持つ配列を作ればよいことになります。一番素直な書き方は以下でしょう。

$data = [$value];

古いPHPの書き方がお好みであれば、以下でも構いません。

$data = array($value);

では、書籍のように以下の書き方でも動く理由ですが…

$data[0]=$val;

$dataは、この段階までで初期化されていないので、値としてはnullが入っています。値nullに配列のように代入すると、それまでnullだったものが、配列として振る舞うようになります。これはPHP特有の「便利な書き方」ではあるのですが、紛らわしいし、バグの原因になるのでお勧めしません。

バグの原因になる具体例ですが、例えば、プログラムの最初の方に以下があったとして、

// ここまでで $data は初期化されていない $data[0]="Tanaka"; $data[1]="Sato";

この状態で、$dataには["Tanaka", "Sato"]が入ります。
この後のところで別のSQL文を呼び出そうとして以下のように書いたとします。

$data[0]="Matsuda";

意図としては、$dataは["Matsuda"] が入っているつもりなのに、現実には["Matsuda", "Sato"]になります。余計なものが入っていると、意図しない動作やエラーになる場合があります。

教訓としては、PHPの変数は初期化しない状態ではnullが入っていますが、それを積極的に使う書き方はよくなく、きちんと初期化すべきだということです。

投稿2022/01/05 01:44

ockeghem

総合スコア11705

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

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

xo_yo

2022/01/05 04:19

なるほど!すごく勉強になりました。ありがとうございます!!
guest

0

気になるなら

php

1$data = []; 2$data[]=$val; 3

でも良いです。やってることは同じ。配列の最初に値を設定。

配列は0開始。(つまり0が1番目)
もしくは

php

1 $sql='SELECT code,name,price,gazou FROM mst_product WHERE code=:code'; 2 $stmt=$dbh->prepare($sql); 3 $stmt->bindValue(':code', $val, PDO::PARAM_INT); 4 $stmt->execute(); 5

PHPマニュアル参考に。

投稿2022/01/04 20:14

編集2022/01/04 20:17
m.ts10806

総合スコア80875

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

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

m.ts10806

2022/01/04 20:17 編集

ただ、当該参考書は”名前だけ”で、必要な対策(XSSなど)がなされてなかったりアンチパターンな実装をしていることでも知られており、改訂版で多少マシになったとはいえ、teratailに駆け込んでる初心者の数からすると、あまり良い参考書とは言えません。 デバッグの仕方やPHPマニュアルの参照の仕方に言及していないなら尚更ですね。
xo_yo

2022/01/05 04:17

すごいわかりやすかったです!!ありがとうございます!!
guest

0

「$data[0]=$val;」ここの部分の[0]の役割がよくわかりません。

SQLの1番目のパラメタという意味です。
つまり、

$sql='SELECT code,name,price,gazou FROM mst_product WHERE code=?';

の ? に $val を bind するため、0 を明記しています。
SQLの初歩知識なのでSQLについて調べるといいでしょう。

投稿2022/01/04 17:03

sigsegv

総合スコア895

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

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

xo_yo

2022/01/04 17:48

ありがとうございます!なぜ、0を明記しないとbindできないのでしょうか? 質問ばかりで申し訳ございません。
xo_yo

2022/01/04 18:16

sql文は1,2,3,と数えると学んだのですが、考え方が違うのでしょうか?
sigsegv

2022/01/04 23:49

「1,2,3,と数える」とは何の話ですか? 配列のインデックスは 0, 1, 2, ... と0から始まります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問