2013-02-20 51 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);