「覚え間違い」を教えてください!

下記のように、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上で試していますが、エラーは出ておりません。


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

A 回答 (2件)

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



・今回の原因は#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 10:53
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/15 12:40

まず一つ


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

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

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

この回答への補足

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

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

補足日時:2011/06/30 10:54
    • good
    • 0
この回答へのお礼

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

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

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

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

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

お礼日時:2011/07/01 19:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報