查询只返回一行(PHP / MYSQL)

Posted

技术标签:

【中文标题】查询只返回一行(PHP / MYSQL)【英文标题】:Query only returning one row (PHP / MYSQL) 【发布时间】:2020-06-26 22:05:17 【问题描述】:

尝试在 javascript 中使用 php 返回一些行时遇到问题...

当我将结果作为纯文本回显时,它可以正常工作。但是当我尝试用结果填充地图时,它只显示数据库中的一行/标记,而不是表格的其余部分

screenshot shows only one marker returning on map instead of all results from the database

这是页面的完整代码..

            <?php include("header.php");

    // Connect to the hydrants table and set ORDER BY to ASC or DESC

    $sql = "SELECT id, lat, lng, flow, pressure, type, lid, updated FROM hydrants_OLD ORDER BY id ASC";
    $result = $conn->query($sql);

    // Display the results of the query

                        while($row = $result->fetch_assoc())    ;

                            ?>
            <head>
              <title>Hydrants</title>

              <meta name="viewport" content="initial-scale=1.0">
                  <link rel="Shortcut Icon" href=images/hl.png>
               <meta name="mobile-web-app-capable" content="yes">
               <link rel="icon" href="images/hl.png">
      <!--<meta name="apple-mobile-web-app-capable" content="yes">-->
      <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
      <meta name="apple-mobile-web-app-title" content="Hydrants">

      <link rel="apple-touch-icon" href="images/h-apple.png"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="images/h-apple.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (orientation: portrait)" href="images/h-apple.png">
              <meta charset="utf-8">
              <style>
                /* Always set the map height explicitly to define the size of the div
                 * element that contains the map. */
                #map 
                  height: 100%;
                
                /* Optional: Makes the sample page fill the window. */
                html, body 
                  height: 100%;
                  margin: 0;
                  padding: 0;
                
              </style>
          </head>
          <body bgcolor="#ffffff">      

    <?php 
    $lat = $row['lat'];
    $lng = $row['lng'];
    $id = $row['id'];
    $flow = $row['flow'];
    $pressure = $row['pressure'];
    $type = $row['type'];
    $lid = $row['lid'];
    $updated = $row['updated'];
    ?>

            <?php echo $id, $lat, $lng, $flow, $pressure, $type, $lid, $updated, "<br>" ;  ?>


            <div id="map"></div>

            <script>

                var map, infoWindow;
                function initMap()
                // Map options
                var options = 
                  // zoom:17,
                  zoom:14,
                  center: lat: 53.428345, lng: -6.244447,
                


                var map = new google.maps.Map(document.getElementById('map'), options);

                // Array of markers
                var markers = [


    // HYDRANTS

     coords:lat:<?php echo $lat ?>,lng:<?php echo $lng ?>, iconImage:'images/hs.png', content:'<h2>Hydrant - Number <?php echo $id ?></h2><b>Flow</b> <?php echo $flow ?> Liters per minute<br><b>Pressure</b> <?php echo $pressure ?> bar<br><br><?php echo $type ?><br><?php echo $lid ?><br><br><center><a href=images/hydrants/<?php echo $id ?>.jpg><img src=images/hydrants/<?php echo $id ?>.jpg width=100%></a>Updated <?php echo $updated ?><br><br><a href="report.php?id=<?php echo $id ?>">Report problem with this hydrant</a></center>' 


                ];

                // Loop through markers
                for(var i = 0;i < markers.length;i++)
                  // Add marker
                  addMarker(markers[i]);
                

                // Add Marker Function
                function addMarker(props)
                  var marker = new google.maps.Marker(
                    position:props.coords,
                    map:map,
                    //icon:props.iconImage
                  );

                  // Check for customicon
                  if(props.iconImage)
                    // Set icon image
                    marker.setIcon(props.iconImage);
                  

                  // Check content
                  if(props.content)
                    var infoWindow = new google.maps.InfoWindow(
                      content:props.content
                    );
                         marker.addListener('click', function()
                      infoWindow.open(map, marker);
                    );
                  
                

                  infoWindow = new google.maps.InfoWindow;

                

              </script>
              <script async defer
              src="https://maps.googleapis.com/maps/api/js?key=0000MYAPIKEY0000&callback=initMap">
              </script>
            </body>

    <?php
    // Close database connection
    $conn->close();

    ?>

【问题讨论】:

您正在为数据库中的每个条目创建完整的 html,这意味着您有 n 个 head 标签,n 个 body 标签...修复您的代码以提取循环外的通用结构以创建有效的 html。此外,您的问题的标题不准确 - 如果 php 回显多个结果,那么您的查询不是问题。 【参考方案1】:

问题是循环部分中有 html 代码,这意味着您正在为每个坐标创建地图。考虑到您的代码,我认为最好的方法是创建一个标记数组,然后使用 json_encode 方法将其转换为 JSON,并将其打印到您的 javascript 代码上的变量中。

// Display the results of the query
$markers = [];

while($row = $result->fetch_assoc()) 
    $markers[] = [
        'coords' => [ 
            'lat' => $row['lat'],
            'lng' => $row['lng']
        ],
        'iconImage' => 'images/hs.png',
        'content' => "<h2>Hydrant - Number $row['id']</h2><b>Flow</b> $row['flow'] Liters per minute<br><b>Pressure</b> $row['pressure'] bar<br><br>$row['type']<br>$row['lid']<br><br><center><a href=images/hydrants/$row['id'].jpg><img src=images/hydrants/$row['id'].jpg width=100%></a>Updated $row['updated']<br><br><a href=\"report.php?id=$row['id']\">Report problem with this hydrant</a></center>"
    ];

然后在您的 javascript 上,只需添加一个像这样的变量并打印编码结果:

var markers = <?php echo json_encode($markers); ?>;

整个代码:

<?php include("header.php");

// Connect to the hydrants table and set ORDER BY to ASC or DESC

$sql = "SELECT id, lat, lng, flow, pressure, type, lid, updated FROM hydrants_OLD ORDER BY id ASC";
$result = $conn->query($sql);

// Display the results of the query
$markers = [];

while($row = $result->fetch_assoc()) 
    $markers[] = [
        'coords' => [ 
            'lat' => $row['lat'],
            'lng' => $row['lng']
        ],
        'iconImage' => 'images/hs.png',
        'content' => "<h2>Hydrant - Number $row['id']</h2><b>Flow</b> $row['flow'] Liters per minute<br><b>Pressure</b> $row['pressure'] bar<br><br>$row['type']<br>$row['lid']<br><br><center><a href=images/hydrants/$row['id'].jpg><img src=images/hydrants/$row['id'].jpg width=100%></a>Updated $row['updated']<br><br><a href=\"report.php?id=$row['id']\">Report problem with this hydrant</a></center>"
    ];

    // echo "$row['id'], $row['lat'], $row['lng'], $row['flow'], $row['pressure'], $row['type'], $row['lid'], $row['updated'], <br>" ;


?>
    <head>
      <title>Hydrants</title>

      <meta name="viewport" content="initial-scale=1.0">
          <link rel="Shortcut Icon" href=images/hl.png>
       <meta name="mobile-web-app-capable" content="yes">
       <link rel="icon" href="images/hl.png">
      <!--<meta name="apple-mobile-web-app-capable" content="yes">-->
      <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
      <meta name="apple-mobile-web-app-title" content="Hydrants">

      <link rel="apple-touch-icon" href="images/h-apple.png"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="images/h-apple.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (orientation: portrait)" href="images/h-apple.png">
      <meta charset="utf-8">
      <style>
        /* Always set the map height explicitly to define the size of the div
         * element that contains the map. */
        #map 
          height: 100%;
        
        /* Optional: Makes the sample page fill the window. */
        html, body 
          height: 100%;
          margin: 0;
          padding: 0;
        
      </style>
  </head>
  <body bgcolor="#ffffff">      
    <div id="map"></div>

    <script>

        var map, infoWindow;
        function initMap()
        // Map options
        var options = 
          // zoom:17,
          zoom:14,
          center: lat: 53.428345, lng: -6.244447,
        

        var markers = <?php echo json_encode($markers); ?>;

        var map = new google.maps.Map(document.getElementById('map'), options);

        // Loop through markers
        for(var i = 0;i < markers.length;i++)
          // Add marker
          addMarker(markers[i]);
        

        // Add Marker Function
        function addMarker(props)
          var marker = new google.maps.Marker(
            position:props.coords,
            map:map,
            //icon:props.iconImage
          );

          // Check for customicon
          if(props.iconImage)
            // Set icon image
            marker.setIcon(props.iconImage);
          

          // Check content
          if(props.content)
            var infoWindow = new google.maps.InfoWindow(
              content:props.content
            );
                 marker.addListener('click', function()
              infoWindow.open(map, marker);
            );
          
        

          infoWindow = new google.maps.InfoWindow;

        

      </script>
      <script async defer
      src="https://maps.googleapis.com/maps/api/js?key=0000MYAPIKEY0000&callback=initMap">
      </script>
    </body>

<?php
// Close database connection
$conn->close();

?>

【讨论】:

感谢您的回复,我根本不是专家,感谢您的帮助。我现在收到以下错误,但是在第 18 行“解析错误:语法错误,意外'报告'( T_STRING),在第 18 行的 index.php 中期待 ']'" 不幸的是,现在我收到“此页面未正确加载 Google 地图。有关技术详情,请参阅 JavaScript 控制台。”并且在控制台中有“InvalidValueError: setPosition: not a LatLng or LatLngLiteral: in property lat: not a number”“1.jpg:1 GET images/hydrants/1.jpg 404 (Not Found)”。 “2.jpg:1 GET images/hydrants/2.jpg 404(未找到)”“js?key=AIzaSyBlvLFqjIwxRtvdJanpfUAai5883G9t6&callback=initMap:55 Google Maps JavaScript API 错误:InvalidKeyMapError” markers 变量后面添加以下代码:标记[i].coords.lng = parseFloat(标记[i].coords.lng); 我会尽快尝试,因为我不得不去,我现在正在通过电话回复...感谢到目前为止的帮助 没问题。很高兴为您提供帮助

以上是关于查询只返回一行(PHP / MYSQL)的主要内容,如果未能解决你的问题,请参考以下文章

mysql left join and not equals 应该只返回一行

php mysql 查询只返回第一条数据

PHP MySQL查询不返回所有结果

PHP MySQL查询不返回结果[关闭]

为啥 PDO fetch() 只返回第一行? [复制]

什么可能导致 MySQL 间歇性地无法返回一行?