2013-02-20 21 views
-1

我有一個簡單的功能從MySQL進行選擇:如何傳遞變量/秒到while循環的mysqli

function dbSelect($query) { 
    $db = db(); // refers to a database connect function 
    $result = mysqli_query($db, $query); 

    while ($row = mysqli_fetch_array($result)) { 
     echo $row['f_name'] . ' : ' . $row['s_name'] . '</br>'; 
    } 
} 

,你可以看到它接受$查詢VAR具體做法是:

$query = "SELECT * FROM user"; // or whatever 

我想什麼做的是通過線:

echo $row['f_name'] . ' : ' . $row['s_name'] . '</br>'; 

在函數調用的精氨酸,例如:

function dbSelect($query, $display) 

和$顯示是這樣的(我要重申了while語句下):

$display = $row['f_name'] . " : " . $row['s_name'] . "</br>"; 

上面一行會給出一個未定義的變量錯誤,我知道爲什麼了。

我該如何去將$顯示傳遞給函數或正確定義它?

ps。我知道沒有任何錯誤檢查,我只是想解決這個問題,稍後會添加。 :-)

感謝您的任何幫助

+0

DB中的表包含哪些列? – vikingmaster 2013-02-20 13:01:30

+0

這意味着你的$ row數組缺少一個鍵值爲'f_name'或's_name'的條目,但是我注意到在你以前的代碼片段中,s_name沒有被引用,這實際上可能是問題所在。 – Raad 2013-02-20 13:04:34

+0

我認爲一般來說,從函數獲得輸出並不是一個好習慣。應給函數提供信息並提供對輸入有意義的數據的返回。你應該只是傳遞查詢,獲得查詢的結果,然後處理它們,在這種情況下,echo'ing他們或任何,分開的功能。 – deed02392 2013-02-20 13:13:53

回答

0

嘗試此,來自程序邏輯保持分離,以輸出程序:

// some configuration file you include 
$db = db(); // refers to a database connect function 

// some common functions file 
function dbSelect($query) 
{ 
    global $db; 
    $result = mysqli_query($db, $query); 
    return $result; 
} 

// output script 
$records = dbSelect('SELECT * FROM somewhere'); 
// loop until cannot fetch any more rows from the record set 
while ($row = mysqli_fetch_array($records)) 
{ 
     echo $row['f_name'] . ' : ' . $row['s_name'] . '</br>'; 
} 
+0

TY,TY這是我以後,雖然我不得不改變線:$ records = dbSelect('SELECT * FROM somewhere');到$ records = dbSelect($ query);因爲它給了我一個**大膽的**只有變量可以通過引用傳遞** bold **錯誤,再次感謝 – Pwner 2013-02-20 14:52:14

+0

soz我壞了功能foo(&$ bar)你的陳述是正確的。 :-) – Pwner 2013-02-20 14:58:25

0

有兩種方法可以做到這一點。正確的做法是讓這個函數只運行查詢並返回結果。您可以創建另一個輸出結果的函數。通過這種方式,您可以在代碼中清晰地分離邏輯。

但是,如果你知道你想在這樣做的話,這樣的事情應該工作:

function dbSelect($query, $format) { 
    $db = db(); 
    $result = mysqli_query($db, $query); 
    while ($row = mysqli_fetch_array($result)) 
    { 
     echo preg_replace_callback("/\{\{\s*(\w+)\s*\}\}/", function($matches) use ($row) { $column = trim($matches[1]); return isset($row[$column]) ? $row[$column] : $matches[0]; }, $format); 
    } 
} 

這裏的參數可能類似於:

dbSelect("SELECT * FROM user", "{{ f_name }} {{ s_name }}"); 

你不能按照傳遞它的方式傳遞它,因爲在調用函數時$row不存在(因爲它在函數內部被定義)。另外,當函數被調用時,你的變量將被評估一次,而不是每次都在while循環中。

在任何人提出「建議」之前:eval不是一個選項。

0

個人而言,我會通過一個模板名稱進入功能和有地方保存爲HTML具有標準更換的片段模板瓦爾

所以,你可能有這樣的事情(注意:這會不工作了盒子將需要一些擺弄但其概念)

define TEMPLATE_NAME = "<tr><td>%COL1%</td><td>%COL2</td></tr>"; 

    $colstospitout = array('COL1'=>'f_name','COL2'=>'s_name'); 


    function dbSelect($query,$reportcols,$templatename) { 

    while ($row = mysqli_fetch_array($result)) 
      { 
      $template = str_replace("%COL1%",$reportcols['COL1'],$templatename); 
      $template = str_replace("%COL2%",$reportcols['COL2'],$templatename); 
      echo $template; 
      } 

    } 

dbSelect($inputquery,$colstospitout,TEMPLATE_NAME);