2010-02-05 82 views
0

$ qVraagGroepenOp =「SELECT * FROM $ tabele WHERE $ where」; $ rVraagGroepenOp = mysql_query($ qVraagGroepenOp); $ aVraagGroepenOp = mysql_fetch_assoc($ rVraagGroepenOp)PHP:讓你自己的函數在while循環中工作

和我轉換該給功能

vraagOp("testtable","testtable_ID = $id"); 

function vraagOp($table,$where) 
{ 
    $qVraagOp = "SELECT * FROM $table WHERE $where"; 
    $rVraagOp = mysql_query($qVraagOp); 
    $aVraagOp = mysql_fetch_assoc($rVraagOp); 

    return $aVraagOp; 
} 

只是問題是,當我需要一個以上的行i需要使用一個while循環

$qVraagGroepenOp = "SELECT * FROM testtable where testtype = test"; 
$rVraagGroepenOp = mysql_query ($qVraagGroepenOp); 
while ($aVraagGroepenOp = mysql_fetch_assoc ($rVraagGroepenOp)) 
{ 
    echo "testing <br>"; 
} 

它不會再工作了有一個技巧,使我的功能與這while循環工作?

不會工作,但我想達到類似的東西

while (vraagOp("testtable","testtype = test")) 
{ 
    echo "testing <br>"; 
} 

這可能嗎?

+2

爲什麼要使用這樣的不可讀的變量?只需KISS,並像其他人一樣將它們稱爲$ query,$ result和$ row。 – TravisO 2010-02-05 18:59:55

+4

@TravisO:哇。他們很清楚另一種語言,荷蘭語是精確的。他對他來說很簡單。 – hobodave 2010-02-05 19:03:50

+0

很好,那麼他應該使用$ query $ antwoord $ rij我不在乎他使用的是什麼語言,他的格式是不必要的冗長,並且以單個字母爲前綴來分隔來自行結果的查詢是愚蠢的。少即是多。 – TravisO 2010-02-05 22:36:10

回答

0

while (vraagOp("testtable","testtype = test")) 
{ 
    echo "testing <br>"; 
} 

會工作,如果你改變VraagOp()返回false時沒有發現匹配的記錄。

你將不得不在mysql_query()部分遷出VraagOp()的,只是留在mysql_fetch_assoc一部分。

不過,我實在看不出會有什麼好處?你只會圍繞mysql_fetch_assoc()建立一個(不必要的)包裝,不是嗎?

+0

好了,現在它縮短了3行,並且開始打字。 我只需要鍵入vraagop替代整個代碼 – matthy 2010-02-05 18:59:22

0

您需要將vraagOp()變爲iterator,然後使用foreach()才能完成此項工作。

+0

是的,但使用foreach不是使代碼easyer – matthy 2010-02-05 18:59:57

+0

'foreach()'不是完成所有工作的部分。只需要讓其餘的運行。 – 2010-02-05 19:00:42

3

這可以通過函數範圍中的靜態變量完成。

function vraagOp($table,$where) 
{ 
    static $rVraagOp; 
    if(!$rVraagOp){ 
     $qVraagOp = "SELECT * FROM $table WHERE $where"; 
     $rVraagOp = mysql_query($qVraagOp); 
    } 
    return mysql_fetch_assoc($rVraagOp); 
} 

這應該做你以後的事情。

+0

嗯似乎沒有工作也許這個想法是可行的,但它會給出錯誤: 警告:mysql_fetch_assoc():提供的參數不是在D:\ webuilding \ wamp \ www \ onderzoeks-manager \ functions \ ev \ sqlFunctions.php第10行 似乎是因爲請求從未遭到拒絕 – matthy 2010-02-05 19:07:11

+0

@matthy:你說的對,對不起。當我應該使$ rVraagOp靜態時,我做了$ qVraagOp。你可以試試這個例子,看看它是否有效。 – 2010-02-05 21:04:11

+0

它是一個很好的技巧,但它不會讓你調用functio更多然後第二次你調用函數它不會做任何事情,因爲它不會得到if if(!$ rVraagOp){}循環任何提示讓它工作它幾乎完美地免除了這件事;) – matthy 2010-02-06 15:18:07

0

您的示例將不起作用,因爲條件在每次迭代中都會執行。這意味着每次迭代都會調用vraagOp("testtable","testtype = test"),直到它返回一個錯誤的值。 mysql_fetch_assoc這樣做,但你的功能沒有。

1

該函數將緩存來自每個唯一$ table/$ where組合的mysql結果資源,並在每個後續調用中從中獲取下一個結果。它會爲每行返回一個關聯數組,或者當沒有行時返回false

function vraagOp($table, $where) 
{ 
    // Holds our mysql resources in a map of "{$table}_{$where}" => resource 
    static $results = array(); 

    $key = $table . '_' . $where; 

    if (!isset($results[$key])) 
    { 
     // first call of this particular table/where 
     $results[$key] = mysql_query("SELECT * FROM $table WHERE $where"); 
    } 

    $row = mysql_fetch_assoc($results[$key]); 

    if ($row === false) 
     // remove this key so a subsequent call will start over with a new query 
     unset($results[$key]); 

    return $row; 
} 

// Usage 

while ($row = vraagOp("table1", "where field > 7")) { 
    print_r($row); 
} 
2

該函數返回一個行數組 - 它是一個通用模式,幾乎可以在任何地方使用查詢中的多行。

function vraagOp($table,$where) 
{ 
    $sql= "SELECT * FROM $table WHERE $where"; 
    $query= mysql_query($sql); 
    if ($query != false) 
    { 
     $result = array(); 
     while ($row = mysql_fetch_assoc($query)) 
      $result[] = $row; 
     return $result; 
    } 

    return $false; 
} 
//usage 
$rows = vraagOp($table,$where); 
if ($rows) 
{ 
    foreach ($rows as $row) 
     use($row); 
} 
0

我們怎樣才能裏面調用函數while循環例子如下:

$sql_gpfsF="SELECT * FROM emp_salary"; 


$result_gpfsF=mysql_query($sql_gpfsF); 

while($row_gpfsF=mysql_fetch_assoc($result_gpfsF)) 
{ 

call_function();  

} 

function call_function() 
{ 

echo " Function Called </ br>"; 

} 
+0

你的答案如何比早已發佈的6更好? – Marki555 2016-07-15 06:55:26