You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在类的公共方法中调用外部类方法导致表单显示异常问题

问题描述

我创建了一个带公共方法的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;
    }
}

修改说明

  1. 把方法返回类型从void改为string,明确返回字符串
  2. 用$html变量拼接所有HTML内容,替代echo直接输出
  3. 增加htmlspecialchars()转义输出内容,避免XSS安全风险
  4. 增加$result &&判断,防止查询失败时调用num_rows报错

修改后,$function->provinces()会返回下拉列表的HTML字符串,被正确嵌入到表单的指定位置,不会提前输出到表单外部。

内容的提问来源于stack exchange,提问作者Mohamed Mahmoud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:47:32