从嵌套在运行mysqli_fetch_assoc()函数的函数中的函数访问变量值

时间:2014-03-14 15:57:47

标签: php forms

我正在尝试生成一个表单,该表单相当于表格下的删除按钮,该表格在站点管理页面上显示客户端配置文件信息。表格很好。但是,我希望在每次迭代时使用while循环中的函数生成的表单不包含变量$ id,$ firstname,$ lastname,尽管没有生成有关未定义变量的错误消息(我的错误消息)配置设置为执行此操作并确实工作)。我只是得到一个显示Delete的按钮,并且表单处理函数失败,因为$ _POST值为null(表单本身中的变量值也是如此)。因此,问题必须是表单函数访问表的变量。

如果我将循环中的表单作为echo语句而不是函数包含在内,则按钮可以按需运行。但是,我想将这两个方面分开(我想)神经质和特殊的组织偏好。我以前遇到过这种类型的问题,我通过更好地理解变量范围来解决这个问题。但是,表单函数中的变量被定义为全局变量,这让我感到茫然。

这是while循环的特性及其与mysqli_fetch_assoc()的交互吗?

我在php.net手册的mysqli_fetch_assoc()描述中找到了可能导致这种情况的一些迹象,但我没有发现任何暗示这是不允许的。

任何帮助都会很棒。另外,作为一个自学成才的人,请在你的评论和批评中尝试和建设性。我相信我有很多东西需要学习,并且非常感谢那些了解我的人的指导。

这是我的表格生成功能:

function table_delete_client() {
$client_set = find_all_clients();   

while($client = mysqli_fetch_assoc($client_set)) {
    $id =           htmlentities($client['id']);
$firstname =        htmlentities($client['firstname']);
$lastname =         htmlentities($client['lastname']);
$position_en =      htmlentities($client['position_en']);
$position_fr =      htmlentities($client['position_fr']);
$division_en =      htmlentities($client['division_en']);
$division_fr =      htmlentities($client['division_fr']);
$organisation_en =  htmlentities($client['organisation_en']);       
$organisation_fr =  htmlentities($client['organisation_fr']);       
$telephone =        htmlentities($client['telephone']);
$email =        htmlentities($client['email']);
$email_list =       htmlentities($client['email_list']);        
$username =     htmlentities($client['username']);

echo "<table>" .
     "<tr>" .
         "<th>ID</th>" .
         "<td>$id</td>" .
     "</tr>" .
     "<tr>" .
             "<th>First Name</th>" .
     "<td>$firstname</td>" .
     "</tr>" .
     "<tr>" .
      "<th>Last Name</th>" .
      "<td>$lastname</td>" .
     "</tr>" .
     "<tr>" .
      "<th rowspan='2'>Position</th>" .
      "<td>$position_en</td>" .
     "</tr>" .
     "<tr>" .
      "<td>$position_fr</td>" .
     "</tr>" .
     "<tr>" .
      "<th rowspan='2'>Division</th>" .
      "<td>$division_en</td>" .
     "</tr>" .
     "<tr>" .
      "<td>$division_fr</td>" .
     "</tr>" .
         "<tr>" .
      "<th rowspan='2'>Organisation</th>" .
      "<td>$organisation_en</td>" .
     "</tr>" .
     "<tr>" .
      "<td>$organisation_fr</td>" .
     "</tr>" .
     "<tr>" .
      "<th>Telephone</th>" .
      "<td>$telephone</td>" .
     "</tr>" .
     "<tr>" .
      "<th>Email</th>" .
      "<td>$email</td>" .
     "</tr>" .
         "<tr>" .
      "<th>Email List</th>" .
      "<td>$email_list</td>" .
     "</tr>" .
     "<tr>" .
      "<th>Username</th>" .
      "<td>$username</td>" .
     "</tr>" .
         "</table>" .
     "<br />";

         form_delete_client();
        }
        mysqli_free_result($client_set);
}

这是我的表单生成函数嵌套在'while'循环中:

function form_delete_client() { 
global $id;
global $firstname;
global $lastname;

echo $firstname;

echo "<form id=\"delete_client\" method=\"post\" action=\"" . $_SERVER['PHP_SELF'] . "?sub_page=2\">" .
 "<input type=\"hidden\" name=\"id\" value=\"" . $id . "\" />" .
 "<input type=\"hidden\" name=\"firstname\" value=\"" . $firstname . "\" />" .
 "<input type=\"hidden\" name=\"lastname\" value=\"" . $lastname . "\" />" .
 "<input type=\"submit\" id=\"delete_button\" class=\"button\" name=\"submit\" value=\"Delete " . $firstname . " " . $lastname . "\" />" .
"</form>" .
"<br>";
}

1 个答案:

答案 0 :(得分:0)

有趣的问题。我尝试复制你的情况,它对我有用 - 在一个mysqli while循环中调用一个函数。

<?php

$link = mysqli_connect('HOST', 'USER', 'PASS', 'DATABASE');

$sql = 'SELECT * FROM cds';

$result = mysqli_query($link, $sql);

while ($row = mysqli_fetch_array($result)) {
    $firstname = $row['titel'];
form_delete_client();
}

function form_delete_client() { 
    global $firstname;
    echo "<BR>".$firstname;
}

输出:

<BR>Beauty<BR>Goodbye Country (Hello Nightclub)<BR>Glee

函数应该在循环内正常工作。在你的情况下,我不确定为什么数据没有被输入。我想这可能与你调用global $firstnameglobal被设置一次然后不被覆盖有关。但这只是猜测。我建议做的是以下内容:

form_delete_client($id, $firstname, $lastname);

然后,您的功能将如下所示:

function form_delete_client($id, $firstname, $lastname) { 
    echo $firstname;
    echo "<form id=....";
}

您不需要全局化任何内容。