2012-01-30 18 views
1

所以我有這個函數,它接受所有用戶的MySQL表並將其存儲在一個數組:如何獲取按日期存儲在數組中的所有用戶?

public function graphVals() { 
    $sql = "SELECT user_username FROM users WHERE user_register_date > CURDATE() - 2592000"; 

    if ($stmt = $this->connect->prepare($sql)) {  
     $stmt->execute(); 
     $stmt->bind_result($username); 
     while ($row = $stmt->fetch()) { 
      $stmt->bind_result($username); 
      $data[] = $username; 
     } 
     $stmt->close(); 
     foreach($data as $key) { 

      $length[] = sizeof($key); 

     } 
     print_r($data); 
    } else { 
     $error    = true; 
     $message['error'] = true; 
     $message['message'] = CANNOT_PREPARE_DATABASE_CONNECTION_MESSAGE; 
     return json_encode($message); 
    } 
} 

之後,你可以看到我想返回包含用戶名長度的數組陣列。

但是我的問題是,正如你所看到的,我正在用一個索引獲取一個包含所有用戶名的數組,每個索引我實際上想要做的是將所有用戶註冊到一個日期並將它們存儲在單個索引中,所有在前一個日期之後註冊的用戶,並將它們存儲在下一個索引中,等等。

我該怎麼做?我可以調整這個功能嗎?

回答

1

這是很容易做到:

public function graphVals() { 
    $sql = "SELECT user_username FROM users WHERE user_register_date > CURDATE() - 2592000 ORDER BY user_register_date ASC"; 

    $data = array(); 
    if ($stmt = $this->connect->prepare($sql)) {  
     $stmt->execute(); 
     $stmt->bind_result($username); 
     $stmt->bind_result($date); 
     while ($row = $stmt->fetch()) { 
      $stmt->bind_result($username); 
      if (!isset($data[$date])) { 
      // when the date is the first time in the array. Add that date as index for the array 
       $data[$date] = array(); 
      } 
      $data[$date][] = $username; 
     } 
     $stmt->close(); 
     foreach($data as $key) { 

      $length[] = sizeof($key); 

     } 
     print_r($data); 
    } else { 
      $error    = true; 
      $message['error'] = true; 
      $message['message'] = CANNOT_PREPARE_DATABASE_CONNECTION_MESSAGE; 
      return json_encode($message); 
    } 
} 

希望這有助於:)

+0

@DorShemer和@ Sabari-我曾嘗試這種方法,這是我得到了運行時:'陣列([管理員] =>數組([0] => [1] =>特殊[2] => standard [3] => john))';我認爲這應該不是這樣的 – Roland 2012-01-30 07:19:58

+0

您可以打印$行的第一個輸出,就像while($ row = $ stmt-> fetch()){print_R($ row); – Sabari 2012-01-30 07:28:32

+0

我已根據您的代碼和@ DorShemer的代碼發佈了答案。現在它工作正常。我不得不做一些小的改變。 – Roland 2012-01-30 07:33:45

1

首先在查詢中添加ORDER BY。這不是強制性的,但將簡化你的東西

SELECT user_username FROM users 
WHERE user_register_date > CURDATE() - 2592000 
ORDER BY user_register_date 

然後檢查日期在您的循環迭代,就像這樣:

while ($row = $stmt->fetch()) { 
     $stmt->bind_result($username); 
     $stmt->bind_result($date); 

     if (!isset($data[$date])) { 
      // first time we encounter this date, creating a new array for it 
      $data[$date] = array(); 
     }   
     $data[$date][] = $username; 
} 
0

所以這就是我看到你的示例代碼後想出的。現在我按日期得到它,作爲指數的日期,唯一的是我註冊前NOW()而不是CURDATE(),我也得到了小時,分鐘和秒。但我認爲這是解決方案。讓我知道你的想法,如果我應該做其他事情。

$sql = "SELECT user_username, user_register_date FROM users WHERE user_register_date > CURDATE() - 2592000 ORDER BY user_register_date"; 

    if ($stmt = $this->connect->prepare($sql)) {  
     $stmt->execute(); 
     $stmt->bind_result($username,$date); 
     while ($row = $stmt->fetch()) { 
      $stmt->bind_result($username, $date); 
      if (!isset($data[$date])) { 
       $data[$date] = array(); 
      } 
      $data[$date][] = $username; 
     } 
     $stmt->close(); 
     foreach($data as $key) { 

      $length[] = sizeof($key); 

     } 
     print_r($data); 
    } else { 
     $error    = true; 
     $message['error'] = true; 
     $message['message'] = CANNOT_PREPARE_DATABASE_CONNECTION_MESSAGE; 
     return json_encode($message); 
    } 
相關問題