如何通过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
相关产品推荐
相关产品推荐

