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

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

ただいまの
回答率

90.61%

  • PHP

    19851questions

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

  • MySQL

    5694questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 180

hyou143

score 2

こちらのメコログ様の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);
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

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

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

現状、

$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."'");


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

SELECT * FROM img_table
 WHERE 
  (longitude BETWEEN 経度の下限 AND 経度の上限) 
    AND
  (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 17: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);
    }
    ?>
    ```

    キャンセル

  • 2018/01/02 19:26

    ご質問の中に
    > 緯度経度の数値に合致したデータを複数表示させるには
    とあったので、該当したデータを複数表示させる、一覧画面(画像ギャラリー)のようなものを
    作るにはどうしたらいいか? という問題と解釈していました。

    >ボタンを押すことで次のデータを読み込み表示させる
    ということになるとちょっと見たところではよく分かりませんでした。
    誠に申しわけありません。

    キャンセル

  • 2018/01/05 15:52

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19851questions

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

  • MySQL

    5694questions

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