2011-08-24 151 views
0

嘗試根據用戶給出的開始日期和結束日期顯示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 –

回答

1

如果您想要選擇較少的列,請不要使用「SELECT * FROM ...」而是使用「SELECT name_of_col_A,name_of_col_B FROM table ...」。

另外我建議通過$ _REQUEST消毒你接受的日期字符串並傳入你的查詢。東西沿線

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

應該就足夠了。

+0

修改了查詢和日期,結果仍然相同。 –

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。 –

0

只需要添加一件事。如果您知道您的數據來自哪裏,請特別使用該來源,並避免使用$ _REQUEST

它本身並不危險,但在某些情況下,它可能會帶來安全風險,因爲它使用了可能實際上將數據從您不想去的地方拉出的備用系統。即$ _REQUEST跟隨你EGPCS設置,如果沒有請求的數據在$ _ENV向前移動到$ _GET$ _ POST$ _COOKIE等發現,你不希望出現這種情況,這意味着。

如果你的數據是專門從未來GET然後用$_GET['date3']

+0

謝謝你,不知道安全問題。使用GET現在.. –

0

您對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中行數較少的情況。 –

0

對不起,沒有仔細檢查你的三個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

謝謝你。修改了代碼。 –