我正在尝试生成一个表单,该表单相当于表格下的删除按钮,该表格在站点管理页面上显示客户端配置文件信息。表格很好。但是,我希望在每次迭代时使用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>";
}
答案 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 $firstname
和global
被设置一次然后不被覆盖有关。但这只是猜测。我建议做的是以下内容:
form_delete_client($id, $firstname, $lastname);
然后,您的功能将如下所示:
function form_delete_client($id, $firstname, $lastname) {
echo $firstname;
echo "<form id=....";
}
您不需要全局化任何内容。