我试图生成一个表单,这相当于一个删除按钮下的表,在网站管理页面上提供客户端配置文件信息。这张桌子看起来很好。然而,我想在每次迭代时使用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=....";
}