• ベストアンサー

php+mysql sql文実行について

データベースに「日付」「文章」を登録し、今日の日付に対応した文章が表示される仕組み(正確には朝の5時に変更)を作りたいと考えております。 以前は日付をタイトルとしたtxtファイルを作成し、その中身を読み込ませる仕組みだったのですが、今回mysqlを使用して同様のものを作成できればと思い試行錯誤しております。 データベースは 「maxim」というテーブルの中に、 date   main 071018 (文章)  071019 (文章) 071020 (文章) 071021 (文章) のように格納してあります。 date:主キー、varchar(6)、not null main:text、not null 作成したスクリプトは以下の通りですが、これを実行すると「エラー」が表示されてしまいます。 $dateによる文字列の取得、DBへの接続までは、echo、or dieにて確認済、またsql文をphpMyadminから実行した場合($dateを071018に書き換えて)、こちらも正常に取得できたのですが。 $dateをsql文に記述する際の囲みの問題かとも思い、「''」や「()」や「[]」で囲ってもみたのですがだめでした。 どなたかお知恵を拝借できますでしょうか。 宜しくお願い致します。 *サーバー、mysqlはともに「ロリポップ」を使用しております。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>テスト</title> </head> <body> <?php $date=strftime("%y%m%d",time()-5*3600); $server="mysql**.***.jp"; $dbname="********"; $user="********"; $pass="*****"; $conn = mysql_connect($server,$user,$pass); $sql="SELECT main FROM maxim WHERE date = '$date'"; $res=mysql_query($sql,$conn) or die("エラー"); echo "<b>$res</b>"; mysql_close($conn); ?> </body> </html>

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

  • ベストアンサー
  • wp_
  • ベストアンサー率54% (132/242)
回答No.3

DBが選択されていません。 $conn = mysql_connect($server,$user,$pass); ↓ $conn = mysql_connect($server,$user,$pass); mysql_select_db($dbname,$conn); // ←これが足らない ---------------------------------- echo "<b>$res</b>"; $resはmysqlリソースが入ってます。実データではないです。 // リソースとは接続IDみたいなものと捉えるといいです。違いますけど。 $ret = array(); // 実データのバッファ while($row = mysql_fetch_assoc($conn)) {  $row_date = $row["date"];  $row_main = $row["main"];  $ret[$row_date] = $row_main; } print_r($ret); 上記のようにしないと実データは取れません。 mysql_fetch_assoc関数がキモです。 ------ あと蛇足ですが、日付は文字列でなくdate型で格納し、 mysqlのdate_format関数などでこねくり回したほうがよいです。 「そういう仕様」と決め付けられる環境にあるならいいですが^^;

その他の回答 (4)

  • wp_
  • ベストアンサー率54% (132/242)
回答No.5

>ちなみに、返ってくるレコードは1つだけなのですが、この場合には直接echoしてしまってよろしいのでしょうか? 一レコードという大前提が絶対100%確実に揺るがないのであれば問題ないです。 ただ、その場合はNo.1の方の言うとおりLIMIT文を追加し取得するレコード数を制限したり GROUP BYを用いて取得するレコードを単一にしたりするなどの工夫をしたほうがよい、かも知れません。 とりあえず動けばいいや、と言った感じれあれば改修の必要はありません^^; >また、データ形式をdate型にした場合のメリットなど、お教えいただけると幸いです。 もしもチーム開発をすることになった場合、おそらく先輩プログラマに小一時間説教を食らうでしょうorz 当方派遣なのですが、アホ設計した正社員にお説教したら飲みで逆襲されましたがそれは別の話。 メリットとしては ・他人との共有が容易 ・範囲指定の抽出が明示的で読みやすい ・入力の際、文字列型と違い不正入力に厳密(AAAA年BB月禿日とかは絶対に入らない) と言った感じですね。 もしそのカラムに日付以外の文字列も入る可能性がある、というのであれば フラグ用のカラムを追加するなどの対応が正しいです。 string型でこういうフォーマットで入る、というような独自仕様は他人だけでなく未来の自分すら混乱させます。 csv型やiniファイル的な「一般的なもの」であれば問題はないのですが。 >甘えすぎですかね? 知ろうとすることは良いことだとおもいますよ。 大切なのは自分が知りたいことに対して無知であることを自覚することです。 それと知りたいことに対して貪欲であることです。 ・・・受け売りですが

nori1969
質問者

お礼

またしてもお礼が遅くなり申し訳ございません。 分かりやすく丁寧な解説に感謝いたします。 本当に有難く思っております。 (1)レコードは1つのみですので、LIMIT文を追加する方向で改善してみます。 (2)データ形式につきましては、確かに仰る通りですね。 これを作る際に、「他人との共有」「継続的な仕様」という概念が欠けていたように思い、反省しております。 date型というものがある以上、日付はこの型に変更いたします。 厚かましい甘えにも応えてくださり、ありがとうございました。 こういった質問の場で、快く回答してくださる方がいらっしゃるのはとても心強く、また温かい気持ちになります。 いつか私も恩返しできるよう、勉強を続けてゆきたいと思います。

  • wp_
  • ベストアンサー率54% (132/242)
回答No.4

ソースミスった。すんまそん。 mysql_fetch_assocの引数はクエリリソースを渡してあげてください。 // 帰ってくるレコードがひとつだけという前提ならばwhileする必要はないです。 while($row = mysql_fetch_assoc($conn)) { ↓   while($row = mysql_fetch_assoc($res)) {

nori1969
質問者

お礼

お礼が遅くなり、申し訳ございません。 No3と併せて、大変参考となるアドバイスをありがとうございます。 (1)データベース接続の不備 (2)配列への格納 いずれも具体的なソースをいただき、また、訂正もいただき、感謝いたします。 お陰様で以下のようなスクリプトで意図した通りに動作させることができました。 重ね重ね感謝いたします。 ちなみに、返ってくるレコードは1つだけなのですが、この場合には直接echoしてしまってよろしいのでしょうか? もしお時間あればご教授願えるとありがたいです。 また、データ形式をdate型にした場合のメリットなど、お教えいただけると幸いです。 甘えすぎですかね? <?php $date=strftime("%y%m%d",time()-5*3600); $server="mysql**.***.jp"; $dbname="********"; $user="********"; $pass="*****"; $conn = mysql_connect($server,$user,$pass); $conndb = mysql_select_db($dbname); $sql="SELECT main FROM maxim WHERE date = $date"; $res=mysql_query($sql); while($row = mysql_fetch_assoc($res)) { $row_con=mb_convert_encoding($row["main"], "shift_jis", "auto"); echo $row_con; } mysql_close($conn); ?>

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

WHERE date = '$date' とありますが WHERE `date` = '$date' としてみてはいかがですか?

nori1969
質問者

お礼

お礼が遅くなり、申し訳ございません。 (1)WHERE指定が均一でない点 参考にさせていただき、逆に''を外してみました。 No1の方へのお礼と重複しますが、以下のスクリプトで意図した通りに動作させることが出来ました。 ありがとうございます。 また機会がありましたら、ご教授いただきたいと思います。 よろしくお願い致します。 <?php $date=strftime("%y%m%d",time()-5*3600); $server="mysql**.***.jp"; $dbname="********"; $user="********"; $pass="*****"; $conn = mysql_connect($server,$user,$pass); $conndb = mysql_select_db($dbname); $sql="SELECT main FROM maxim WHERE date = $date"; $res=mysql_query($sql); while($row = mysql_fetch_assoc($res)) { $row_con=mb_convert_encoding($row["main"], "shift_jis", "auto"); echo $row_con; } mysql_close($conn); ?>

  • giraffa96
  • ベストアンサー率70% (106/150)
回答No.1

試していませんが、ざっと見た感じ $dbnameがどこにも使われていないですね。 とりあえずif(!$conn){//MySQL接続エラー}、とした上で $conndb = mysql_select_db($dbname); if(!$conndb){//DB接続エラー} ここまでやってMySQLとDBに接続完了です。 mysql_queryにmysql_connectは渡せないのではないかな? http://jp.php.net/manual/ja/function.mysql-query.php なのでクエリ発行の中ではSQL文のみ渡して下さい。 ついでに、クエリ発行しただけだと echo "<b>$res</b>"; だけでは結果が得られません。 mysql_resultかmysql_fetch_rowなどで 中身を配列に入れてから表示させてみてください。 もう一個… echo "<b>$res</b>"; だと$resも<b></b>と同じように ダブルクォーテーションで囲んでしまってるので、 これもこのままでは表示されないと思います。 変数部分を".."で囲むか、別にechoしてあげてください。 細かく言うとLIMIT 1しておいたほうが良いかなぁとか 色々ちょこちょこありますが、 とりあえずここまでやれば動くかと思います。

nori1969
質問者

お礼

お礼が遅くなり、申し訳ございません。 (1)データベースが指定されていない点 (2)mysql_query()中にクエリ文が使用されている点 (3)配列に格納されていない点 (4)echoの指定がおかしい点 いずれも参考にさせていただき、改善を行いました。 結果、以下のようなスクリプトでようやく意図した通り動作させることができました。 ありがとうございます。 本当に助かりました。 「LIMIT1」というのはロックをかけるという意味でしょうか。 お時間ございましたら、ぜひご教授願います。 <?php $date=strftime("%y%m%d",time()-5*3600); $server="mysql**.***.jp"; $dbname="********"; $user="********"; $pass="*****"; $conn = mysql_connect($server,$user,$pass); $conndb = mysql_select_db($dbname); $sql="SELECT main FROM maxim WHERE date = $date"; $res=mysql_query($sql); while($row = mysql_fetch_assoc($res)) { $row_con=mb_convert_encoding($row["main"], "shift_jis", "auto"); echo $row_con; } mysql_close($conn); ?>

関連するQ&A

専門家に質問してみよう