将HTML表单链接到SQLite数据库

4

你好,感谢您抽出时间查看我的问题。

我正在尝试为我的网站制作一个工作的通讯表格,它应该将人的姓名和电子邮件地址存储在数据库中。我不希望有太多数据需要存储,所以我有点盲目地选择了SQLite

我的文件夹包含一个HTML文件、一个PHP文件和一个SQLite数据库:

这是我的index.html文件:

<h1>Newsletter Signup</h1>
<form method="POST" action="./submit.php">
    <label for="name">Name:</label>
    <input type="text" name="name" id="name" required>
    <label for="email">Email:</label>
    <input type="email" name="email" id="email" required>
    <input type="submit" value="Subscribe">
</form>

这是我的submit.php文件:
<?php

$db = new SQLite3('mydb.db');

if (!$db) {
    die("Error connecting to database.");
}

$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';

if (!$name || !$email) {
    die("Name and email are required.");
}

$stmt = $db->prepare('INSERT INTO subscribers (name, email) VALUES (:name, :email)');

if (!$stmt) {
    die("Error preparing statement.");
}

$stmt->bindValue(':name', $name);
$stmt->bindValue(':email', $email);

$result = $stmt->execute();

if (!$result) {
    die("Error executing statement.");
}

$db->close();

exit();

?>

以下代码创建了 mydb.db SQLite 数据库:

CREATE TABLE subscribers (
    id INTEGER PRIMARY KEY,
    name TEXT,
    email TEXT
);

每当单击“订阅”按钮时,以下消息将通过DevTools在控制台中显示:
(In red) Failed to load resource: the server responded with a status of 405 () chrome-error://chromewebdata/:1
(In yellow) VM491:161 crbug/1173575, non-JS module files deprecated.
(anonymous) @ VM491:161

和网络 > 标头选项卡:

Status: (failed)net::ERR_HTTP_RESPONSE_CODE_FAILURE
Request Method: POST 
Status Code: 405 Method Not Allowed 
Referrer Policy: strict-origin-when-cross-origin
Allow: GET, HEAD, OPTIONS

我一直没有找到解决这个问题的方法。当然,我是一个新手,真诚地希望得到您的帮助,请详细说明!再次感谢。


1
405的响应是什么?在调试时你得到了什么? - Leandro Bardelli
1
你的浏览器开发工具显示了什么?POST 请求真的发生了吗,而且是发送到了正确的 URL 吗?如果文件和 index.html 在同一个目录下,action="./submit.php" 可能可行,但去掉 ./ 也可以。 - Don't Panic
1
@NeilPeñaMartínez,错误看起来很明显,您不接受POST请求。 - Leandro Bardelli
@Don'tPanic 感谢您的回复。我已经更新了上面的信息,希望对您有所帮助! - Neil Peña Martínez
请将以下关于编程的内容从英语翻译成中文。仅返回已翻译的文本:请勿发布代码、数据、错误消息等图像。 - 将文本复制或键入到问题中。 [ask] - Rob
显示剩余8条评论
1个回答

5

检查 php.ini 中的 enable_post_data_reading 变量是否设置为 on,以验证是否需要接受 POST

如果不起作用,请在此答案中发表评论,我很乐意更新我的答案。


在php.ini-development和php.ini-production中启用enable_post_data_reading = On,但它仅允许GET、HEAD和OPTIONS。然而,我的安装可能存在问题。如果您要重新安装PHP,您会如何进行? - Neil Peña Martínez
1
@NeilPeñaMartínez,让我检查一下是否可能是其他问题。如果我更新答案,我会标记你的。错误仍然完全相同吗?您在哪个环境中工作?在Debian上,我使用LAMP,而在Windows上,我使用Xampp或Wampp,默认配置应足以处理POST。 - Leandro Bardelli
1
顺便说一下,你应该在php.ini文件中更改这个设置,而不是在开发或生产文件中直接操作。如果可以的话,直接使用php.ini文件进行操作。我不知道你的环境。 - Leandro Bardelli
1
@NeilPeñaMartínez 你也可以创建一个只包含phpinfo()命令的php文件,这样你就可以在那个配置文件中读取enable_post_data_reading是否启用。 - Leandro Bardelli
谢谢Leandro!对于其他人-首先:在XAMPP上使用Apache服务器,而不是在Visual Studio Code中使用Live Server扩展。第二:设置enable_post_data_reading为On。第三:删除在enable_post_data_reading和extension = sqlite3之前的注释括号。第四:将包含HTML,PHP等的项目文件夹移动到位于XAMPP中的htdocs文件夹中。第五:如有疑问,请检查sqlite3和PHP是否位于PATH中。要这样做,请右键单击Windows按钮>系统>高级系统配置>环境变量>单击Path>编辑用户变量>新建>文件路径。 - Neil Peña Martínez
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接