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

如何通过HTML表单保存按钮调用外部PHP类中的函数

实现表单提交调用nabava类的函数

嘿,我来帮你搞定这个表单提交调用类函数的需求!咱们一步步来修改你的代码,实现点击保存按钮时调用nabava类里的函数。

第一步:完善HTML表单结构

你现在的表单缺少<form>标签和明确的提交逻辑,首先给表单加上<form>标签,指定提交方式为POST(更安全),目标文件用当前页面即可(因为你已经在文件开头实例化了$nabava对象),同时补充保存按钮的代码:

修改后的HTML表单代码如下:

<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <table>
        <tr><td>Vrsta naročila:</td>
            <td><input type=radio name=hvrsta_narocila value=1>Splošna nabava</input>
                <input type=radio name=hvrsta_narocila value=0>Pisarniški material</input>
            </td>
        </tr>
        <tr><td>Lastna dobava: </td><td><input type=radio name=hlastna_dobava value=1>DA</input>
            <input type=radio name=hlastna_dobava value=0>NE</input></td></tr>
        <tr><td>Osnovno sredstvo: </td><td><input type=checkbox name=hos></td></tr>
        <tr><td>SM ali DN: </td><td><input size=15 type=text name=hsm_dn></td></tr>
        <tr><td>Organizacijska enota: </td><td>
            <?php
            $data = "<select name=hoe><option>Izberi organizacijsko enoto</option>";
            foreach($sifrant_oe as $key=>$value) {
                // 给数组索引加单引号,避免PHP严格模式警告
                $data .= "<option value=".$value['sifra_oe'].">".$value['sifra_oe']." - ".$value['naziv_oe']."</option>";
            }
            $data .= "</select>";
            echo $data;
            ?>
        </td></tr>
        <tr><td valign=top>Artikli:</td>
            <td>
                <table>
                    <tr ><td>Naziv artikla</td><td>Količina</td><td>EM</td></tr>
                    <tr><td><input size=50 type=text name=hartikel1></input></td>
                        <td><input size=5 type=text name=hkolicina_artikel1></input></td>
                        <td><input size=5 type=text name=hem1></input></td></tr>
                    <!-- 保留原有的artikel2到artikel10的行代码 -->
                    <tr><td><input size=50 type=text name=hartikel10></input></td>
                        <td><input size=5 type=text name=hkolicina_artikel10></input></td>
                        <td><input size=5 type=text name=hem10></input></td></tr>
                </table></td></tr>
        <!-- 新增保存按钮 -->
        <tr>
            <td colspan="2" align="right">
                <button type="submit" name="save_nabava" style="font-weight:bold;">保存</button>
            </td>
        </tr>
    </table>
</form>

第二步:在PHP代码中处理表单提交

接下来,在你现有的PHP开头代码里,添加表单提交的判断逻辑,当用户点击保存按钮时,收集表单数据并调用nabava类里的处理函数(这里假设函数名为saveNabavaData,你可以换成自己实际的函数名):

修改后的PHP开头代码如下:

<?php 
/** skripta za začetek seje in preverjanje prijavnih podatkov **/ 
session_start(); 
require_once(dirname(__FILE__)."/skripte/su.inc.php"); 
include($path."/nabava.php"); 
include($path."/menu.php"); 

$SimpleUsers = new SimpleUsers(); 
$nabava = new nabava(); 

// 处理表单提交逻辑
if(isset($_POST['save_nabava'])){
    // 收集并整理表单数据,同时做基础的非空判断
    $formData = [
        'vrsta_narocila' => $_POST['hvrsta_narocila'] ?? '',
        'lastna_dobava' => $_POST['hlastna_dobava'] ?? '',
        'osnovno_sredstvo' => isset($_POST['hos']) ? 1 : 0,
        'sm_dn' => $_POST['hsm_dn'] ?? '',
        'oe' => $_POST['hoe'] ?? '',
        'artikli' => []
    ];
    // 循环收集10个商品的数据,只保留非空的商品
    for($i=1; $i<=10; $i++){
        if(!empty(trim($_POST["hartikel$i"]))){
            $formData['artikli'][] = [
                'naziv' => trim($_POST["hartikel$i"]),
                'kolicina' => $_POST["hkolicina_artikel$i"] ?? 0,
                'em' => $_POST["hem$i"] ?? ''
            ];
        }
    }
    // 调用nabava类中的保存函数,传入整理好的数据
    $saveResult = $nabava->saveNabavaData($formData);
    // 根据保存结果给出用户反馈
    if($saveResult){
        echo "<p style='color:green; padding:10px;'>数据已成功保存!</p>";
        // 也可以跳转到列表页面:header("Location: nabava_seznam.php"); exit;
    } else {
        echo "<p style='color:red; padding:10px;'>数据保存失败,请检查后重试!</p>";
    }
}

// 原有登录验证逻辑
if( !$SimpleUsers->logged_in ) { 
    header("Location: index.php"); 
    exit; 
} 

$userId = $_GET["userId"]; 
$user = $SimpleUsers->getSingleUser($userId); 
if( !$user ) die("The user could not be found..."); 

$sifrant_oe = $nabava->sifrant_oe(); 
?>

第三步:实现nabava类中的保存函数

最后,你需要在nabava.php文件的nabava类里实现对应的保存函数,比如:

class nabava {
    // 你已有的sifrant_oe函数
    public function sifrant_oe(){
        // 原有逻辑代码
    }

    // 新增的保存数据函数
    public function saveNabavaData($formData){
        // 这里需要根据你的数据库配置实现插入逻辑,示例如下
        // 假设你已经有数据库连接对象$db
        global $db;
        
        // 插入主表数据(预处理语句防止SQL注入)
        $mainSql = "INSERT INTO nabava (vrsta_narocila, lastna_dobava, osnovno_sredstvo, sm_dn, oe, user_id) 
                    VALUES (?, ?, ?, ?, ?, ?)";
        $mainStmt = $db->prepare($mainSql);
        $mainStmt->bind_param("iiissi", 
            $formData['vrsta_narocila'], 
            $formData['lastna_dobava'], 
            $formData['osnovno_sredstvo'], 
            $formData['sm_dn'], 
            $formData['oe'], 
            $_SESSION['user_id'] // 假设登录用户ID存在session中
        );
        $mainStmt->execute();
        $nabavaId = $mainStmt->insert_id;

        // 插入商品子表数据
        foreach($formData['artikli'] as $artikel){
            $artikelSql = "INSERT INTO nabava_artikli (nabava_id, naziv, kolicina, em) VALUES (?, ?, ?, ?)";
            $artikelStmt = $db->prepare($artikelSql);
            $artikelStmt->bind_param("isds", $nabavaId, $artikel['naziv'], $artikel['kolicina'], $artikel['em']);
            $artikelStmt->execute();
        }

        // 返回保存是否成功
        return $db->affected_rows > 0;
    }
}

一些实用的优化建议

  • 数据验证:一定要在保存前对表单数据做合法性校验(比如必填项是否填写、数字格式是否正确),避免无效数据存入数据库。
  • CSRF防护:添加CSRF令牌,防止跨站请求伪造,比如在表单里加入<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">,然后在PHP中验证令牌。
  • 错误捕获:在数据库操作时添加try-catch块,方便调试和定位问题。
  • 表单回显:如果保存失败,把用户之前输入的内容回显到表单中,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:18:46