

地域検索から該当企業の所在地を地図で表示させてるページがあるのですが、一部ページで同じ企業が2件表示されてしまいます。  
例）検索結果xx件  
・A社  
・B社  
・C社  
・A社

DBから住所と経度、緯度を取得して、GoogleMapをJSで表示させているのですが、原因がわからず。

※DBには該当企業情報は1件しかないことは確認済み  
※2件取得されずに期待通りに表示されるページもあります。

[code]

    <script type="text/javascript" charset="utf-8">
    //<![CDATA[
    var sidebar_html = "";
    var markers = [];
    var marker_html = [];
    var counter = 0;
    var icon = Array();
    
    function initialize() {    
        var i = 0;
        <?php while ( $facility = mysql_fetch_array( $result ) ) { ?>
            if(i == 0){
                //GoogleMapの地図を表示する位置(地図の中心点の緯度経度)
                if(<?=$sm?>==3){
                    var init_pos = new google.maps.LatLng(<?= $facility['lat'] ?>,<?= $facility['lng'] ?>);
                    var init_zoom = 15;
                }else{
                    var init_pos = new google.maps.LatLng(35.653735,139.637003);
                    var init_zoom = 13;
                }
    
                //地図のオプションを設定
                var myOptions = {
                    zoom: init_zoom,    //拡大の度合い設定
                    center: init_pos,     //地図の中心の緯度経度設定
                    navigationControl: true,    //拡大縮小のナビを表示
                    mapTypeControl: true,    // 地図の種別切り替えを表示
                    scaleControl: true    //縮尺の表示
                };
                //GoogleMapの地図
                var gmap = new google.maps.Map(document.getElementById("map_canvas"),myOptions);
            }
    
            //mapにピンを設定
            var point = new google.maps.LatLng(<?= $facility['lat'] ?>,<?= $facility['lng'] ?>);
            var gmarker = new google.maps.Marker({
                position: point,
                map: icon[i],
            });
    
            //所在地の一覧を表示する
            var title_name = "<?= $facility['name'] ?><\/a>　<?= $facility['address'] ?>";
            var maphtml = "<div class=\"mapinfo\"><a href=\"shika.php?shika_id=<?= $facility['shika_id'] ?><?= $back ?>\"><?= $facility['name'] ?><\/a><br \/><span style=\"font-size:13px;\">休診日：<?= $facility['holiday'] ?><br \/>所在地：<?= $facility['address'] ?><br \/>TEL：<?= $facility['tel'] ?></span><br \/><a href=\"shika.php?shika_id=<?= $facility['shika_id'] ?><?= $back ?>\">詳しくはこちら<\/a><\/div>";
    
            markers[counter] = gmarker;
            marker_html[counter] = maphtml;
            if(i < <?=$num_rows?>){
                sidebar_html += '<div class=\"mapside\"><a href=\"javascript:click_sidebar(' + counter + ')\">' + title_name + '<\/div>';
            }
            counter++;
    
            //mapの表示
            gmarker.setMap(gmap);
            i++;
        <?php
        }
        if ( $sm == '3' ) {
            $sql = "select * from `shika_data` where `chiku_id` = '" . mysql_real_escape_string( $_GET['chiku'] ) . "' and `shika_id` >= 1 order by `cyoume` asc";
    
            $result = mysql_query( $sql );
            $num_rows = mysql_num_rows( $result );
    
            while ( $facility = mysql_fetch_array( $result ) ) { ?>
                //mapにピンを設定
                var point = new google.maps.LatLng(<?= $facility['lat'] ?>,<?= $facility['lng'] ?>);
                var gmarker = new google.maps.Marker({
                    position: point,
                    map: icon[i],
                });
    
                //所在地の一覧を表示する
                var title_name = "<?= $facility['name'] ?><\/a>　<?= $facility['address'] ?>";
                var maphtml = "<div class=\"mapinfo\"><a href=\"shika.php?shika_id=<?= $facility['shika_id'] ?><?= $back ?>\"><?= $facility['name'] ?><\/a><br \/><span style=\"font-size:13px;\">休診日：<?= $facility['holiday'] ?><br \/>所在地：<?= $facility['address'] ?><br \/>TEL：<?= $facility['tel'] ?></span><br \/><a href=\"shika.php?shika_id=<?= $facility['shika_id'] ?><?= $back ?>\">詳しくはこちら<\/a><\/div>";
    
                markers[counter] = gmarker;
                marker_html[counter] = maphtml;
                if(i < <?=$num_rows?>){
                    sidebar_html += '<div class=\"mapside\"><a href=\"javascript:click_sidebar(' + counter + ')\">' + title_name + '<\/div>';
                }
                counter++;
    
                //mapの表示
                gmarker.setMap(gmap);
                i++;
            <?php
            }
        }
        ?>
    
        document.getElementById("sidebar_map").innerHTML = sidebar_html;
        /* alert("お使いのブラウザ設定ではGoogle Mapsを表示できません。<br \/>Javascriptの設定をお確かめの上、再度ページを表示してください。"); */
    }
    function click_sidebar(idx) {
        var infoWindow = new google.maps.InfoWindow({
            content: marker_html[idx]
        });
        infoWindow.open(marker_html[idx], markers[idx]);
    
    }
    //]]>
    </script>
    
[/code]


CC BY-SA 4.0
2021-04-20T15:59:47.267
75412
2021-04-21T05:54:18.117
43483
question
javascript php
地域検索から該当企業の所在地を地図で表示させてるページがあるのですが、一部ページで同じ企業が2件表示されてしまいます


原因は  
mysql_fetch_arrayの仕様を正しく理解していないからです。  
[mysql_fetch_array](https://www.php.net/manual/ja/function.mysql-fetch-
array.php)

> 取得した行をあらわす文字列の配列を返します。もし行が存在しない場合は false を返します。返される配列の形式は、result_type
> がどのように指定されているかによります。MYSQL_BOTH（デフォルト） を利用すると、連想添字と数値添字を共に持つ配列を取得します。

第2引数に値を指定しないと連想添字と数値添字配列の両方が渡されてしまいます。  
そのため実際のコードでは

[code]

    $facility = mysql_fetch_array( $result )
    
[/code]

を

[code]

    $facility = mysql_fetch_array( $result , MYSQL_NUM )
    
[/code]

もしくは

[code]

    $facility = mysql_fetch_array( $result , MYSQL_ASSOC )
    
[/code]

を利用するか、専用の関数を利用しましょう。  
[mysql-fetch-assoc](https://www.php.net/manual/ja/function.mysql-fetch-
assoc.php)  
[mysql-fetch-row](https://www.php.net/manual/ja/function.mysql-fetch-row.php)


CC BY-SA 4.0
2021-04-21T05:54:18.117
75420
2021-04-21T05:54:18.117
22665
75412
answer