PHP表单提交数据到MySQL数据库报bind_param错误问题求助
错误原因
- 预处理SQL语法错误:INSERT语句中表名后括号内应填写数据表的字段名,不能直接填入用户提交的变量值,你当前写法会把用户输入的内容直接当做字段名解析,必然报错。
- bind_param参数数量不匹配:你指定的类型字符串
sssssi对应6个参数(5个字符串+1个数字),但实际只传入了5个变量,漏了手机号$puhelinnumero参数。 - 表单radio项缺失value属性:三个性别单选框没有设置value,提交后
sukupuoli字段只会收到on字符串,无法区分用户选择的性别。
修正方案
1. 修改index.php中性别单选框部分代码
<div class="lomake-block"> <label for="male">Mies</label> <input type="radio" id="male" name="sukupuoli" value="mies"> </div> <div class="lomake-block"> <label for="female">Nainen</label> <input type="radio" id="female" name="sukupuoli" value="nainen"> </div> <div class="lomake-block"> <label for="other">Muu</label> <input type="radio" id="other" name="sukupuoli" value="muu"> </div>
2. 替换connection.php全部代码
<?php // 拦截非POST请求,避免直接访问报错 if ($_SERVER['REQUEST_METHOD'] !== 'POST') { die('非法访问'); } // 接收参数并增加判空处理 $etunimi = $_POST["etunimi"] ?? ''; $sukunimi = $_POST["sukunimi"] ?? ''; $sukupuoli = $_POST['sukupuoli'] ?? ''; $sähköposti = $_POST['sähköposti'] ?? ''; // 密码做哈希处理,禁止明文存储,不需要可直接改为$_POST['salasana'] ?? '' $salasana = password_hash($_POST['salasana'] ?? '', PASSWORD_DEFAULT); $puhelinnumero = intval($_POST['puhelinnumero'] ?? 0); $servername = "localhost"; $username = "root"; $password = ''; $database = 'palvelu'; $conn = new mysqli($servername, $username, $password, $database); // 设置字符集避免乱码 $conn->set_charset('utf8mb4'); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 预处理SQL填写数据表字段名而非用户输入变量 $stmt = $conn->prepare("INSERT INTO lomake(etunimi, sukunimi, sukupuoli, sähköposti, salasana, puhelinnumero) VALUES(?, ?, ?, ?, ?, ?)"); // 补全缺失的手机号参数 $stmt->bind_param("sssssi", $etunimi, $sukunimi, $sukupuoli, $sähköposti, $salasana, $puhelinnumero); if ($stmt->execute()) { echo "onnistui jea"; } else { echo "执行失败:" . $stmt->error; } $stmt->close(); $conn->close(); ?>
可选优化
如果手机号包含前导零、+号等特殊字符,建议把bind_param里的i改成s,同时将数据库puhelinnumero字段改为varchar类型,避免数字转换丢失内容。
内容的提问来源于stack exchange,提问作者Kasper Kuula
相关产品推荐
相关产品推荐

