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

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

ただいまの
回答率

90.34%

  • PHP

    21399questions

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

PHP switch breakについて

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 456

marimokomokmOk

score 46

edit3.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']))
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 require 'header.php'; ?>
<table>
    <tr>
        <th>商品番号</th>
        <th>商品名</th>
        <th>商品価格</th>
    </tr>
<?php
$pdo = new PDO ( 'mysql:host=localhost;dbname=shop;charset=utf8', 'staff', 'password' );
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;
        case 'update' :
            if (empty ( $_REQUEST ['name'] ) || ! preg_match ( '/[0-9]+/', $_REQUEST ['price'] ))
                break;
            $sql = $pdo->prepare ( 'update product set name=?, price=? where id=?' );
            $sql->execute ( array (
                    htmlspecialchars ( $_REQUEST ['name'] ),
                    $_REQUEST ['price'],
                    $_REQUEST ['id']
            ) );
            break;
        case 'delete' :
            $sql = $pdo->prepare ( 'delete from product where id=?' );
            $sql->execute ( array (
                    $_REQUEST ['id']
            ) );
            break;
    }
}
foreach ( $pdo->query ( 'select * from product' ) as $row ) {
    echo '<tr>';
    echo '<form action="edit3.php" method="post">';
    echo '<input type="hidden" name="command" value="update">';
    echo '<input type="hidden" name="id" value="', $row ['id'], '">';
    echo '<td>', $row ['id'], '</td>';
    echo '<td>';
    echo '<input type="text" name="name" value="', $row ['name'], '">';
    echo '</td>';
    echo '<td>';
    echo '<input type="text" name="price" value="', $row ['price'], '">';
    echo '</td>';
    echo '<td><input type="submit" value="更新"></td>';
    echo '</form>';
    echo '<form action="edit3.php" method="post">';
    echo '<input type="hidden" name="command" value="delete">';
    echo '<input type="hidden" name="id" value="', $row ['id'], '">';
    echo '<td><input type="submit" value="削除"></td>';
    echo '</form>';
    echo '</tr>';
    echo "\n";
}
?>
<tr>
        <form action="edit3.php" method="post">
            <input type="hidden" name="command" value="insert">
            <td></td>
            <td><input type="text" name="name"></td>
            <td><input type="text" name="price"></td>
            <td><input type="submit" value="追加"></td>
        </form>
    </tr>
</table>
<?php require 'footer.php'; ?>
<?php require 'header.php'; ?>
<table>
<tr><th>商品番号</th><th>商品名</th><th>商品価格</th></tr>
<?php
$pdo=new PDO('mysql:host=localhost;dbname=shop;charset=utf8',
    'staff', 'password');
foreach ($pdo->query('select * from product') as $row) {
    echo '<tr>';
    echo '<form action="edit3.php" method="post">';
    echo '<input type="hidden" name="command" value="update">';
    echo '<input type="hidden" name="id" value="', $row['id'], '">';
    echo '<td>', $row['id'], '</td>';
    echo '<td>';
    echo '<input type="text" name="name" value="', $row['name'], '">';
    echo '</td>';
    echo '<td>';
    echo '<input type="text" name="price" value="', $row['price'], '">';
    echo '</td>';
    echo '<td><input type="submit" value="更新"></td>';
    echo '</form>';
    echo '<form action="edit3.php" method="post">';
    echo '<input type="hidden" name="command" value="delete">';
    echo '<input type="hidden" name="id" value="', $row['id'], '">';
    echo '<td><input type="submit" value="削除"></td>';
    echo '</form>';
    echo '</tr>';
    echo "\n";
}
?>
<tr>
<form action="edit3.php" method="post">
<input type="hidden" name="command" value="insert">
<td></td>
<td><input type="text" name="name"></td>
<td><input type="text" name="price"></td>
<td><input type="submit" value="追加"></td>
</form>
</tr>
</table>
<?php require 'footer.php'; ?>
<?php require 'header.php'; ?>
<table>
<tr><th>商品番号</th><th>商品名</th><th>商品価格</th></tr>
<tr>
<form action="edit3.php" method="post">
<input type="hidden" name="command" value="insert">
<td></td>
<td><input type="text" name="name"></td>
<td><input type="text" name="price"></td>
<td><input type="submit" value="追加"></td>
</form>
</table>
<?php require 'footer.php'; ?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+3

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

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

        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']
            ) );

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/20 15: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;
    }
    という意味と同じでしょうか。
    ご解答いただきありがとうございます。

    キャンセル

  • 2017/02/20 15:06

    そうなります。

    キャンセル

  • 2017/02/20 15: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']
    ) );
    も通るのでしょうか。
    これについて書いてある参考サイトございますでしょうか。

    キャンセル

  • 2017/02/20 15:56

    breakした時点でswitch構造抜けるため、通りません。

    こちらが参考になると思います。
    ・breakについて
     http://php.net/manual/ja/control-structures.break.php

    キャンセル

  • 2017/02/20 16:18

    ```php:
    <?php
    $s = 'あ';
    $s1 = 'う';
    switch ($s) {
    case 'あ' :
    if ($s1 == 'い')
    echo 'Hello';
    break;
    // breakした時点でswitch構造を抜けるから、通らない
    echo 'World';
    break;
    }
    ?>
    ```

    これはなぜWorldと表示されないのでしょうか

    キャンセル

  • 2017/02/20 16:32

    9行目に記載いただいたコメントの通りで合っていますよ。

    8行目の
    break;
    でswitch構造を抜けるためです。
    ※6行目のif文は括弧がないため、7行目のecho文のみに有効です。

    キャンセル

  • 2017/02/20 16: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']
    ) );
    は実行されないということでしょうか。

    キャンセル

  • 2017/02/20 16:46

    いえ、実行されます。

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

    キャンセル

  • 2017/02/20 16: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;
    って文法的に同じ感じですよね?

    キャンセル

  • 2017/02/20 17: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';が表示されないのでしょうか。
    双方とも同じ文法なのに何故でしょうか。

    キャンセル

  • 2017/02/20 17: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 構造は終了です。

    キャンセル

  • 2017/02/20 17: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';は実行されません。

    キャンセル

  • 2017/02/20 17:24

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

    キャンセル

  • 2017/02/20 17:33

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

    キャンセル

  • 2017/02/20 17:33

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • PHP

    21399questions

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