在类的公共方法中调用外部类方法导致表单显示异常问题
问题描述
我创建了一个带公共方法的form类,该方法返回包含<select>标签的表单代码。我想在表单指定位置调用functions类的公共方法,从MySQL数据库拉取数据生成下拉选项,但调用后,下拉列表内容显示在整个表单外部,而非预期位置。
相关代码
classes.php
<?php global $conn,$CFG; require_once __DIR__.'/../class/functions.php'; class form { public function add_emp(): string { $function = new functions(); return ' <form class="form-control" name="emp-view" method="post" action="#" enctype="multipart/form-data"> <div class="empmenu"> <nav class="emp-menu" id="emp-menu"> <a class="btn emp-nav active" href="#personalinfo" onclick="show_personalinfo()"><b>البيانات الشخصية</b></a> <a class="btn emp-nav" href="#jobinfo" onclick="show_jobinfo()"><b>البيانات الوظيفية</b></a> <a class="btn emp-nav" href="#workinfo" onclick="show_workinfo()"><b>بيانات جهة العمل</b></a> </nav> </div> <hr> <div class="personalinfo" id="personalinfo"> <div class="mainprofile"> <div class=""> <div class="row"> <!-- column 1--> <div class="col-sm-2"> <label id="fullname">الاسم بالكامل</label> </div> <div class="col-sm-9"> <input class="form-control" type="text" for="fullname" name="fullname" required> </div> </div> <br> <div class="row"> <!-- column 1--> <div class="col-sm-2"> <label>الرقم القومى</label> </div> <div class="col-sm-4"> <input class="form-control" type="text" name="nationalid" required maxlength="14" minlength="14"> </div> <!-- column 1--> <div class="col-sm-2"> <label>الرقم التأمينى</label> </div> <div class="col-sm-3"> <input class="form-control" type="text" name="ensuranceid" > </div> </div> <br> <div class="row"> <!-- column 1--> <div class="col-sm-2"> <label>تاريخ الميلاد</label> </div> <div class="col-sm-4"> <input class="form-control" type="date" name="birthdate" id="birthdate" required> </div> <!-- column 2--> <div class="col-sm-2"> <label>محل الاقامة</label> </div> <div class="col-sm-3"> '.$function->provinces().' </div> </div> </div> </div> </div> <br> <!--submit button--> <div class="row action-btn"> <div class="text-center"> <button type="submit" class="btn btn-primary fa fa-save" name="add" value="" id="add-btn"> اضافــة</button> </div> </div> </form> '; } }
functions.php
<?php require_once __DIR__.'/../config.php'; class functions { public function provinces(): void { global $conn; $sql="select id,provincename from tblprovinces"; $result=$conn->query($sql); if ($result->num_rows) { echo '<select class="form-select" name="gov" id="gov" required> <option value="" >اختر</option>'; while ($row=$result->fetch_assoc()) { echo '<option value='.$row["id"].'>'.$row["provincename"].'</option>'; } echo '</select>'; } } }
vars.php
<?php require_once __DIR__.'/../class/classes.php'; require_once __DIR__.'/../class/functions.php'; $form = new form(); $function = new functions();
index.php
<?php global $form, $function; require_once __DIR__.'/../class/vars.php'; echo $form->add_emp();
问题原因
核心问题是functions类的provinces()方法用echo直接输出HTML内容,而非返回字符串。当在form->add_emp()的返回字符串中调用$function->provinces()时,echo会立即把下拉列表内容输出到页面,而此时add_emp()的表单字符串还没被echo,所以下拉列表会先出现在页面上,之后才输出整个表单。
解决方案
修改functions.php中的provinces()方法,让它返回HTML字符串而非直接输出,同时增加安全处理:
<?php require_once __DIR__.'/../config.php'; class functions { public function provinces(): string { global $conn; $html = ''; $sql = "select id,provincename from tblprovinces"; $result = $conn->query($sql); // 确保查询成功且有数据 if ($result && $result->num_rows > 0) { $html .= '<select class="form-select" name="gov" id="gov" required> <option value="">اختر</option>'; while ($row = $result->fetch_assoc()) { // 转义内容防止XSS攻击 $id = htmlspecialchars($row["id"], ENT_QUOTES); $provinceName = htmlspecialchars($row["provincename"], ENT_QUOTES); $html .= "<option value='{$id}'>{$provinceName}</option>"; } $html .= '</select>'; } return $html; } }
修改说明
- 把方法返回类型从
void改为string,明确返回字符串 - 用
$html变量拼接所有HTML内容,替代echo直接输出 - 增加
htmlspecialchars()转义输出内容,避免XSS安全风险 - 增加
$result &&判断,防止查询失败时调用num_rows报错
修改后,$function->provinces()会返回下拉列表的HTML字符串,被正确嵌入到表单的指定位置,不会提前输出到表单外部。
内容的提问来源于stack exchange,提问作者Mohamed Mahmoud
相关产品推荐
相关产品推荐

