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

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

ただいまの
回答率

89.12%

mysqlのDBを使用し情報を検索したい

解決済

回答 4

投稿

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

pomi

score 10

*質問*
mysqlのDBを使用し情報を検索した際に

undefined variable rows


とエラーが標記され値がどうしても取れず
困っております。
ご助言頂ければ嬉しいです。
お願い致します。

<form action="DB_top.php" method="post">

<center>情報ツール(情報*検索)</center>

  <body background="back.gif" bgcolor="#ccc" class="a">

<br />

<body>

<?php

$semina_year = $_POST['semina_year'];

$semina_month = $_POST['semina_month'];

$semina_day = $_POST['semina_day'];

$semina_type = $_POST['semina_type'];

$name = $_POST['name'];

$category = $_POST['category'];

$memo = $_POST['memo'];



                $dsn = 'mysql:host=localhost;dbname=customer;charset=utf8';

          $user = 'root';

          $password = '';



                $dbh = new PDO($dsn, $user, $password);



                $dbh->query('SET NAMES utf8');

    // $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sqlcmd = "SELECT * FROM `customer_semina`

          WHERE semina_year like '%$semina_year%'

              and semina_month like '%$semina_month%'

              and semina_day like '%$semina_day%'

              and semina_type like '%$semina_type%'

              and name like '%$name%'

              and category like '%$category%'

              and memo like '%$memo%'";



    $statement = $dbh->prepare($sqlcmd);

    $statement->execute();



if($statement){

$like_semina_year = "%".$semina_year."%";

$statement->bindValue(':semina_year', $like_semina_year, PDO::PARAM_STR);

}

if($statement->execute()){

        $row_count = $statement->rowCount();

        while($row = $statement->fetch()){

                $rows[] = $row;}

}else{

        $errors['error'] = "検索失敗しました。";

}

$dbh = null;

?>

<fieldset>

 <?php foreach($rows as $row){ ?>

        <br />

  <fieldset>

<br />

[受講年月日]<input type="text" value="<?php print $row['semina_year']; ?>" class="d-na">年

<input type="text" value="<?php print $row['semina_month']; ?>" class="d-na">月

<input type="text" value="<?php print $row['semina_day'];?> " class="d-na">日

<br />

[セミナー種別]<input type="text" value="<?php print $row['semina_type']; ?>" class="d-ad">

<br />

[氏名]<input type="text" value="<?php echo $row['name']; ?>" class="d-na">

<br />

[受講種別]  <input type="text" value="<?php echo $row['category']; ?>" class="d-y">

<br />

[メモ欄]  <input type="text" value="<?php echo $row['memo']; ?>" class="d-y">

</fieldset>

<?php }?>

</fieldset>

<br />

<br />

<input type="button" onclick="location.href='DB_top.php'" value="トップ戻る">





</body>

</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2016/11/02 18:28

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • terminator

    2016/11/02 18:43

    ソースコードのインデントを揃え、無駄な改行は削ってください。

    キャンセル

回答 4

checkベストアンサー

+1

クエリがNGなのかDBに接続できていないのかも判然としませんねぇ...
短いSQLとか変数を使用しないクエリとかで、順番に問題箇所を切り分けるべきですね。

DB接続は問題ない前提で、2つ確認すべき点を提案できます。

1.$sqlcmdに定義しているクエリをphp以外で実行し問題が無いか?
(mysqlだからMySQLWorckbenchとかで実行して、クエリの構文には問題が無いか?)

2.phpの変数の置換が出来ているか?
「 and semina_day like '%$semina_day%'」の部分とか、本当にPOST値で置換して実行されてますか?

if($statement){

$like_semina_year = "%".$semina_year."%";

$statement->bindValue(':semina_year', $like_semina_year, PDO::PARAM_STR);

}


提示されてる上記のコード通りだと、置換されてるパラメータが全然足りないので、
抜粋するにしても提示したサンプルを回答者が実行して再現確認できるように配慮しましょう。

部分抜粋でサンプルを書きますが、以下のような置換方法もあります。(エスケープ処理は必要ですが...)

$sqlcmd = " SELECT * FROM customer_semina "
        .  " WHERE semina_year like '%{$semina_year}%' ";
$sqlcmd = sprintf(" SELECT * FROM customer_semina "
                .  " WHERE semina_year like '%%%s%%' "
                ,$semina_year
                );

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

php 以前に、HTMLがめちゃくちゃです。
修正したコードを書こうかと思ったけど、あまりにも酷すぎます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/02 17:52

    わかってます。抜粋しただけです

    キャンセル

  • 2016/11/02 17:53 編集

    抜粋だとしてもおかしいですよ。

    ・body の中に form がない
    ・非推奨タグの使用
    ・fieldset の無駄な入れ子

    「わかっています」と後で、言い返すくらいなら、本題以外の部分で突っ込まれないように質問を書くくらいの配慮はしてください。

    キャンセル

0

$statement->execute()が失敗しているように思えます。
そのため、$rows[] = $row;が実行されず、<?php foreach($rows as $row){ ?>の箇所で$rowsなんてないよと言われているのではないでしょうか?
一度$statement->execute()の結果を見てみてはいかがですか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/02 17:57

    お返事ありがとうございます!!
    結果が ’false’でした。ちなみに初期化はどのようにした良いか教えていただけると幸いです;;
    お願い致します。

    キャンセル

  • 2016/11/02 19:15

    初期化自体は
    if($statement->execute())
    の前で
    $raws = array();
    で空配列を作ってやればいいです。
    ただ、それだと
    undefined variable rows
    は解決しますが、そもそもクエリ自体が投げれていない状態のようなので根本的な解決にはならないと思います。

    キャンセル

  • 2016/11/07 17:20

    結論から申し上げますと、
    'SQL文'のエラーでした。
    localhostのadminの"SQL"構文からSQLの有効性を確かめました。

    ご丁寧にご回答頂きまして有難うございます。

    キャンセル

-1

SQL分に使われている変数が展開されていないのでは?

http://osamushi.jp/php-variable-1/

 修正

すいません、完全流し読み、で検討違いな回答してました、スルーしてください。
'%$semina_year%'の部分ピンポイントでしかみてませんでした。。。。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/07 17:19

    結論から申し上げますと、
    'SQL文'のエラーでした。
    localhostのadminの"SQL"構文からSQLの有効性を確かめました。

    ご丁寧にご回答頂きまして有難うございます。

    キャンセル

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

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

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