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

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

ただいまの
回答率

90.83%

  • PHP

    18239questions

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

  • データベース

    639questions

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

お届け先のお客様の名前をすべて出すにはどうしたら良いですか?

解決済

回答 3

投稿 編集

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

mas33

score 10

花屋のサイトです。
会員様が何度か買い物をしたことがあるとして、
過去に頼んだお届け先の相手様の名前をすべて出したのですが
一人しか表示されません。
$code=$_SESSION['member_code'];は会員様のコードになります。
お届け先のテーブル(dat_otodoke)にも会員様のコードがあり、それで紐づけされています。
あまりPHPが分かっていない部分があるため、コードが見にくいかもしれませんが、
分かる方がいらっしゃいましたら、教えてください。

        <label for="name2" class="col col-xs-12 col-sm-4 col-md-3 control-label">贈る相手様<span class="label label-danger">必須</span></label>
        <div class="col col-xs-12 col-sm-5 col-md-4">
        <select name="name2" class="form-control">
        <option value="onamae2">
<?php
$code=$_SESSION['member_code'];

include ( dirname ( __FILE__ ) . '/path/file.php');

$sql='SELECT name2,code_member FROM dat_otodoke';
$stmt=$dbh->prepare($sql);
$stmt->execute();
$rec=$stmt->fetch(PDO::FETCH_ASSOC);

$dbh=null;

$onamae2=$rec['name2'];
$code_member=$rec['code_member'];

if($code == $code_member){
echo $onamae2.'様</option>';
}else{
echo 'お届け先はありません。</option>';
}
?>
            </select>
            </div>
            <div class="col-sm-offset-3 col-md-offset-5"></div>
            </div>
コード

編集したものです。
エラーになってしまいました。

$code=$_SESSION['member_code'];

include ( dirname ( __FILE__ ) . '/path/file.php');

$sql='SELECT name2,code_member FROM dat_otodoke WHERE code=?';
$stmt=$dbh->prepare($sql);
$stmt->execute();

$dbh=null;

while($rec=$stmt->fetch(PDO::FETCH_ASSOC))
{
$onamae2=$rec['name2'];
$code_member=$rec['code_member'];

if($code == $code_member){
echo $onamae2.'様</option>';
}else{
echo 'お届け先はありません。</option>';
}
}
?>
コード
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • zico_teratail

    2017/01/12 15:09

    「エラーになってしまいました」ではなくて、具体的にどういう操作をしたらどういうエラーだったのかとか、表示エラー文などをコピペしてください。

    キャンセル

回答 3

+4

まず
$sql='SELECT name2,code_member FROM dat_otodoke';

とありますが$codeをつかって絞り込みしていませんよね?
WHERE code=?
的な処理が必要ですね

そのうえで
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
whileやforeachなどでループせずにfetchしているので単に1行目をひっぱってきています

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

$rec=$stmt->fetch(PDO::FETCH_ASSOC)
は取得結果を1レコードずつしか取得できないため、以下のようにwhileなどで繰り返し取得する必要があります。

while ($rec=$stmt->fetch(PDO::FETCH_ASSOC)) {
    // 繰り返す処理
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

とりあえず現時点で判明している部分で明らかに間違っているところや不要なもの等を修正すると、こんな感じでしょうか。

<?php
include ( dirname ( __FILE__ ) . '/path/file.php');

$sql='SELECT name2 FROM dat_otodoke WHERE code_member = :code';
$stmt=$dbh->prepare($sql);
$stmt->bindValue(':code', $_SESSION['member_code'], PDO::PARAM_INT);//会員コードが数字だと仮定
$stmt->execute();

while ($rec = $stmt->fetch(PDO::FETCH_ASSOC) ) {
if($rec['name2'] != ""){
echo $rec['name2'].'様</option>';
}else{
echo 'お届け先はありません。</option>';
}
}
?>

その他、現時点で気づいた問題点や要改善点は以下の通り。

  • select nameやoption valueの使いかたを間違っている(HTMLを理解していない)
  • echoするときはhtmlspecialcharsなどでエスケープする

上記PHPコードでは出力されたoptionのvalueが適切に設定されていないため、結局あなたが期待しているような動作はしません。その辺まで全ては書きませんので、ご自分でまずHTMLについてググって調べてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/12 18:47

    見る前に解決しました。
    丁寧な回答をありがとうございます。
    <?php
    try
    {
    $code=$_SESSION['member_code'];

    include ( dirname ( __FILE__ ) . '/path/file.php');

    $sql="SELECT name2 FROM dat_otodoke WHERE code_member=$code";
    $stmt=$dbh->prepare($sql);
    $stmt->execute();


    $dbh=null;

    while(true)
    {
    $rec=$stmt->fetch(PDO::FETCH_ASSOC);
    $onamae2=$rec['name2'];
    if($rec==false)
    {
    break;
    }

    print '<option value="onamae2">'.$onamae2.'様</option>';
    }
    }
    catch (Exception $e)
    {
    print '<div class="sousin text-center">';
    print 'ただいま障害により大変ご迷惑をお掛けしております。';
    print '</div>';
    exit();
    }

    ?>
    で動きました。
    もし可能でしたら、問題ありそうでしたらご指摘お願いします。
    よろしくおねがいします。

    キャンセル

  • 2017/01/12 21:40

    重大な問題がいくつかあると思います。
    私が書いた回答やコードと見比べてみて、ご自分で問題点を考えてみてください。
    (私は既に問題点を二つ指摘しましたが、mas33さんの「解決した」というコードではその問題が解消されていません)

    何をゴールとして「動いた」と定義しているのか分かりませんが、私が思うにこのoption値では選択してsubmitしても「動かない(=選択した値が送信されない)」と思いますよ。nameとvalueを混同されていますね。

    try・catchを導入された点は良いと思います。

    キャンセル

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

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

関連した質問

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

  • PHP

    18239questions

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

  • データベース

    639questions

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