如何用PHP根据下拉选择表单的用户响应执行SQLite语句并解决报错
问题解答
- 用
$_GET还是$_POST和当前报错没有关联,当前错误完全是代码语法和使用不当导致的。POST适合提交修改数据的请求,你当前是查询类请求,理论上用GET也可以,但不是必须更换,优先解决现有错误即可。
错误原因梳理
- 最直接的报错原因:你调用SQLite3执行方法的语法写错了,把
$db->exec()写成了$db-exec(),PHP将其识别为「SQLite3对象减去exec函数返回值」的运算,尝试把对象转为整数的时候触发了报错。 - 第二个隐藏错误:SQL查询语句中,字符串类型的字段值需要用单引号包裹,你直接拼接
$nation变量到语句中,会导致SQL语法错误。而且直接拼接用户输入的参数有SQL注入风险,更推荐用预处理语句。 - 第三个使用错误:
exec()方法仅适用于执行无返回结果集的SQL语句(INSERT/UPDATE/DELETE等),执行SELECT查询应该用query()或者预处理语句的方式,否则你拿不到查询到的球员数据。
修正后的代码示例
<form action="index.php" method="post" id="formSelect"> <div id="chosen"> <label for="pkCountry" class="blue">Choose a country:</label> <select name="selectBox" id="choose" onchange="this.form.submit()"> <option value="start">select...</option> <option value="Australia">Australia</option> <option value="India">India</option> <option value="Pakistan">Pakistan</option> <option value="England">England</option> <option value="South Africa">South Africa</option> <option value="Sri Lanka">Sri Lanka</option> <option value="Bangladesh">Bangladesh</option> <option value="West Indies">West Indies</option> </select> <?php $db = new SQLite3('cricket.db'); if (!$db) { echo $db->lastErrorMsg(); } else { // 排除默认选项再执行查询 if(isset($_POST['selectBox']) && $_POST['selectBox'] !== 'start') { $nation = $_POST['selectBox']; // 使用预处理语句避免注入和语法问题 $stmt = $db->prepare("SELECT * FROM batsman WHERE country = :nation"); $stmt->bindValue(':nation', $nation, SQLITE3_TEXT); $result = $stmt->execute(); // 遍历输出结果示例,字段名可替换为你实际表中的字段 while ($row = $result->fetchArray(SQLITE3_ASSOC)) { echo "<p>球员名:".$row['name']." 生涯得分:".$row['score']."</p>"; } $db->close(); } } ?> </div> </form>
内容的提问来源于stack exchange,提问作者ryan
相关产品推荐
相关产品推荐

