PHP + MySQL查询:意外的结果(仅针对少量结果)

问题描述:

尝试根据用户给出的开始日期和结束日期显示MySQL DB的结果。以下是代码:PHP + MySQL查询:意外的结果(仅针对少量结果)

//Getting Values From Other Page 
$start_date = date("Y-m-d", strtotime($_GET["date3"])); 
$end_date = date("Y-m-d", strtotime($_GET["date4"])); 

//Server Connection Info 
$server = "server_name"; 
$db_user = "username"; 
$db_pass = "pass"; 
$db_name = "dbname"; 

//Server Connection + Query 
$link = mysql_connect($server,$db_user,$db_pass); 
if(!$link) 
{ 
    die("Could Not Connect:".mysql_error()); 
} 
mysql_select_db($db_name, $link) or die('Can\'t use db:'. mysql_error()); 

if ($start_date == $end_date){ 
    $query = "SELECT col_a, col_b, col_c, col_d FROM main WHERE date='".$start_date."'"; 
} 
else { 
    $query = "SELECT col_a, col_b, col_c, col_d FROM main WHERE date BETWEEN '".$start_date."' AND '".$end_date."'"; 
} 
$result = mysql_query($query,$link) or die('Query Error'.mysql_error()); 
?> 
<!-- HTML CODE STARTS HERE --> 
<html> 
    <head> 
     <title></title> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <link rel="stylesheet" href="qc_style.css" /> 
     <link href='http://fonts.googleapis.com/css?family=Days+One' rel='stylesheet' type='text/css' /> 
    </head> 
    <body> 
    <?php 
     $row = mysql_fetch_assoc($result); 
     $row_count = mysql_num_rows($result); 
     echo $row; 
     echo $row_count; 
     if($row_count!=0){ 
      echo "<table>"; 
      while($row = mysql_fetch_assoc($result)) 
      { 
       echo "<tr><td>"; 
       foreach($row as $value) 
       { 
        echo $value; 
        echo "</td><td>"; 

       } 
       echo "<a href=\"qc_campedit.php?id=".$row['call_id']."\">Edit</a></td></tr>"; 
      } 
      echo "</table>"; 
     } //end of if statement 
     else {echo " Sorry, No records match your query";} 
    ?> 
    </body> 
</html> 

我有两行数据在我的数据库日期2011-08-25和一行数据的日期2011-08-24。

  • 当我指定开始日期和结束日期为2011-08-24时,我没有得到 响应。
  • 但是,当我指定开始日期和结束日期为2011-08-25时,我的 只得到一行数据属于2011-08-25
  • 当我指定开始日期为2011-08-24结束日期为2011-08-25 ,我得到属于2011-08-25的两行数据和属于2011-08-25的行。
  • 然而,当我指定的开始日期和结束日期为2011-08-23,我得到的所有的20行数据属于2011-08-23

注:阵列的数量在$result的特定时间范围内显示正确。即2011-08-24的$ row_count = 1和2011-08-24的$ row_count = 2

如何解决此问题?提前致谢。

+0

什么是日期列的数据类型? –

+0

日期列的数据类型为DATE –

如果您想要选择较少的列,请不要使用“SELECT * FROM ...”而是使用“SELECT name_of_col_A,name_of_col_B FROM table ...”。

另外我建议通过$ _REQUEST消毒你接受的日期字符串并传入你的查询。东西沿线

$start_date = date("Y-m-d", strtotime($_REQUEST["date3"])); 

应该就足够了。

+0

修改了查询和日期,结果仍然相同。 –

BETWEEN只是一种指定包含范围的方法。我认为在db中你的列有DATETIME列,所以BETWEEN '2011-08-24' AND '2011-08-24'只返回'2011-08-24 0:00:00'的记录。做你想要的东西你需要写
WHERE DATE(your_datetime_column) BETWEEN '2011-08-24' AND '2011-08-24'

+0

不是,该列仅为DATE列,不是DATETIME。 –

只需要添加一件事。如果您知道您的数据来自哪里,请特别使用该来源,并避免使用$ _REQUEST

它本身并不危险,但在某些情况下,它可能会带来安全风险,因为它使用了可能实际上将数据从您不想去的地方拉出的备用系统。即$ _REQUEST跟随你EGPCS设置,如果没有请求的数据在$ _ENV向前移动到$ _GET$ _ POST$ _COOKIE等发现,你不希望出现这种情况,这意味着。

如果你的数据是专门从未来GET然后用$_GET['date3']

+0

谢谢你,不知道安全问题。使用GET现在.. –

您对mysql_fetch_assoc第一()的调用获取的第一行。然后你进入你的循环,第一个取出的是下一行,这是第一行。我稍微更新了下面的代码以使用mysql_num_rows()来显示您的结果数量。

<?php 
    $row_count = mysql_num_rows($result); 
    echo $row_count; 
    if($row_count==0) { 
     echo "Sorry, no records match your query"; 
    else { 
     echo "<table>"; 
     while($row = mysql_fetch_assoc($result)) 
     { 
      echo "<tr><td>"; 
      foreach($row as $value) 
      { 
       echo $value; 
       echo "</td><td>"; 
      } 
      echo "<a href=\"qc_campedit.php?id=".$row['call_id']."\">Edit</a></td></tr>"; 
     } 
     echo "</table>"; 
    } 
?> 
+0

谢谢你,修改了代码,但仍然没有得到正确的结果。 $ row_count表示2(感谢mysql_num_rows($ result)),但只有一行正在显示......这似乎是$ result中行数较少的情况。 –

对不起,没有仔细检查你的三个useCases。 但首先我在你的代码中看到,你只是为了知道“row_count”而获取第一行。 我增加了一些评论对这段:

$row = mysql_fetch_assoc($result); // get row 1 from mysql-result 
$row_count = count($row); // always the number of attributes returned in one row 
echo $row; 
echo $row_count; 
if($row_count!=1) { // always true 

    // fetch lines 2-n and write to table 
} 

使用mysql_num_rows()如果你需要返回的行数。

+0

谢谢你。修改了代码。 –