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


Accessing variable values from a function nested within a function running a mysqli_fetch_assoc() function

我试图生成一个表单,这相当于一个删除按钮下的表,在网站管理页面上提供客户端配置文件信息。这张桌子看起来很好。然而,我想在每次迭代时使用while循环中的函数生成的表单不包括变量$id、$firstname、$lastname,尽管没有生成关于未定义变量的错误消息(我的错误消息配置设置为这样做,并且实际上确实有效)。我只得到一个Delete按钮,表单处理函数失败,因为$_POST值为空(表单本身的变量值也是空的)。因此,问题一定出在form函数对表变量的访问上。

如果我将表单作为echo语句而不是函数包含在循环中,则按钮按预期工作。然而,我想把这两个方面分开,因为(我认为)神经质和特殊的组织偏好。我以前遇到过这种类型的问题,我通过更好地理解变量作用域解决了这个问题。但是,form函数中的变量被定义为全局变量,这让我很困惑。

这是一个特性的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>";
}

有趣的问题。我试着复制你的情况,它为我工作-从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 $firstname有关,global被设置一次,然后没有被覆盖。但这只是猜测。我建议这样做:

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

然后,你的函数看起来像这样:

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