みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHP+MySQL テーブルが表示されない

下記のように、MySQLのデータをPHPでテーブル形式で表示しています。






【PHP部分】
$check_sql = "SELECT * FROM table WHERE ( check1 LIKE '%東京%' OR check2 LIKE '%品川%' OR check3 LIKE '%%' ) AND hinichi > NOW( )";
$check_recordSet = mysql_query($check_sql);
$check_rows = mysql_num_rows($check_recordSet);

if($check_rows){
while($check_row = mysql_fetch_array($check_recordSet)) {
$checktable = "<tr>";
$checktable .= "<td>".$check_row["check1"]."</td><td>".$check_row["check2"].$check_row["check3"]."</td>";
$checktable .= "</tr>\n";
}
$msg = $check_rows."件みつかりました";
}


【HTML部分】

<?= $msg ?>

<table>
<?= $checktable ?>
</table>




$checktable が表示されないのですが、
どうも間違えている箇所がわかりません。

$msgは表示されます。
また、$check_sqlは、PHPMyAdmin上で試していますが、エラーは出ておりません。


ご存じの方いらっしゃいましたら、ご教授お願い致します。

投稿日時 - 2011-06-29 20:52:33

QNo.6843660

すぐに回答ほしいです

質問者が選んだベストアンサー

ダメなところを箇条書きで・・・

・今回の原因は#1で既出のとおり変数の上書でしょう

・SELECT *
トラブルのときにこれをやっている限り解決を難しくしています
オーバーヘッドを減らすためにも、今回の件であれば
「SELECT check1,check2,check3」とすべきです。

・OR check3 LIKE '%%'
これがある限り、全件出てくるので「check1 LIKE '%東京%' OR check2 LIKE '%品川%' 」
は無駄でしょう

・AND hinichi > NOW( )
前回も書きましたが、型の違うものを比較するのはトラブルのもとです
hinichiがdate型ならCURDATE()と比較すべきです
(日付の比較の際にはBETWEENでよくトラブルになります)

・if($check_rows){
これ自体余り効率化に寄与しません。むしろなくてよいでしょう。
もしクエリを回す前に事前チェックをしたいなら
同じWHERE句をつかったCOUNT(*)で件数をひっぱることです。

・<table><?= $checktable ?></table>
$checktableに戻り値がないときにHTMLの文法違反になります。
PHPのプログラム内でtableタグはつけてしまってください

投稿日時 - 2011-06-30 09:33:47

補足

前回に続き、ご丁寧にありがとうございます!!
全くわからないとこから、なんとか形にはなるよう勉強していて、
こんなに丁寧に指摘していただく方もいなかったので・・・
本当、ありがとうございます!!

早速、ご回答&その他ダメなとこ、別ページもいっぱいつかっているので…
見直します!

お礼の方は、試した後再度記入させていただきます!!

投稿日時 - 2011-06-30 10:53:23

お礼

ありがとうございました!!

投稿日時 - 2011-09-15 12:40:35

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

まず一つ
$checktable = "<tr>";
↑これでfetchで何件ループが回ろうともそれまでセットされたchecktableの内容が"<tr>"上書きされるため最後のレコードの内容しかテーブルの中身が作成されません。
$checktable .= "<tr>";
としてください。

また、$checktableが表示されないということですが出力された画面のソースは確認されましたか?
もしかして検索された一番最後のレコードはcheck1,2,3すべて空文字で<tr>,<td>だけ出力されているのかもしれません。
「check3 LIKE '%%'」 ですのでcheck3がNULLでなければ検索条件に該当することになります。
文字化けを起こしている可能性もあるかもしれません。

とりあえず本当にtable内部がソースにも出力されていないのかを確認してみてください。

投稿日時 - 2011-06-29 22:20:51

補足

ご丁寧にありがとうございます!!
本当、未熟者で、ダメなコードばかりで…
詳しくご指摘いただき、大変感謝しております!!

お礼の方は、試した後再度記入させていただきます!!

投稿日時 - 2011-06-30 10:54:57

お礼

>>とりあえず本当にtable内部がソースにも出力されていないのかを確認してみてください。

何も出力されておりませんでした。

>>check3がNULLでなければ検索条件に該当することになります。

NULLに設定しようとするとエラー#1067が出てしまって…、
こちら、データベースの方見直してみます!!

ありがとうございました!!

投稿日時 - 2011-07-01 19:51:38

あなたにオススメの質問