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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

1602閲覧

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

pomi

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/11/02 05:40

*質問*
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>

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

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

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

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

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

terminator

2016/11/02 09:43

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

回答4

0

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

投稿2016/11/02 08:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pomi

2016/11/02 08:52

わかってます。抜粋しただけです
退会済みユーザー

退会済みユーザー

2016/11/02 09:24 編集

抜粋だとしてもおかしいですよ。 ・body の中に form がない ・非推奨タグの使用 ・fieldset の無駄な入れ子 「わかっています」と後で、言い返すくらいなら、本題以外の部分で突っ込まれないように質問を書くくらいの配慮はしてください。
guest

0

ベストアンサー

クエリが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 );

投稿2016/11/02 09:59

編集2016/11/02 10:06
kurori

総合スコア111

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

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

0

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

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

修正

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

投稿2016/11/02 06:04

編集2016/11/02 10:23
hiim

総合スコア1689

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

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

pomi

2016/11/07 08:19

結論から申し上げますと、 'SQL文'のエラーでした。 localhostのadminの"SQL"構文からSQLの有効性を確かめました。 ご丁寧にご回答頂きまして有難うございます。
guest

0

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

投稿2016/11/02 05:52

編集2016/11/02 05:53
wakame_taishi

総合スコア73

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

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

pomi

2016/11/02 05:55

ご解答有難うございます。 具体的にどのように結果を確認したらよいか ご教授いただけると幸いです。
wakame_taishi

2016/11/02 05:59

var_dump($statement->execute())すれば、trueかfalseか返却されるはずです。これがfalseだと$rawsは初期化されていないはずです。
pomi

2016/11/02 08:57

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

2016/11/02 10:15

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

2016/11/07 08:20

結論から申し上げますと、 'SQL文'のエラーでした。 localhostのadminの"SQL"構文からSQLの有効性を確かめました。 ご丁寧にご回答頂きまして有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問