PHPについて質問です。


SQLのSELECT文について質問したいことがあるのですが、以下がMYSQLの情報とするとします。

http://oskuni7.sakura.ne.jp/hatena/question/question.htm

この中でid2番目のaddress 東京都を抽出したいときはどのようにすればよろしいでしょうか。
(データ2行目のフィールドがaddressの部分を抜き出すという形で抜き出したいのですが可能でしょうか?)

この後行いたいことですが、HTMLのヴィジュアルに対してこのデータを反映し、また変更できる場所をHTML上に設けてSUBMITボタンを押すとSQLのデータが変わり、そしてSQLで変更されたデータまたHTMLに反映されるという流れを作成したいと考えています。

しかし、このやりかたで行う場合ですがデータが100程あり一個ずつSELECT文を指定していると600個設定しないといけなくなるのですが何か良い方法等はありますでしょうか?

詳しい方おられましたらどうぞよろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:2009/02/26 12:15:24
  • 終了:2009/03/01 23:46:54

ベストアンサー

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/02/26 12:33:31

ポイント50pt

「id2番目のaddress 東京都を抽出」とは、どういう意味でしょうか。


addressカラムの値が "東京都" であるレコードを抽出するという意味なら、以下のような SQL 文になります。(hogeは対象テーブルの名前)

select * from hoge where address="東京都";

idカラムの値が "CL2" であるレコードの address カラムのみを抽出するという意味なら、以下のような SQL 文になります。

select address from hoge where id="CL2";

このやりかたで行う場合ですがデータが100程あり一個ずつSELECT文を指定していると600個設定しないといけなくなるのですが何か良い方法等はありますでしょうか?

対象レコードの抽出は、上記の SQL 文で行いますから、SELECT 文は1回の発行で済みます。

表示内容は、あらかじめ PHP の連想配列に格納しておきます。

次に、変更内容をその連想配列に格納していき、変更があった配列のみを UPDATE 文で DB に反映させます。UPDATE 文は変更レコード1つにつき1回発行することになるので、変更レコードが100あれば、100回発行することになります。600回もSELECT文を実行する必要はありません。

id:aiomock

ご回答ありがとうございます。

2009/02/26 12:42:38

その他の回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/02/26 12:33:31ここでベストアンサー

ポイント50pt

「id2番目のaddress 東京都を抽出」とは、どういう意味でしょうか。


addressカラムの値が "東京都" であるレコードを抽出するという意味なら、以下のような SQL 文になります。(hogeは対象テーブルの名前)

select * from hoge where address="東京都";

idカラムの値が "CL2" であるレコードの address カラムのみを抽出するという意味なら、以下のような SQL 文になります。

select address from hoge where id="CL2";

このやりかたで行う場合ですがデータが100程あり一個ずつSELECT文を指定していると600個設定しないといけなくなるのですが何か良い方法等はありますでしょうか?

対象レコードの抽出は、上記の SQL 文で行いますから、SELECT 文は1回の発行で済みます。

表示内容は、あらかじめ PHP の連想配列に格納しておきます。

次に、変更内容をその連想配列に格納していき、変更があった配列のみを UPDATE 文で DB に反映させます。UPDATE 文は変更レコード1つにつき1回発行することになるので、変更レコードが100あれば、100回発行することになります。600回もSELECT文を実行する必要はありません。

id:aiomock

ご回答ありがとうございます。

2009/02/26 12:42:38
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/02/27 07:02:25

ポイント50pt

PHPのプログラム上でSELECT文を実行したところ

Resource id #2

というわけの分からない文字がページに表記されます。

エラーではありません。

ご質問のソースではmysql_query関数の戻り値(リソースID)である "Resource id #2" を表示しているので、それは正常です。


ソースの "echo $sql" 以降の部分ですが、それでは select したテーブルの内容が表示されません。下記のようにしてみてください。(このサンプルでは、コメントにあったHTML部分は反映していません)


echo <<< EOF
<html>
<head>
<meta content="text/html;charset=Shift_JIS" http-equiv="Content-Type">
<title>test</title>
</head>
<body>
<table border="1">

EOF;

//SELECT文の実行
$sql = 'select address from TEST where id="CL2";';
if (!$sql) {
    echo "<font color=\"red\">クエリ送信エラー<br>再度登録してください。</font><br> ";
    exit();
}

//データの取り出し・表示
$res = mysql_query($sql);

while ($row = mysql_fetch_array($res)) {
echo <<< EOF
<tr>
<td>{$row["id"]}</td>
<td>{$row["name"]}</td>
<td>{$row["sex"]}</td>
<td>{$row["address"]}</td>
<td>{$row["tel"]}</td>
<td>{$row["information"]}</td>
</td>
</tr>

EOF;
}

//接続の終了・遮断
mysql_close($db_Handle);

echo <<< EOF
</table>
</body>
</html>

EOF;

id:aiomock

ご回答ありがとうございます。

2009/02/27 14:54:34
id:shiroxcom No.3

しろっくす回答回数140ベストアンサー獲得回数52009/02/27 11:03:44

ポイント100pt

まずこちらの本がものすごくおすすめです。

僕もこの本から勉強しました。

http://www.amazon.co.jp/MySQL%E5%85%A5%E9%96%80%E4%BB%A5%E5%89%8...

id:aiomock

ご回答ありがとうございます。購入してみようと思います。

2009/02/27 14:57:09
  • id:Mook
    WEB のインタフェースは何を使って構築するのでしょうか。
  • id:kn1967
    あいもかわらず理解力に乏しい回答を繰り返す人もおられるようですが・・・
    600回は必要あるとかないとかいう回答が欲しいのではなくて
    「HTMLのヴィジュアル」という表現からして
    ブラウザ上にExcelのシートやAccessの帳票フォーム同様のものを構築したくて
    その方法を聞いておられるのでしょう。

    さて、その方法についてですが概要だけなのでコメント欄に書きます。

    >変更できる場所をHTML上に設けて
    >SUBMITボタンを押す
    Excelのようにクリックして変更できるようにするとなると
    クライアントサイドスクリプトで対処しなければならず大変ですが
    表とは別に変更できる場所を設けるならば
    「変更したいidとフィールドのコンボボックス」と
    「変更内容を入力するテキストボックス」を用意すると良いかもしれません。

    >SQLのデータが変わり
    submitされたデータを受け取ってDBに書き込むのはphpなら簡単ですよね。
    ・・・とは言ったものの、どの程度phpを理解しておられるのか存じませんが・・・。

    >SQLで変更されたデータまたHTMLに反映される
    Ajax的なもので「DBに書き込むphpプログラム」を実行させて、結果を得て
    ブラウザ上の関係箇所だけを再描画する事も可能ではありますが正直面倒です。
    1番簡単で確実なのはHTMLを再表示することです。
    そうすれば、HTMLファイル(=phpファイル)は1つで済みますし
    更新の正否だけでなく、多人数で操作する場合なども含めて
    最新状態のデータを得ることができます。

    ステップとしては
    (1)一覧表を作成するphpを作る
    (2)phpに前述したフォームを付加し
      フォームの内容に応じてDB書き換え後
      一覧表を作成するように変更する。
    その先のステップとして興味があれば
    (3)DB書き換え部分を別のphpとして分離し
      元のphpはAjaxでDB書き換えphpを呼び出すように改造する。

    AjaxでExcelのシートみたいに扱うサンプル的なものも
    いくつかあったと思うのですが、探す気力が無いので勘弁してください。
    (そこまでやる気があれば、コメント欄よごしではなく回答欄に書いてます。)

    最後になりますが、どこまでのものを求めるのかによって
    自分の苦労は幾何級数的に増えると考えておいたほうがよろしいかもしれません。
  • id:aiomock
    Mook さん

    ご回答ありがとうございます。

    インターフェイスはPHPを使用します。
  • id:aiomock
    kn1967 さん

    ご回答ありがとうございます。

    >「変更したいidとフィールドのコンボボックス」と
    「変更内容を入力するテキストボックス」を用意すると良いかもしれません。

    非常に参考になりました。

    現在サンプルを作成しているのですが、是非アイデアを使わせていただきます。
  • id:aiomock
    現在サンプルを作成しております。

    ページ:http://oskuni7.sakura.ne.jp/test.php
    コード:http://oskuni7.sakura.ne.jp/test.phps

    現在途中段階なのですが、

    SELECT文を使用してデータの抜き取りができない状況になっています。

    PHPのプログラム上でSELECT文を実行したところ

    Resource id #2

    というわけの分からない文字がページに表記されます。

    MYSQLのサーバーからデータを落としたことがないので、どのようにしてデータが取り込めるのかまったく掴めないのですが、このエラーにはどのように対処すればよろしいのでしょうか。

    詳しい方おりましたらよろしくお願いいたします。
  • id:kn1967
    サイトは見てませんが・・・

    >インターフェイスはPHPを使用します。

    phpはサーバ上の話ですよね。
    Mook氏は、クライアント(パソコン側)では
    どのようなソフトや言語などを使うのかと聞いておられるのですよ。
    (私はIEなどのブラウザだと勝手に解釈してますが・・・)

    >Resource id #2

    それはSQLが正しく実行されたという証なので、その次に、
    実行結果を取得するコマンド(mysql_fetch_で始まるもの)を利用する必要があります。

    例えば、こんな感じで・・・
    if ($result = mysql_query(略)) {
      while ($1行分 = mysql_fetch_assoc($result)) {
        echo $1行分['id'];
        echo $1行分['name'];
        echo $1行分['address'];
          以下略
      }
    }
    コードは適当に書いてますので、あくまでも説明用として受け取ってください。


    いちいち、お聞きになるのも結構ですが php入門的なサイトや書籍などで、
    人の書いたphp掲示板などを紐解いたほうが格段に早いと思います。
  • id:Mook
    コメント書いている間に、kn1967さんが既にコメントされていましたが、そのままアップします。


    全体は見ていませんが、
    echo $sql;
    では、中身は出ません。

    $sql=mysql_query("select * from sample1;");
    while ($row = mysql_fetch_array($sql, MYSQL_NUM)) {
    printf("address : %s<br>\n", $row[0] );
    }

    のように、中身を取り出す必要があります。

    このあたり、PHPはお手軽と言ってもプログラムなので、適当では動作しませんので、
    マニュアル等を確認して正しく書く必要があります。
    http://www.php.net/manual/ja/function.mysql-fetch-array.php

    このレベルだと、ちょっと質問を繰り返すだけでは完成まで遠そうです。
    一応全体の流れまで理解、テストできた状態で「ここがうまくいかないんだけど・・・」
    というのなら質問は有効だと思いますが。
  • id:Mook
    ちょっと上記だけでは、不親切なので全体の流れを補足です。

    おおよそは kn1967 さんが書かれていますが、
    WEB 上で登録したいデータを入力、変更した後 SUBMIT ボタンを押しますが、通常はそのフォームで指定
    されているアクションが実行されます。まず、これがありません。

    WEB での編集は 通常のHTML タグでもよいですし、JavaScript 等を使用して動的に処理してもよいですが、
    結果をSUBMIT で受け取ったCGI(今回はPHP)がどの情報化識別できるよう、名前やIDをつけて管理します。

    FORM の情報を受け取ったCGIは、要求に応じて処理を行います。
    この処理がデータの登録、データの更新、データの選択だったりするわけです。

    処理が終わったら、CGI は結果の表示や、次の処理を行うための画面(HTML)を生成します。これがクライアント
    側に表示され、ユーザは次の処理を行うことができます。
    このような繰り返しによって、クライアント(ユーザ)は、WEBを通じてデータの処理ができるわけです。

    一点気になるのは、この WEB を一般のサーバに置くつもりでしょうか。
    誰もがアクセスできる場所に置くということは、誰でもデータを見たり操作できてしまうということです。
    今回特にDBへアクセスするための情報は CGI 側が持っているのですから、危険度は非常に高いものとなります。

    通常このような場合は、ユーザ認証やセッション管理により、第三者が利用できないようにセキュリティを
    確保する必要があります。

    ローカルなサーバや、自分のPC上で使用するのであれば、そのあたりは省略可能ですが、セキュリティに関しても
    注意しながら運用をお考えください。

  • id:aiomock
    kn1967 さん
    Mook さん

    ご回答ありがとうございます。
    コメント非常に参考になりました。

    データベースからの表示ができました。
    ありがとうございます。

    勉強が足りませんので、少し本を読んで勉強したいと思います。
  • id:aiomock

    MOOKさん>

    私の理解不足で申し訳ありません。
    インターフェースですがIEとFireFoxを考えています。


    MOOKさん>一点気になるのは、この WEB を一般のサーバに置くつもりでしょうか。

    このウェブは一般サーバーには置かずローカルで管理したいと考えています。
  • id:aiomock
    最後にひとつだけ押えたいことがあるのですが、

    現在入力されたIDと選択された処理内容で、データベースの処理を行うif文を作成しているのですが、エラーが発生しております。

    if文ですが

    if($_SESSION[HENKOU_TEN]=="CL1" and $_SESSION[HENKOU_SYURUI]=="id"){ mysql_query("UPDATE TEST SET id = '".$henkou."' WHERE id = 'CL1' ;"); }

    このように書きました。

    ここさえ押えることが出来れば、自分の作成したいページが一通り完成するのですが、このif文のどこに問題があるか少し分からないです。

    mysql_query 文をif文で使う際に気をつけないといけないこと等あるのでしょうか。

    お手数をおかけしますがここの部分だけお願いいたします。
  • id:kn1967
    (1)まずは機能別に行を分けたりインデントを入れたりすると見やすくなります。
    if($_SESSION[HENKOU_TEN]=="CL1" and $_SESSION[HENKOU_SYURUI]=="id") {
      mysql_query("UPDATE TEST SET id = '" . $henkou . "' WHERE id = 'CL1' ;");
    }
    インデントは半角スペース4文字(または2文字)が多いです。

    (2)間違っている箇所は and です。
    if($_SESSION[HENKOU_TEN] == "CL1" && $_SESSION[HENKOU_SYURUI] == "id") {
    ちなみに or の場合は || です。
    また、単語の境界をわかりやすくするため空白を入れる場合が多いです。

    (3)結果はしっかりと取得して置くようにしましょう。
    if(mysql_query("UPDATE TEST SET id = '" . $henkou . "' WHERE id = 'CL1' ;") !== False) {
    成功だよ
    } else {
      失敗だよ
    }
    ちなみに === や !== はデータの型も含めた比較に用います。
    == や != との違いを学んでください。

    (4)参考までにまとめると
    if($_SESSION[HENKOU_TEN] == "CL1" && $_SESSION[HENKOU_SYURUI] == "id") {
      if(mysql_query("UPDATE TEST SET id = '" . $henkou . "' WHERE id = 'CL1' ;") !== False) {
      成功だよ
      } else {
        失敗だよ
      }
    }
    といったような形になります。

    プログラム作成には本には載っていないコツのようなものが色々ありますので
    繰り返しになりますが、人の作ったものを見て
    ・どのようなコマンドが多用されているか
    ・インデントなど、どのような体裁(見た目)を取っているか
    などを徐々に身に付けていきましょう。

    では、がんばってください。
  • id:pahoo
    > エラーが発生しております
    どのようなエラーメッセージが表示されるのですか?

    なお、"and" は間違いではありません。
    PHP では論理積演算子として "and" と "&&" の両方が用意されており、演算結果は同じになります。
    上の kn1967さんのコメントは間違っています。
  • id:kn1967
    pahoo 2009-03-01 19:36:31>"and" は間違いではありません。

    and と && では適用される順位が異なります。
    演算子の動作順位を考慮してみてください。
  • id:kmond2
    and と && は同じ意味。
    いずれにしても比較演算子 == より優先順位が低いのだから、kn1967氏が書いていることは間違っている。
  • id:Mook
    現在のコードがどうなっているか分かりませんが、session_start、session_register は使用していますか?
    今回エラーが出ている if 文の前に

    if ( is_empty( $_SESSION[HENKOU_TEN] ) ) {
      echo "HENKOU_TEN は変数として無効です。";
    } else {
      echo "HENKOU_TEN は[".$_SESSION[HENKOU_SYURUI]."]です。";
    }

    if ( is_empty( $_SESSION[HENKOU_SYURUI] ) ) {
      echo "HENKOU_SYURUI は変数として無効です。";
    } else {
      echo "HENKOU_SYURUI は[".$_SESSION[HENKOU_SYURUI]."]です。";
    }

    のようにして、内容を確認してみてはどうでしょうか。

    エラーの原因を解析するときは、対象部分のデータ内容を確認するのが定石です。
  • id:kn1967
    kmond2 2009-03-01 21:44:02>and と && は同じ意味。
    kmond2 2009-03-01 21:44:02>いずれにしても比較演算子 == より優先順位が低い

    わざわざ別アカウント作ってまで・・・せめて文体くらいは替えたら?(笑

    それはさておき、
      if($_SESSION[HENKOU_TEN]=="CL1" and $_SESSION[HENKOU_SYURUI]=="id") {
    において
    優先度の高い == のほうが終わったと仮定してみますとパターンは
      if(True and True) {
      if(True and False) {
      if(False and True) {
      if(False and False) {
    の4種類。
    そこで次のように実験
      echo 'True and True : ' . (True and True) . "<br />\n";
      echo 'True and False : ' . (True and False) . "<br />\n";
      echo 'False and True : ' . (False and True) . "<br />\n";
      echo 'False and False : ' . (False and False) . "<br />\n";
      echo "<br />\n";
      echo 'True && True : ' . (True && True) . "<br />\n";
      echo 'True && False : ' . (True && False) . "<br />\n";
      echo 'False && True : ' . (False && True) . "<br />\n";
      echo 'False && False : ' . (False && False) . "<br />\n";
    結果は・・・
      True and True : 1
      True and False :
      False and True :
      False and False :

      True && True : 1
      True && False :
      False && True :
      False && False :
    となり、私kn1967のコメント(and と &&)は間違っている事が確認できます。

    演算子の優先順位の話を出した手前
    この程度のサンプルは用意しないといけないかな?と思って追記いたしました。

    演算子の優先順位
    http://php.benscom.com/manual/ja/language.operators.precedence.php

    最後になりましたが
    誤ったコメント、お詫び申し上げます。>関係各位
  • id:aiomock
    kn1967 さん
    pahoo さん
    Mook さん
    kmond2 さん

    ご回答ありがとうございます。

    プログラムですが大変申し訳ありません。

    私の初歩的エラーでsession_start();

    を付け忘れておりました。

    プログラムはきちんと動作しました。

    ありがとうございます。

    出来たサンプルを元に自分の作成したいページを作成していこうと思います。

  • id:aiomock
    kn1967 さん

    ご回答ありがとうございます。

    インデントの話やデータの型も含めた比較の話は非常に参考になります。

    ありがとうございます。

    またこれからプログラムを身につけていくうえでのコツを教えていただいてありがとうございます。

    教えていただいた二つの視点は、今まで自分の中でなかった視点なので、

    これからほかの人のプログラムを見る上で気をつけてみてみようと思います。
  • id:aiomock
    Mookさん

    いつも的確なご指摘ありがとうございます。

    Session_Start(); が抜けておりました。

    is_empty 関数 は知らなかった関数なのでこれから使用させていただこうと思います。

  • id:aiomock
    最後の最後で本当に申し訳ないのですが、SQLに入っているデータを上から一行目ずつ順番に抽出、出力する際はどのようにするか教えていただいてよろしいでしょうか?

    SELECT address from TEST where id= ★一行目のアドレス ★;

    というように表示したいです。

    命令文を知っているかたおりましたらよろしくお願いいたいます。
  • id:Mook
    id 順にデータを一つずつ取り出す場合、$num 番目のデータの取り出し方は MySQL では下記のようになります。
    (位置指定の記述はDBによって異なります)。
    SELECT address FROM test ORDER BY id LIMIT $num, 1;

    http://dev.mysql.com/doc/refman/4.1/ja/select.html
  • id:aiomock
    Mook さん

    ご回答ありがとうございます。

    実際に試して実行してみたところ出来ました。

    本当にありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません