无法通过PHP向MySQL数据库插入新记录

8
当我点击提交按钮时,出现错误。

对象未找到错误。

并且页面会自动添加带有自增主键的空条目(无需按提交按钮)。
我仍然是PHP初学者,我已经彻底搜索过,但我找不出代码哪里出了问题。
  <html>   
<head>
    <title>Add New Record in MySQL Database</title>
</head>   
<body>
    <form action="insert.php" method="post">
        <p>

            <label for="Name">Full Name:</label>

            <input type="text" name="Name" id="Name">

        </p>
        <p>
            <label for="Code">Code:</label>
            <input type="text" name="Code" id="Code">
        </p>
        <p>
            <label for="GPA">GPA:</label>
            <input type="text" name="GPA" id="GPA">
        </p>
        <input type="submit" value="Submit">
    </form>

    <?php
 /* Attempt MySQL server connection. Assuming you are running MySQL

 server with default setting (user 'root' with no password) */

 $link = mysqli_connect("localhost", "username", "password", "students");
// Check connection

if ($link === false) {

die("ERROR: Could not connect. " . mysqli_connect_error());
}
// Escape user inputs for security
$full_name = filter_input(INPUT_POST, 'full_name');
$code = filter_input(INPUT_POST, 'code');
$gpa = filter_input(INPUT_POST, 'gpa');
// attempt insert query execution
$sql = "INSERT INTO info VALUES ('$full_name', '$code', '$gpa')";
if (mysqli_query($link, $sql)) {
 echo "Records added successfully. $full_name";
} else {
 echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
// close connection
mysqli_close($link);
?>
</body>
</html>  

你需要检查表单是否已经被处理。我更喜欢将表单处理放在一个独立的 PHP 文件中,而不是实际的表单中。 - Linkan
2
你的程序容易受到SQL注入攻击。 - chris85
关于 SQL 注入,我该怎么办? - Tasneem Salah
1
你应该使用mysqli_escape来转义它们。 - Gynteniuxas
2
请不要使用给出的答案更新您的代码。现在答案与问题不一致,因此我会将您的编辑回滚。 - njzk2
不要转义你的输入。使用预处理语句并单独绑定你的输入。 - Reinstate Monica
3个回答

13

试试这个:

$full_name = filter_input(INPUT_POST, 'Name');
$code = filter_input(INPUT_POST, 'Code');
$gpa = filter_input(INPUT_POST, 'GPA');
我写这个的原因是因为你的输入名称包含NameCodeGPA,所以你需要按照输入名称的精确拼写(区分大小写)进行编写。

我可以给你多个步骤,告诉你如何查找错误并打印出来,但最好通过评论(或电子邮件?聊天?)进行沟通,因为这里容纳不下。如果通过电子邮件,请在我的个人资料中找到它;如果通过聊天,请创建一个新的聊天窗口,但每次都需要通知我,因为由于某些原因,我无法收到通知。 - Gynteniuxas
现在它可以工作了,必须将php代码移到与表单分开的另一个文件中,并在查询中为字符串变量添加"。 - Tasneem Salah

6

使用 isset() 函数。当提交按钮被点击时,只有该代码才会运行。

在 PHP 中,您应该使用表单输入名称字段。

<?php
if(isset($_POST['submit'])){
    $link = mysqli_connect("localhost", "username", "password", "students");
    if ($link === false) {
        die("ERROR: Could not connect. " . mysqli_connect_error());
    }
    // Escape user inputs for security
    $full_name = filter_input(INPUT_POST, 'full_name');
    $code = filter_input(INPUT_POST, 'code');
    $gpa = filter_input(INPUT_POST, 'gpa');

    //to prevent sql injection attack
    $full_name = mysqli_real_escape_string($link, $full_name);
    $code = mysqli_real_escape_string($link, $code);
    $gpa  = mysqli_real_escape_string($link, $gpa);

    // attempt insert query execution
    $sql = "INSERT INTO info (Name,Code,GPA) VALUES ('$full_name', '$code', '$gpa')";
    if (mysqli_query($link, $sql)) {
        echo "Records added successfully. $full_name";
    } else {
        echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
    }
    // close connection
     mysqli_close($link);
}
?>
<html>   
<head>
  <title>Add New Record in MySQL Database</title>
</head>   
<body>
    <form action="insert.php" method="post">
    <p>
        <label for="Name">Full Name:</label>
        <input type="text" name="full_name" id="Name">
    </p>
    <p>
        <label for="Code">Code:</label>
        <input type="text" name="code" id="Code">
    </p>
    <p>
        <label for="GPA">GPA:</label>
        <input type="text" name="gpa" id="GPA">
    </p>
    <input type="submit" name="submit" value="submit">
</form>
</body>
</html>  

请提及 info 表的结构。 - Jees K Denny
info是“students”数据库中的一个表,它有3列;姓名,代码,GPA和2行数据。 - Tasneem Salah
问题中提到的自增列在哪里?我已经编辑了答案。 - Jees K Denny
请现在检查它。它会正常工作的。@TasneemSalah - Jees K Denny

2
问题在于输入名称。您将“全名”输入命名为name="Name",但您在php部分中声明了$full_name = filter_input(INPUT_POST, 'full_name');。您必须将full_name更改为Name。还有代码和平均绩点输入。

@EdvinTenovimas 啊,你说得对。很抱歉我没有注意到.. 我只是给你的答案点了个赞 :) - Seventh St
好的,谢谢! :) 如果你没有注意到也没关系,这种情况发生在每个人身上。 - Gynteniuxas

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