質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

441閲覧

phpとmysqlを用いた検索データの複数表示

hyou143

総合スコア9

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/01/02 02:25

こちらのメコログ様のmysqlに画像を保存し呼び出すプログラム(http://mekori.hatenablog.com/entry/2013/07/04/020835)を参考にフォームページから画像や文字をmysqlに保存し呼び出すプログラムを作成しました。
フォームページからデータを登録する際、緯度経度の値を手入力で行い画像を呼び出す時にはこの2つの数値を入力しして合致したデータを表示するようにしました。しかし現時点では合致したデータの先頭だけが呼び出されほかに合致しているデータがある場合でも呼び出されません。
緯度経度の数値に合致したデータを複数表示させるにはどのような方法があるかアイデアをくださるとありがたいです。
下に2つのプログラムの一部を記載します。

/*set_img.php*/ $file_dir = 'C:\xampp\htdocs\sample\image\'; //データベースに接続する $db_link = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); //取得する画像のリンク $file_path = $file_dir. $_FILES["uploadfile"]["name"]; //ファイル移動処理 if(move_uploaded_file($_FILES["uploadfile"]["tmp_name"],$file_path)){ $img_dir = "./image/"; $img_path = $img_dir. $_FILES["uploadfile"]["name"]; $thumbnail_path = $img_dir. $thumbnail_name; }else{ echo "画像が選択されていません!"; exit; } $img_file = file_get_contents($img_path); // 画像の取得 //$img_file = $_FILES["uploadfile"]["tmp_name"]; //画像取得が成功した場合 $name = $_POST["name"]; $comment = $_POST["comment"]; $longitude = $_POST["longitude"]; $latitude = $_POST["latitude"]; //$word = $_POST["word"]; $lon_minus = $longitude - 0.0005; $lon_plus = $longitude + 0.0005; $lat_minus = $latitude - 0.0005; $lat_plus = $latitude + 0.0005; //if($word == 67){ if($img_file){ //画像をバイナリに変換 $img_binary = mysqli_real_escape_string( $db_link, $img_file ); //画像を保存するSQL文の実行 $result = mysqli_query( $db_link, 'INSERT INTO img_table (name,img_col,longitude,latitude,comment) VALUES ("'.$name.'","'.$img_binary.'","'.$longitude.'","'.$latitude.'","'.$comment.'")'); //結果の表示 if($result){echo "画像をデータベースに保存しました。"; }else{ echo "保存できませんでした。"; } } /*view_img.php*/ session_start(); $_SESSION["longitude"] = $_POST["longitude"]; $_SESSION["latitude"] = $_POST["latitude"]; $com_longitude = $_POST["longitude"]; $com_latitude = $_POST["latitude"]; //下の2つの関数を使い、緯度軽度に合致したテキストを表示する。 CallImg($com_longitude,$com_latitude); //指定した緯度経度を持つテキストを表示する関数 function CallImg($longitude_num,$latitude_num){ print TextSearchDB($longitude_num,$latitude_num); echo nl2br("\n"); } //データベースから、指定した緯度経度を持つテキストファイルを検索する関数。 function TextSearchDB($longitude_num,$latitude_num){ $com_longitude_minus = $longitude_num - 0.0005; $com_longitude_plus = $longitude_num + 0.0005; $com_latitude_minus = $latitude_num - 0.0005; $com_latitude_plus = $latitude_num + 0.0005; //データベースへ接続する $db_link1 = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); //指定した緯度経度のテキストを検索 $serch_query1 = mysqli_query($db_link1,"SELECT * FROM `img_table` WHERE `longitude` BETWEEN '".$com_longitude_minus."' AND '".$com_longitude_plus."'"); $serch_query2 = mysqli_query($db_link1,"SELECT * FROM `img_table` WHERE `latitude` BETWEEN '".$com_latitude_minus."' AND '".$com_latitude_plus."'"); $row_lon = mysqli_fetch_array($serch_query1); $row_lat = mysqli_fetch_array($serch_query2); if($row_lon['comment']==$row_lat['comment']){ header( 'Content-Type: text/html' ); echo $row_lon['comment']; }else{ echo"一致したデータがありませんでした"; } $close_flag1 = mysqli_close($db_link1); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

拝見したところ、TextSearchDB() 関数を、以下の2つの点で修正するとよいのではないかと思いました。

(1) クエリを1つだけにする。

現状、

PHP

1$serch_query1 = mysqli_query($db_link1,"SELECT * FROM `img_table` WHERE `longitude` BETWEEN '".$com_longitude_minus."' AND '".$com_longitude_plus."'"); 2$serch_query2 = mysqli_query($db_link1,"SELECT * FROM `img_table` WHERE `latitude` BETWEEN '".$com_latitude_minus."' AND '".$com_latitude_plus."'");

と、2つのクエリになっていますが、これを以下の1つにします。

sql

1SELECT * FROM img_table 2 WHERE 3 (longitude BETWEEN 経度の下限 AND 経度の上限) 4 AND 5 (latitude BETWEEN 緯度の下限 AND 緯度の上限)

つまり、検索条件(WHERE)が
「経度と緯度とが両方とも、それぞれの上限と下限の範囲内にある。」
となるような、1つのクエリします。

(2) 上記(1)のクエリの検索結果に対して、 whileでmysqli_fetch_arrayをループさせて各行を処理

具体的な書き方は、たとえば以下に出ているExample 1〜3を参考にされるとよいかと思います。

https://www.macs.hw.ac.uk/~hwloidl/docs/PHP/function.mysqli-fetch-array.html

以上、参考になれば幸いです。

投稿2018/01/02 03:08

編集2018/01/02 03:26
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyou143

2018/01/02 08:45

回答ありがとうございます。現状単一しか表示させれない画像と文字データをボタンを押すことで次のデータを読み込み表示させるというようにしたいと考えています。jun68ykt様の方法でも実装可能でしょうか?データ表示のプログラムを詳しく載せているのでい見ていただけると幸いです。画像と文字を1つのプログラムで出力することがうまくできなかったので2つに分けました ``` /*view_img.php*/ <html> <title>表示結果</title> <body> <fieldset> <legend>コメント</legend> <?php //データベースに接続する変数名を宣言しておく define( 'DB_HOST', 'localhost' ); define( 'DB_USER', 'root' ); define( 'DB_PASS', '' ); define( 'DB_NAME', 'test_field' ); session_start(); $_SESSION["longitude"] = $_POST["longitude"]; $_SESSION["latitude"] = $_POST["latitude"]; $com_longitude = $_POST["longitude"]; $com_latitude = $_POST["latitude"]; //下の2つの関数を使い、緯度軽度に合致したテキストを表示する。 CallImg($com_longitude,$com_latitude); //指定した緯度経度を持つテキストを表示する関数 function CallImg($longitude_num,$latitude_num){ print TextSearchDB($longitude_num,$latitude_num); echo nl2br("\n"); } //データベースから、指定した緯度経度を持つテキストファイルを検索する関数。 function TextSearchDB($longitude_num,$latitude_num){ $com_longitude_minus = $longitude_num - 0.0005; $com_longitude_plus = $longitude_num + 0.0005; $com_latitude_minus = $latitude_num - 0.0005; $com_latitude_plus = $latitude_num + 0.0005; //データベースへ接続する $db_link1 = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); //指定した緯度経度のテキストを検索 $serch_query1 = mysqli_query($db_link1,"SELECT * FROM `img_table` WHERE `longitude` BETWEEN '".$com_longitude_minus."' AND '".$com_longitude_plus."'"); $serch_query2 = mysqli_query($db_link1,"SELECT * FROM `img_table` WHERE `latitude` BETWEEN '".$com_latitude_minus."' AND '".$com_latitude_plus."'"); $row_lon = mysqli_fetch_array($serch_query1); $row_lat = mysqli_fetch_array($serch_query2); if($row_lon['comment']==$row_lat['comment']){ header( 'Content-Type: text/html' ); echo $row_lon['comment']; }else{ echo"一致したデータがありませんでした"; } $close_flag1 = mysqli_close($db_link1); } ?> </fieldset> <br> <fieldset> <legend>画像</legend> <img src="image.php"> </fieldset> <form name="form1" method="post" action="view_img2.php" enctype="multipart/form-data"> <input type="submit" value="次のデータ"> </body> </html> /*image.php*/ <?php //データベースに接続する変数名を宣言しておく define( 'DB_HOST', 'localhost' ); define( 'DB_USER', 'root' ); define( 'DB_PASS', '' ); define( 'DB_NAME', 'test_field' ); session_start(); $com_longitude = $_SESSION["longitude"]; $com_latitude = $_SESSION["latitude"]; //下の2つの関数を使い、緯度経度に合致した画像を表示する。 CallImg($com_longitude,$com_latitude); //指定した緯度経度を持つ画像を表示する関数 function CallImg($longitude_num,$latitude_num){ echo '<img src="'.ImgSearchDB($longitude_num,$latitude_num).'">'; } //データベースから、指定した緯度経度を持つimageファイルを検索する関数。 function ImgSearchDB($longitude_num,$latitude_num){ $com_longitude_minus = $longitude_num - 0.0005; $com_longitude_plus = $longitude_num + 0.0005; $com_latitude_minus = $latitude_num - 0.0005; $com_latitude_plus = $latitude_num + 0.0005; //データベースへ接続する $db_link = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); //指定した緯度経度のimgを検索 $serch_query = mysqli_query($db_link,"SELECT * FROM `img_table` WHERE `longitude` BETWEEN '".$com_longitude_minus."' AND '".$com_longitude_plus."'"); $serch_query1 = mysqli_query($db_link,"SELECT * FROM `img_table` WHERE `latitude` BETWEEN '".$com_latitude_minus."' AND '".$com_latitude_plus."'"); $row = mysqli_fetch_array($serch_query); $row1 = mysqli_fetch_array($serch_query1); if($row['img_col']==$row1['img_col']){ header( 'Content-Type: image/png' ); echo $row1['img_col']; }else{ echo "一致したデータがありませんでした"; } $close_flag = mysqli_close($db_link); } ?> ```
jun68ykt

2018/01/02 10:26

ご質問の中に > 緯度経度の数値に合致したデータを複数表示させるには とあったので、該当したデータを複数表示させる、一覧画面(画像ギャラリー)のようなものを 作るにはどうしたらいいか? という問題と解釈していました。 >ボタンを押すことで次のデータを読み込み表示させる ということになるとちょっと見たところではよく分かりませんでした。 誠に申しわけありません。
hyou143

2018/01/05 06:52

回答ありがとうございます。こちらの説明不足で申し訳ありません。 該当したデータを1件ずつ画面に表示しボタンなどで表示データを切り替えるというのをイメージして質問をしておりました。 一覧画面の作成はできそうとのことなのでとりあえずこちらをやってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問