Mysqlとphpでソートや更新時の効率的な処理

このQ&Aのポイント
  • Mysqlとphpを使用して、カラムの作成日時と更新日時で効率的なソートや更新処理を行いたい。
  • 現在はphpでソート方法を選択するためにswitch文を使用しているが、スマートな方法はないか。
  • カラムの情報が変わった時に処理を追加したいが、パフォーマンスを考慮した処理方法は何が適しているか。
回答を見る
  • ベストアンサー

Mysqlとphpでソートや更新時の効率的な処理

カラムの作成日時と更新日時のそれぞれでソート、 作成日時当日はNEWの文字を入れる。というものを作りたいと思っています。 <?php $cer = "SELECT * FROM data_data WHERE 1"; function orderbyset($cul, $sc, &$cer){ $cer .= " ORDER BY ".$cul." ".$sc; } if(isset($_GET['orderby'])){ switch($_GET['orderby']){ case 'md_asc': orderbyset('modified_date','ASC',$cer); break; case 'md_desc': orderbyset('modified_date','DESC',$cer); break; case 'cd_asc': orderbyset('create_data','ASC',$cer); break; case 'cd_desc': orderbyset('create_data','DESC',$cer); break; } } $acc = mysql_connect(ホスト,ユーザー,パスワード); $que = mysql_query($cer,$acc); $html = ""; while($row = mysql_fetch_array($que)){ $id = $row["id"]; $name = $row["name"]; $modified_date = $row["modified_date"]; $create_data = $row["create_data"]; $daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24)); if($daydiff==0){$datatext = 'new';}else{$datatext='';} $html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n"; } ?> <html lang="ja"> <head> <title></title> </head> <body> <p>更新日時順<br /> <a href="data-sort.php?orderby=md_asc">昇順</a> <a href="data-sort.php?orderby=md_desc">降順</a> </p> <p>作成日時順<br /> <a href="data-sort.php?orderby=cd_asc">昇順</a> <a href="data-sort.php?orderby=cd_desc">降順</a> </p> <table><?php echo $html; ?></table> </body> </html> +---------------+-----------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-----------+------+-----+-------------------+-------+ | id | int(11) | NO | PRI | NULL | | | name | char(10) | NO | | NULL | | | modified_date | timestamp | NO | MUL | CURRENT_TIMESTAMP | | | create_data | timestamp | YES | MUL | NULL | | +---------------+-----------+------+-----+-------------------+-------+ modified_dateの属性にはon update CURRENT_TIMESTAMPを設定し、 カラムのデータを変えるとmodified_dateが更新され、create_dataはそのままです。 SELECT id,name,modified_date,create_data,IF(`create_data`>CURDATE() - INTERVAL 0 DAY,'NEW',DATE_FORMAT(`create_data`,'%Y/%m/%d')) AS `ddd` FROM `data_data` http://okwave.jp/qa/q3058491.htmlでの方法がありました。 $daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24)); if($daydiff==0){$datatext = 'new';}else{$datatext='';} 「あるカラムの情報が変わったら○○させる」といったことをいくつか追加していきたいので、 パフォーマンスが落ちることを少しでも避けるためにphpで処理するようにしましたが、一般的にはどちらを使うものなのでしょうか。 また、ifばかりにならないようにswitchを使ったのですが、ソートもいろいろ追加していきたく、そうなると今度はswitchが多くなってしまいます。 switchやifを使わずにスマートにやれる方法はないでしょうか。

  • PHP
  • 回答数2
  • ありがとう数2

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

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

なにかへん SQLでは作成日が今日ならNEW、PHPでは作成日が更新日ならNEW と書かれていませんか? 今回の場合ですとNEWを抜き出すロジックはSQLで処理する意味がありそうですが 集計とちがってSQLに特段の優位性があるわけではないので、 どちらでやっても有効性に差はないでしょう またソートも多段でおこなう必要がでてきたときにswitchは微妙ですね 多段でソートすることも想定するとこんな風にするとよいかもしれません <a href="?o%5Bx%5D=a&o%5By%5D=a&o%5Bz%5D=a">x昇順-y昇順-z昇順</a><br> <a href="?o%5Bx%5D=a&o%5By%5D=a&o%5Bz%5D=d">x昇順-y昇順-z降順</a><br> <a href="?o%5Bx%5D=d&o%5By%5D=a&o%5Bz%5D=a">x降順-y昇順-z昇順</a><br> <a href="?o%5Bx%5D=d&o%5By%5D=a&o%5Bz%5D=d">x降順-y昇順-z降順</a><br> <a href="?o%5Bx%5D=a&o%5By%5D=d&o%5Bz%5D=a">x昇順-y降順-z昇順</a><br> <a href="?o%5Bx%5D=a&o%5By%5D=d&o%5Bz%5D=d">x昇順-y降順-z降順</a><br> <a href="?o%5Bx%5D=d&o%5By%5D=d&o%5Bz%5D=a">x降順-y降順-z昇順</a><br> <a href="?o%5Bx%5D=d&o%5By%5D=d&o%5Bz%5D=d">x降順-y降順-z降順</a><br> <?PHP $orderby=""; if(isset($_GET["o"])){ $keylist=array("x"=>"xxx","y"=>"yyy","z"=>"zzz"); $vallist=array("a"=>"asc","d"=>"desc"); foreach($_GET["o"] as $key=>$val){ if(!in_array($key,array_keys($keylist)) or !in_array($val,array_keys($vallist))) continue; if($orderby!=="") $orderby.=","; $orderby.=" `".$keylist[$key]."` ".$vallist[$val]; } if($orderby!=="") $orderby="ORDER BY ".$orderby; } print $orderby; ?>

kiseki777
質問者

お礼

有難うございます。多段の場合の処理方法、とても参考になりました。 実現したいのは多段ではないですが、覚えておきます。 名前、番号、など計5種類くらいをソートしたいです。 > o%5Bx%5D=d&o%5By%5D=a&o%5Bz%5D=d o[x]=d & o[y]=a & o[z]=d こういうことですか。 特殊な文字を使うメリットってなんですか? >SQLでは作成日が今日ならNEW、PHPでは作成日が更新日ならNEW >と書かれていませんか? 更新日にしていたところをdate("Y-m-d G:i:s")にしてみました。 前回は日単位でしたが、data()だと秒単位で計算されるのですね。 このやり方が一般的ですか? アドバイスを参考にさせていただき、改善1と2をやってみました。 改善1はjavascriptがオフだと機能しなくなってしまいます。 改善2はjavascriptがオフのときは<noscript>でsubmitボタンを出して機能しますが、radioボタンになってしまいます。 radioボタンを使うことなくaタグで囲ってjavascript未対応でも機能すればいいですが・・・ 改善1と2どちらを選びますか? ■■■改善1■■■ <input type="hidden" name="d" value="md" /> <input type="hidden" name="c" value="asc" /> javascript未対応の方には更新日時順をascで。 <?php $cer = "SELECT * FROM data_data WHERE 1"; /*-------- PHPの改善箇所 ---------*/ if(isset($_GET['dd'])&&isset($_GET['sc'])){ $a = array("modified_date"=>"md", "create_data"=>"cd"); if(in_array($_GET['dd'], $a)){ foreach($a as $key => $value){ if($_GET['dd'] != $value) continue; $_GET['dd'] = $key; } } $cer .= " ORDER BY ".$_GET['dd']." ".$_GET['sc']; } /*--------------------------------*/ $acc = mysql_connect(ホスト,ユーザー,パスワード); $que = mysql_query($cer,$acc); $html = ""; while($row = mysql_fetch_array($que)){ $id = $row["id"]; $name = $row["name"]; $modified_date = $row["modified_date"]; $create_data = $row["create_data"]; $daydiff = floor((strtotime(date("Y-m-d G:i:s"))-strtotime($create_data))/(3600*24)); if($daydiff==0){$datatext = 'new';}else{$datatext='';} $html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n"; } ?> <html lang="ja"> <head> <title></title> </head> <body> <form name="formname" method="GET" action="data-sort-jssubmit.php"> <input type="hidden" name="dd" value="md" /> <input type="hidden" name="sc" value="desc" /> </form> <script type="text/javascript"> function sortchange(d,c){ var frm = document.forms['formname']; frm.dd.value = d; frm.sc.value = c; frm.submit(); } </script> <p>更新日時順<br /> <a href="javascript:sortchange('md','desc');">新着順</a> <a href="javascript:sortchange('md','asc');">古着順</a> </p> <p>作成日時順<br /> <a href="javascript:sortchange('cd','desc');">新着順</a> <a href="javascript:sortchange('cd','asc');">古着順</a> </p> <table><?php echo $html; ?></table> </body> </html> ■■■改善2■■■ <?php $cer = "SELECT * FROM data_data WHERE 1"; /*-------- PHPの改善箇所 ---------*/ if(isset($_GET['order'])){ list($d, $order) = explode("_", $_GET['order']); $a = array("modified_date"=>"md", "create_data"=>"cd"); if(in_array($d, $a)){ foreach($a as $key => $value){ if($d != $value) continue; $data = $key; } } $cer .= " ORDER BY ".$data." ".$order; } /*--------------------------------*/ $acc = mysql_connect(ホスト,ユーザー,パスワード); ~この間は前回・改善1と同じです~ $html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n"; } ?> <html lang="ja"> <head> <title></title> </head> <body> <form method="GET" action="data-sort-nametouitsu.php"> <p>更新日時順<br /> <input type="radio" name="order" value="md_desc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='md_desc') {echo 'checked ';} ?>/>新着順 <input type="radio" name="order" value="md_asc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='md_asc') {echo 'checked ';} ?>/>古着順 </p> <p>作成日時順<br /> <input type="radio" name="order" value="cd_desc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='cd_desc') {echo 'checked ';} ?>/>新着順 <input type="radio" name="order" value="cd_asc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='cd_asc') {echo 'checked ';} ?>/>古着順 </p> <noscript> <input type="submit" name="order" value="送信" /> </noscript> </form> <script type="text/javascript"> function sortchange(frm){ frm.submit(); } </script> <table><?php echo $html; ?></table> </body> </html>

その他の回答 (1)

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

>o[x]=d & o[y]=a & o[z]=d こういうことですか。 >特殊な文字を使うメリットってなんですか? PHPにパラメータを渡す上では多用されるテクニックですが o[x]=d&o[y]=a&o[z]=d で渡せば、$o=array("x"=>"d","y"=>"a","z"=>"d")という処理が 自動で処理されるのでかなり楽です 別の渡し方であればo=x_d+y_a+z_dみたいな処理でもよいですが 分解する処理が冗長になりがちです 改善の件については、好き嫌いがあるのでなんともいえませんが 作成日順と更新日時は同時にソートする必要はなさそうなので それぞれ、昇順-降順-なにもしない、の3つの選択肢にした方がよいかも ラジオボタン

kiseki777
質問者

お礼

もの凄く勉強になりました。 本当にありがとうございました。 こちらの質問文に画像の扱いを加えたものを試してみました。 見て頂けたらうれしいです。 http://oshiete.goo.ne.jp/qa/7522710.html

関連するQ&A

  • 掲載日と更新日の管理の仕方

    phpmyadminを使ってmysqlのデータを更新しています。 掲載日:2008年5月25日 更新日:2012年6月04日 というようにphpで表示し、掲載順、更新順といったソートをしたいと思っています。 phpmyadminで作ったテーブルは CREATE TABLE IF NOT EXISTS `data_data` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL, `modified_date` date NOT NULL, `create_date` date NOT NULL, PRIMARY KEY (`id`), KEY `modified_date` (`modified_date`,`create_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `data_data` (`id`, `name`, `modified_date`, `create_date`) VALUES (1, '23434', '2012-06-04', '2012-04-02'), (2, '464645', '2012-06-03', '2012-03-04'), (3, '940968', '2012-06-03', '2011-03-23'), ・・・ (15000, '940968', '2012-06-03', '2011-03-23'); のようになっています。 SELECT * from data_data ORDER BY modified_date DESC LIMIT 0,50; phpでこの構文で取得します。 ・更新日を手作業で指定し直さないといけない。 ・掲載日より前の日付で更新日を入ることができて、おかしくなってしまう。 といったことになってしまいます。 phpmyadminを使っている限り仕方がないのでしょうか。 たとえば、一流なサイトはどうやって掲載日・更新日を管理しているのしょうか。

    • ベストアンサー
    • PHP
  • MySQL + PHP 同じテーブル内でのクエリについて

    PHP+MySQL勉強中の初心者です。 PHP+MySQL環境でのクエリについて、以下の条件でのクエリ結果を求めたいのですが、上手くできませんので、質問させてください。 MySQLのテーブルは以下のようになっています。 date        no   name ---------------------------- 2009-12-10   15   takada 2009-12-15   10   hirooka 2009-12-18   13   wakada 2010-01-10   15   takada 2010-01-11   13   wakada ----------------------------- 出力させたいクエリは、前月データを元にno列をKEYとした重複チェックです。 前月データを全件出力し、当月データに同じnoがあった場合、当月日付を 表示させたいと思っています。 (PHPで希望する出力結果) date       no   name     date2 ---------------------------------------- 2009-12-10  15   takada   2010-01-10 2009-12-15  10   hirooka 2009-12-18  13   wakada   2010-01-11 ----------------------------------------- 以下のようなソースでは、1行のみの出力結果しか表示されず、 whileの使い方に問題があると思うのですが、どのように解決すれば良いのかが解りません。 どうか、解決策をよろしくお願いいたします。 $mysql->query("SELECT * FROM xxxx where date LIKE '$y-$m%'"); while($row = $mysql->fetch()){ $date = $row["date"]; $no = $row["no"]; $name = $row["name"]; $mysql->query("SELECT * FROM xxxx where upddate LIKE '$y2-$m2%' and no = '$no'"); while($row = $mysql->fetch()){ $date2 = $row["date"]; echo <<<EOT <td>$date</td> <td>$no</td> <td>$name</td> <td>$date2</td><tr> EOT; } }

    • 締切済み
    • PHP
  • PHP+MySqlでの検索

    検索ページから下記のソースに検索結果を表示させようと思っておりますが、スペース区切りにして検索をかけるとヒットしません。 こちらのソースのどの部分にどの様なSQL文を書けば実装出来ますでしょうか? 宜しくお願いします。 <?php require_once('Connections/tm.php'); ?> <?php if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { if (PHP_VERSION < 6) { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; } $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? doubleval($theValue) : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } } $colname_search = "-1"; if (isset($_GET['search'])) { $colname_search = $_GET['search']; } mysql_select_db($database_tm, $tm); $query_search = sprintf("SELECT * FROM posts WHERE title LIKE %s ORDER BY modified DESC", GetSQLValueString("%" . $colname_search . "%", "text")); $search = mysql_query($query_search, $tm) or die(mysql_error()); $row_search = mysql_fetch_assoc($search); $totalRows_search = mysql_num_rows($search); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無題ドキュメント</title> </head> <body> <table width="583" border="1"> <tr> <th width="82" scope="col">タイトル</th> <th width="113" scope="col">メッセージ</th> <th width="111" scope="col">開始時間</th> <th width="105" scope="col">名前</th> <th width="138" scope="col">詳細</th> </tr> <tr> <td height="20"><?php echo $row_search['title']; ?></td> <td><?php echo $row_search['message']; ?></td> <td><?php echo $row_search['modified']; ?></td> <td><?php echo $row_search['n_name']; ?></td> <td><a href="request_list.php?recordID=<?php echo $row_search['id']; ?>">詳細</a></td> </tr> </table> </body> </html> <?php mysql_free_result($search); ?>

    • ベストアンサー
    • MySQL
  • PHPでMySQLのストアドプロシージャを実行するには?

    こんにちは、この件でいろいろ検索していたのですが ストアドの作成まではできているのですが、PHPからの 実行のさせ方がわからず質問させていただきました。 環境は、PHP 5.2.9 + MySQL5.1.32 で MySQLでストアドプロシージャを作成して、実行できるのですが これをphpから実行させたいのですが、どのように記述すればよいのかわからず悩んでおります。 実行したいストアドは Gen_rank という名前でコンソールから実行できることは確認しています。 下記のようにしてみましたが、ストアドは走りませんでした。 <?php require_once("db_connect.php"); // クエリを送信する $sql = "call Gen_rank();"; $sql = "SELECT id, name, phonetic, age, s4, s9, rank FROM tmp_records ORDER BY rank"; $result = executeQuery($sql); // 結果セットの行数を取得する $rows = mysql_num_rows($result); // 表示するデータを作成 if($rows){  while($row = mysql_fetch_array($result)) {   $tempHtml .= "<tr>";   $tempHtml .= "<td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["phonetic"]."</td><td>".$row["age"]."</td><td>".$row["s4"]."</td><td>".$row["s9"]."</td><td>".$row["rank"]."</td>";   $tempHtml .= "</tr>\n"; }  $msg = $rows."件のデータがあります。"; }else{  $msg = "データがありません。"; } // 結果保持用メモリを開放する mysql_free_result($result); ?>

    • 締切済み
    • PHP
  • 時間の差分

    初めまして。 早速質問をさせていただきたいと思います。 postgresとPHPを使って開発中です。 postgresでは、timestamp without time zone型にデータを保存しております。 それを取得して、現在の時間との差分が1分以内だったら・・・という処理を したいのですが、mktime()を使ったり、strtotime()を使ったりして ためしたのですが、うまくいきません。 //$date → postgresから取得したtimestamp $diff = time() - strtotime($date); if ($diff < 60) {   ** 処理 ** } ご教授よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpとMysQLの連携がうまくいきません

    現在phpとmysqlを連携させて、phpのフォームから文字を入力してmysqlのデータベース上からマッチした検索結果を表示するプログラムを作っているのですがなかなかうまくいきません・・・ お手数ですが詳しい方解答お願いいたします。 <html> <head> <title>PHP SEARCH RESULT</title> <meta http-equiv="Content-type" content="text/html;charset=utf-8"> </head> <body> <? $debug = false; //DB接続 mysql_connect("localhost","root","c0106426"); mysql_select_db("network"); if($debug) print_r($HTTP_POST_VARS); //エラーチェック //リクエストメソッドチェック if($REQUEST_METHOD != "POST") { print "Error: invalid method"; exit(); } //クエリ生成 $query = "SELECT * FROM yougo "; //検索条件生成 //用語 if(!empty($yougo)) { $yougo = yougo($yougo); $where .= "yougo REGEXP '$yougo' && "; } if(!empty($where)) { $where = substr($where, 0, -4); $where = "WHERE " . $where; } $result = mysql_query($query); $num_rows = mysql_num_rows($result); if($num_rows == 0) $message = "該当するデータはありませんでした"; else $message = $num_rows . "件ヒットしました"; ?> 検索結果<br> <?=$message?> <table border=1> <tr><td>用語</td><td>説明</td><td>講義回数</td></tr> <? while($row = mysql_fetch_assoc($result)): ?> <tr><td><?=$row[yougo]?></td><td><?=$row[sestumei]?></td><td><?=$row[kougi]?></td></tr> <? endwhile; ?> </table> <a href="search.html">再検索</a> </body> </html> このようなプログラムを書いているのですがうまく動作しません。。。 フォームからはyougoという形でpostで値をこのphpプログラムに渡しています。 データベースはnetworkという名前で テーブルはyougoid,yougo,sestumei,yomi,kougi,kai というテーブルがありまして yougoの文字を文字入力で検索して yougo,sestumei,kougi内の内容をテーブルで表示させたいのですが、 どうしてもうまくいきません。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHPでのMYSQL接続のデータ表示

    PHPのバージョンは4.2.3です。 index.php という一覧表示画面から 一意なKey文字列を受け取りそのデータに合致する データの詳細を表示する画面です。 実データ部分が表示されず困っています。 実行時のPHPのエラーも出力されないので いまいちどこが悪いのかわかりません アドバイスよろしくお願いします。 <?php require_once( "common.php" ); require_once( "const.php" ); if(! $conn = mysql_connect( 'ホスト名','ユーザー名','PASS')){ die( 'MYSQL接続失敗'); } $sql = ""; $sql .= "select * from LIVE "; $sql .= "ORDER BY Date DESC "; $sql .= "WHERE ID=".$_REQUEST[ "KEY" ]; echo $sql; mysql_select_db("DB名",$conn); $rs = mysql_query($sql, $conn); $DATE=$rs['DATE']; $TITLE=$rs['TITLE']; $PLACE=$rs['PLACE']; $ARTIST=$rs['ARTIST']; echo $DATE; echo $TITLE; echo $PLACE; echo $ARTIST; //$rec = mysql_fetch_array( $rs, MYSQL_ASSOC ); ?> <HTML> <HEAD><TITLE>ライブ予定</TITLE></HEAD> <BODY><H1 ALIGN="CENTER">ライブ予定詳細</H1> <A HREF="./">戻る</A> <TABLE BORDER="1" ALIGN="CENTER" WIDTH="100%"> <TR><TD BGCOLOR="#FFFFCC">日付</TD> <TD><?php HESC($rec['DATE']) ?></TD></TR> <TR><TD BGCOLOR="#FFFFCC">タイトル</TD> <TD><?php HESC($rec['TITLE']) ?></TD></TR> <TR><TD BGCOLOR="#FFFFCC">場所</TD> <TD><?php HESC($rec['PLACE']) ?></TD></TR> <TR><TD BGCOLOR="#FFFFCC">アーティスト</TD> <TD><?php HESC($rec['ARTIST']) ?></TD></TR> <TR><TD BGCOLOR="#FFFFCC">本文</TD> <TD></TD></TR> </TABLE> </BODY></HTML>

    • ベストアンサー
    • PHP
  • php+mysql

    $query = 'SELECT * FROM test'; $res = mysql_query($query,$link); $data = array(); var_dump($res); val_dunpを使い確認したところ bool(false) >となってしまい失敗します falseに返さないようにするにはどうしたらいいでしょうか? 簡易掲示板作成 タイトル 本文記載後下にタイトル 本文 書き込み日時が 書き込まれていく仕組みです <?php $link = mysql_connect('localhost','user','pass','dbname'); if ( $link !==false) { $msg =''; $err_msg =''; if ( isset( $_POST['send'] )=== true) { $subject =$_POST['subject']; $honbun =$_POST['honbun']; if ( $subject !=='' && $honbun !=='' ) { $query = " INSERT INTO test ( " ."subject," ."honbun," .") VALUES ( " . "'" . mysql_real_escape_string( $link, $subject ) ."', " . "'" . mysql_real_escape_string( $link, $honbun ) . "'" ." ) "; $kakikomi = date('Y-m-d h:i:s'); $res = mysql_query($link,$query); if ($res !==false) { $msg = '書き込みに成功しました。'; }else{ $err_msg = '書き込みに失敗しました。'; } }else{ $err_msg = 'タイトルと本文を書き込んで下さい。'; } } $query = 'SELECT * FROM test'; $res = mysql_query($query,$link); $data = array(); var_dump($res); if ($res) { while($row = mysql_fetch_assoc($res)) { array_push($data,$row); } } arsort($data); }else{ echo"データベースの接続に失敗しました"; } mysql_close($link); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF8;" /> </head> <body>> <table border="1"> <form action="test6.php" method="POST"> <tr><th>タイトル<td><input type="text" name="text" size="50"></td></tr> <tr><th>本文<td><textarea name="subject" cols="52" rows="8"></textarea> <tr><td><input type="submit" value="保存 する" /></td><tr> </table> </form> <?php if ($msg !=='')echo'<p>'.$msg.'</p>'; if ($err_msg !=='')echo'<p style="color:#f00;">'.$err_msg.'</p>'; foreach($data as $key =>$val) { echo $val['subject'].''.$val['honbun'].'<br>'; } ?> </body> </html>

    • ベストアンサー
    • MySQL
  • php+mysql

    Warning: mysql_query() expects parameter 1 to be string, resource given in C:\xampp\htdocs\phptest\test6.php on line 30 Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given in C:\xampp\htdocs\phptest\test6.php on line 32 このようなエラーが出てしまいます line30 $res = mysql_query($link,$query); line32 while($row = mysql_fetch_assoc($res)) { 戻り値がおかしいのでしょうか? 下の分の falseを使っているところが問題なんでしょうか? <?php $link = mysql_connect('localhost','ogawa','taku1106','ogawa'); if ( $link !==false) { $msg =''; $err_msg =''; if ( isset( $_POST['send'] )=== true) { $subject =$_POST['subject']; $honbun =$_POST['honbun']; if ( $subject !=='' && $honbun !=='' ) { $query = " INSERT INTO ogawa ( " ."subject," ."honbun," .") VALUES ( " . "'" . mysqli_real_escape_string( $link, $subject ) ."', " . "'" . mysqli_real_escape_string( $link, $honbun ) . "'" ." ) "; $kakikomi = date('Y-m-d h:i:s'); $res = mysqli_query($link,$query); if ($res !==false) { $msg = '書き込みに成功しました。'; }else{ $err_msg = '書き込みに失敗しました。'; } }else{ $err_msg = 'タイトルと本文を書き込んで下さい。'; } } $query = "SELECT id,subject,honbun,kakikomi FROM ogawa"; $res = mysql_query($link,$query); $data = array(); while($row = mysql_fetch_assoc($res)) { array_push($data,$row); } arsort($data); }else{ echo"データベースの接続に失敗しました"; } mysql_close($link); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF8;" /> </head> <body>> <table border="1"> <form action="test6.php" method="POST"> <tr><th>タイトル<td><input type="text" name="text" size="50"></td></tr> <tr><th>本文<td><textarea name="subject" cols="52" rows="8"></textarea> <tr><td><input type="submit" value="保存 する" /></td><tr> </table> </form> <?php if ($msg !=='')echo'<p>'.$msg.'</p>'; if ($err_msg !=='')echo'<p style="color:#f00;">'.$err_msg.'</p>'; foreach($data as $key =>$val) { echo $val['subject'].''.$val['honbun'].'<br>'; } ?> </body> </html>

  • php+mysql

    phpからdbに簡易掲示板作成 タイトル、本文書き込み後入力データを下に表示 タイトル 本文 書き込み日時 このように表示させるようにしてますが if ( isset( $_POST['send'] )===true { ここでエラーが出てしまいます。 何が違うのか助言お願いします。 DB側テーブル構成 id subject honbun kakikomi です <?php $link = mysql_connect('localhost','ogawa','taku1106','ogawa'); if ( $link !==false) { $msg =''; $err_msg =''; if ( isset( $_POST['send'] )===true { $subject =$_POST['subject']; $honbun =$_POST['honbun']; $kakikomi =$_PSOST['kakikomi']; if ( $subject !=='' && $honbun !=='' && $kakikomi !=='' ) { $query = " INSERT INTO ogawa ( " ."subject," ."honbun," ."kakikomi" .") VALUES ( " . "'" . mysqli_real_escape_string( $link, $subject ) ."', " . "'" . mysqli_real_escape_string( $link, $honbun ) . "'," . "'" . mysqli_real_eacape_string( $link, $kakikomi) . "'" ." ) "; $kakikomi = date('Y-m-d h:i:s'); $res = mysqli_query($link,$query); if ($res !==false) { $msg = '書き込みに成功しました。'; }else{ $err_msg = '書き込みに失敗しました。'; } }else{ $err_msg = 'タイトルと本文を書き込んで下さい。'; } } $query = "SELECT id,subject,honbun,kakikomi FROM ogawa"; $res = mysql_query($link,$query); $data = array(); while($row = mysql_fetch_assoc($res)) { array_push($data,$row); } arsort($data); }else{ echo"データベースの接続に失敗しました"; } mysql_close($link); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF8;" /> </head> <body>> <table border="1"> <form action="test6.php" method="POST"> <tr><th>タイトル<td><input type="text" name="text" size="50"></td></tr> <tr><th>本文<td><textarea name="subject" cols="52" rows="8"></textarea> <tr><td><input type="submit" value="保存 する" /></td><tr> </table> </form> <?php if ($msg !=='')echo'<p>'.$msg.'</p>'; if ($err_msg !=='')echo'<p style="color:#f00;">'.$err_msg.'</p>'; foreach($data as $key =>$val) { echo $val['subject'].''.$val['honbun'].''.$val['kakikomi'].'<br>'; } ?> </body> </html>

    • ベストアンサー
    • MySQL

専門家に質問してみよう