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

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

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

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

Q&A

解決済

2回答

1749閲覧

PHP switch breakについて

marimokomokmOk

総合スコア52

PHP

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

0グッド

0クリップ

投稿2017/02/20 05:38

edit3.phpの

php

1 case 'insert' : 2 if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] )) 3 break; 4 $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); 5 $sql->execute ( array ( 6 htmlspecialchars ( $_REQUEST ['name'] ), 7 $_REQUEST ['price'] 8 ) );

この部分の
if(empty($_REQUEST['name']) || !preg_match('/[0-9]+/', $_REQUEST['price']))
break;
このbreakって、もし$_REQUEST['name']の値が空または$_REQUEST['price']の値が数字じゃなかったら処理を中断して、
$sql = $pdo->prepare ( 'insert into product values(null,?,?)' );
$sql->execute ( array (
htmlspecialchars ( $_REQUEST ['name'] ),
$_REQUEST ['price']
) );
は通らないという意味でしょうか。
if(empty($_REQUEST['name']) || !preg_match('/[0-9]+/', $_REQUEST['price']))以外だったら
$sql = $pdo->prepare('insert into product values(null,?,?)' );
$sql = execute(array(htmlspecialchars($_REQUEST['name']),$_REQUEST['price']));
を実行するという意味でしょうか。

php:edit3.php

1<?php require 'header.php'; ?> 2<table> 3 <tr> 4 <th>商品番号</th> 5 <th>商品名</th> 6 <th>商品価格</th> 7 </tr> 8<?php 9$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' ); 10if (isset ( $_REQUEST ['command'] )) { 11 switch ($_REQUEST ['command']) { 12 case 'insert' : 13 if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] )) 14 break; 15 $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); 16 $sql->execute ( array ( 17 htmlspecialchars ( $_REQUEST ['name'] ), 18 $_REQUEST ['price'] 19 ) ); 20 break; 21 case 'update' : 22 if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] )) 23 break; 24 $sql = $pdo->prepare ( 'update product set name=?, price=? where id=?' ); 25 $sql->execute ( array ( 26 htmlspecialchars ( $_REQUEST ['name'] ), 27 $_REQUEST ['price'], 28 $_REQUEST ['id'] 29 ) ); 30 break; 31 case 'delete' : 32 $sql = $pdo->prepare ( 'delete from product where id=?' ); 33 $sql->execute ( array ( 34 $_REQUEST ['id'] 35 ) ); 36 break; 37 } 38} 39foreach ( $pdo->query ( 'select * from product' ) as $row ) { 40 echo '<tr>'; 41 echo '<form action="edit3.php" method="post">'; 42 echo '<input type="hidden" name="command" value="update">'; 43 echo '<input type="hidden" name="id" value="', $row ['id'], '">'; 44 echo '<td>', $row ['id'], '</td>'; 45 echo '<td>'; 46 echo '<input type="text" name="name" value="', $row ['name'], '">'; 47 echo '</td>'; 48 echo '<td>'; 49 echo '<input type="text" name="price" value="', $row ['price'], '">'; 50 echo '</td>'; 51 echo '<td><input type="submit" value="更新"></td>'; 52 echo '</form>'; 53 echo '<form action="edit3.php" method="post">'; 54 echo '<input type="hidden" name="command" value="delete">'; 55 echo '<input type="hidden" name="id" value="', $row ['id'], '">'; 56 echo '<td><input type="submit" value="削除"></td>'; 57 echo '</form>'; 58 echo '</tr>'; 59 echo "\n"; 60} 61?> 62<tr> 63 <form action="edit3.php" method="post"> 64 <input type="hidden" name="command" value="insert"> 65 <td></td> 66 <td><input type="text" name="name"></td> 67 <td><input type="text" name="price"></td> 68 <td><input type="submit" value="追加"></td> 69 </form> 70 </tr> 71</table> 72<?php require 'footer.php'; ?>

php:edit2.php

1<?php require 'header.php'; ?> 2<table> 3<tr><th>商品番号</th><th>商品名</th><th>商品価格</th></tr> 4<?php 5$pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8', 6 'staff', 'password'); 7foreach ($pdo->query('select * from product') as $row) { 8 echo '<tr>'; 9 echo '<form action="edit3.php" method="post">'; 10 echo '<input type="hidden" name="command" value="update">'; 11 echo '<input type="hidden" name="id" value="', $row['id'], '">'; 12 echo '<td>', $row['id'], '</td>'; 13 echo '<td>'; 14 echo '<input type="text" name="name" value="', $row['name'], '">'; 15 echo '</td>'; 16 echo '<td>'; 17 echo '<input type="text" name="price" value="', $row['price'], '">'; 18 echo '</td>'; 19 echo '<td><input type="submit" value="更新"></td>'; 20 echo '</form>'; 21 echo '<form action="edit3.php" method="post">'; 22 echo '<input type="hidden" name="command" value="delete">'; 23 echo '<input type="hidden" name="id" value="', $row['id'], '">'; 24 echo '<td><input type="submit" value="削除"></td>'; 25 echo '</form>'; 26 echo '</tr>'; 27 echo "\n"; 28} 29?> 30<tr> 31<form action="edit3.php" method="post"> 32<input type="hidden" name="command" value="insert"> 33<td></td> 34<td><input type="text" name="name"></td> 35<td><input type="text" name="price"></td> 36<td><input type="submit" value="追加"></td> 37</form> 38</tr> 39</table> 40<?php require 'footer.php'; ?>

php:edit.php"

1<?php require 'header.php'; ?> 2<table> 3<tr><th>商品番号</th><th>商品名</th><th>商品価格</th></tr> 4<tr> 5<form action="edit3.php" method="post"> 6<input type="hidden" name="command" value="insert"> 7<td></td> 8<td><input type="text" name="name"></td> 9<td><input type="text" name="price"></td> 10<td><input type="submit" value="追加"></td> 11</form> 12</table> 13<?php require 'footer.php'; ?>

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問者様の理解で合っています。
if分は括弧が無い場合、次の1文の命令のみが対象になります。

ご提示頂いたコードは以下と同じです。

php

1 case 'insert' : 2 if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] )) { 3 break; 4 } 5 $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); 6 $sql->execute ( array ( 7 htmlspecialchars ( $_REQUEST ['name'] ), 8 $_REQUEST ['price'] 9 ) );

投稿2017/02/20 05:48

mri0815

総合スコア429

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

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

marimokomokmOk

2017/02/20 06:00

if(empty($_REQUEST['name']) || !preg_match('/[0-9]+/', $_REQUEST['price'])){ break; }else{ //それ以外だったら $sql = $pdo->prepare('insert into product values(null,?,?)' ); $sql = execute(array(htmlspecialchars($_REQUEST['name']),$_REQUEST['price'])); break; } という意味と同じでしょうか。 ご解答いただきありがとうございます。
mri0815

2017/02/20 06:06

そうなります。
marimokomokmOk

2017/02/20 06:48

```php: case 'insert' : if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] )) { break; } $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); $sql->execute ( array ( htmlspecialchars ( $_REQUEST ['name'] ), $_REQUEST ['price'] ) ); ``` if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] ))がtrueの場合は $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); $sql->execute ( array ( htmlspecialchars ( $_REQUEST ['name'] ), $_REQUEST ['price'] ) ); も通るのでしょうか。 これについて書いてある参考サイトございますでしょうか。
marimokomokmOk

2017/02/20 07:18

```php: <?php $s = 'あ'; $s1 = 'う'; switch ($s) { case 'あ' : if ($s1 == 'い') echo 'Hello'; break; // breakした時点でswitch構造を抜けるから、通らない echo 'World'; break; } ?> ``` これはなぜWorldと表示されないのでしょうか
mri0815

2017/02/20 07:32

9行目に記載いただいたコメントの通りで合っていますよ。 8行目の break; でswitch構造を抜けるためです。 ※6行目のif文は括弧がないため、7行目のecho文のみに有効です。
marimokomokmOk

2017/02/20 07:37

こちらがWorldと表示されないなら if (isset ( $_REQUEST ['command'] )) { switch ($_REQUEST ['command']) { case 'insert' : if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] )) break; $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); $sql->execute ( array ( htmlspecialchars ( $_REQUEST ['name'] ), $_REQUEST ['price'] ) ); break; の $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); $sql->execute ( array ( htmlspecialchars ( $_REQUEST ['name'] ), $_REQUEST ['price'] ) ); はif (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] ))がtrueじゃないときに $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); $sql->execute ( array ( htmlspecialchars ( $_REQUEST ['name'] ), $_REQUEST ['price'] ) ); は実行されないということでしょうか。
mri0815

2017/02/20 07:46

いえ、実行されます。 if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] ))がtrueじゃなければ、breakされないためです。
marimokomokmOk

2017/02/20 07:59

<?php $s = 'a'; $s1 = 'c'; switch ($s) { case 'a' : if ($s1 == 'b') echo 'Hello'; break; // breakした時点でswitch構造を抜けるから、通らない echo 'World'; break; } ?> と switch ($_REQUEST ['command']) { case 'insert' : if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] )) break; $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); $sql->execute ( array ( htmlspecialchars ( $_REQUEST ['name'] ), $_REQUEST ['price'] ) ); break; って文法的に同じ感じですよね?
marimokomokmOk

2017/02/20 08:03

なぜ $s = 'a'; $s1 = 'c'; switch ($s) { case 'a' : if ($s1 == 'b') echo 'Hello'; break; // breakした時点でswitch構造を抜けるから、通らない echo 'World'; break; } はif ($s1 == 'b')がtrueじゃなければ echo 'World';が表示されないのでしょうか。 双方とも同じ文法なのに何故でしょうか。
mri0815

2017/02/20 08:05

意図がいまいち読み取れていませんが、 1つ目のプログラムでは、 ----- if ($s1 == 'b') ----- がfalse で評価され ----- echo 'World'; ----- が実行されず、次の命令の ----- break; ----- が実行されて、switch 構造は終了です。 2つ目のプログラムでは、 if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] )) が ・false で評価された場合、 ----- break; ----- が実行されず、 ----- $sql = $pdo->prepare ( 'insert into product values(null,?,?)' ); $sql->execute ( array ( htmlspecialchars ( $_REQUEST ['name'] ), $_REQUEST ['price'] ) ); break; ----- までが実行されてswitch 構造は終了です。 ・trueで評価された場合、次の命令の ----- break; ----- が実行されて、switch 構造は終了です。
mri0815

2017/02/20 08:09

>双方とも同じ文法なのに何故でしょうか。 へのアンサーです。 ----- <?php $s = 'a'; $s1 = 'c'; switch ($s) { case 'a' : if ($s1 == 'b') echo 'Hello'; break; // breakした時点でswitch構造を抜けるから、通らない echo 'World'; break; } ?> ----- では、 if ($s1 == 'b') の次の命令が echo 'Hello'; とありますが、 上記if文に括弧がないため、このecho文のみ、 ・trueなら実行 ・falseなら実行しない となります。 echo文の次行のbreak;ですが、 こちらのbreak;は上記if文がtrue/falseに拘らず、実行されます。 そのため、echo 'World';は実行されません。
marimokomokmOk

2017/02/20 08:24

なるほど。やっとわかりました。 すっきりしました! 一行しか実行されないことに気づいていませんでした。 ご迷惑をお掛けして申し訳ございません。 ありがとうございました。
mri0815

2017/02/20 08:33

解決したようで何よりです!
marimokomokmOk

2017/02/20 08:33

本当にありがとうございました。
guest

0

SQL実行処理は通らないという意味です。

投稿2017/02/20 05:46

turbgraphics200

総合スコア4267

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問