2014-06-30 121 views
3

我是新來的PHP和MySQL。我有一個表user_entries和兩列max_valnum的數據庫。PHP,mysqli數組

我已經使用下面的代碼將我的兩列提取到數組中,然後使用下面的函數numberTimesOver來確定$num[$i] > $limit多少次$val[$i] = 10。數字範圍從0到10.

當我使用我的函數與我的表中的兩個數組時,我得到的輸出爲零,當它應該是4.當我使用我的$a$b數組時,我得到2.

我哪裏錯了?當我嘗試將我的表列轉換爲數組時,我想我會出錯。

<?php 
require_once('functions.php'); 
$mysqli = new mysqli('localhost', 'root', NULL, 'practice'); 

$val_sql = "SELECT `max_val` FROM `user_entries`"; 
$valData = $mysqli->query($val_sql); 

$num_sql = "SELECT `num` FROM `user_entries`"; 
$numData = $mysqli->query($num_sql); 

$val = array(); 
while($row = $valData->fetch_assoc()) 
{ 
    $val[]= $row; 
} 

$num = array(); 
while ($row = $numData->fetch_assoc()) 
{ 
    $num[] = $row; 
} 

//$a = [10, 4, 5, 8, 3]; 
//$b = [10, 6, 10, 10, 2]; 

function numberTimesOver($number, $max, $limit) { 

    $sum = 0; 

    for ($i = 0; $i < count($max); $i++) 
    { 
     if ($max[$i] == 10 && $number[$i] > $limit) 
     { 
      $sum += 1; 
     } 
    } 
    print($sum); 
} 

numberTimesOver($val, $num, 6) 
+0

您的代碼將返回像這樣的數組''[「num」=> 10],[「num」=> 6],[「num」=> 10],...]'。顯然,您的'numberTimesOver'函數未設置爲處理此格式,因爲它預計每個數組項都是標量(整數)值。另外,爲什麼兩個查詢?沒有'ORDER BY'子句,不能保證'$ val'和'$ num'的索引條目將屬於同一個元組 – Phil

+0

好吧,我現在明白fetch_assoc不會以整數形式返回數組爲什麼它不工作。我使用了兩個查詢,所以我可以分別提取兩個列。我看到了ORDER BY,並不太清楚如何去做,所以我認爲這可能會起作用。我將如何將數組轉換爲整數數組? – user3788874

回答

3

我認爲你從錯誤的角度來看待這個問題。

看起來你要計算的行數,其中max_val大於$limit(6)和num等於10

關係型數據庫是非常在這樣的事情。所有你需要的是下面的...

$maxVal = 6; 
$num = 10; 
$stmt = $mysqli->prepare(
    'SELECT COUNT(1) FROM `user_entries` WHERE `max_val` > ? AND `num` = ?'); 
$stmt->bind_param('ii', $maxVal, $num); 
$stmt->execute(); 
$stmt->bind_result($sum); 
$stmt->fetch(); 

echo $sum; 

總結...

  1. 我創建了一個COUNT查詢因爲這是你後的數據。該查詢包含WHERE條款中所需的參數/條件。
  2. prepare方法準備一條SQL語句。有了這個,你可以綁定參數(見下一點)。將該查詢看作一個函數,並將該字符作爲該函數的參數。參考 - http://php.net/manual/mysqli.prepare.php
  3. bind_param綁定PHP變量以用作查詢的參數。這些順序是?字符出現的順序。 "ii"字符串表示格式,i含義整數,所以兩個整數。請參閱http://php.net/manual/mysqli-stmt.bind-param.php
  4. execute只是在數據庫服務器上執行查詢。請參閱http://php.net/manual/mysqli-stmt.execute.php
  5. bind_result將語句列結果(按順序)綁定到所提供的PHP變量。由於我們只有一列(COUNT(1)),我們只需綁定一個變量($sum)。請參閱http://php.net/manual/mysqli-stmt.bind-result.php
  6. fetch只是獲取下一行結果並填充綁定的結果變量。由於COUNT語句只有一行,我們只需要運行一次。請參閱http://php.net/manual/mysqli-stmt.fetch.php
+1

@ user3788874看看這個方法吧! – TribalChief

+0

我如實地沒有完全理解你做了什麼,但它的工作原理。你太棒了,非常感謝,並感謝Thauwa的幫助。 :D現在我會在繼續之前嘗試理解這一點。 – user3788874

+0

@ user3788874我很樂意解釋任何你不明白的東西,如果你需要澄清我使用過的* mysqli *方法,總會有PHP手冊。 – Phil

3

嘗試:

$val[]= $row['max_val']; 

$num[] = $row['num']; 

代替。

+0

我試過並改變它,現在當我嘗試使用這個函數時,我想到了錯誤。 「調用未定義的函數」。 – user3788874

+0

你確定你有'函數numberTimesOver($ number,$ max,$ limit){'和你的測試腳本中後面的代碼? – TribalChief

+0

我有一個不同的.php文件,我用require_once函數來調用它。它適用於我的$ a和$ b數組。所以我知道該功能正在工作,所以我不認爲它的工作。我不知道爲什麼。 – user3788874