Php 论坛响应错误:主键条目重复

Php 论坛响应错误:主键条目重复,php,mysql,Php,Mysql,我一直在为一个论坛编写一些代码,对PHP还不熟悉,但我遇到了一些麻烦。 当我通过输入答案来测试程序时,我会得到一个写着“错误”的网页 将echo“ERROR”更改为echo mysql\u ERROR()后,网页更改为: 注意:第14行C:\xampp5\htdocs\add_answer.php中的未定义索引:id 注意:未定义索引:第30行C:\xampp5\htdocs\add_answer.php中的a_名称 注意:未定义索引:第31行C:\xampp5\htdocs\add_answe

我一直在为一个论坛编写一些代码,对PHP还不熟悉,但我遇到了一些麻烦。 当我通过输入答案来测试程序时,我会得到一个写着“错误”的网页

echo“ERROR”
更改为
echo mysql\u ERROR()
后,网页更改为:

注意:第14行C:\xampp5\htdocs\add_answer.php中的未定义索引:id

注意:未定义索引:第30行C:\xampp5\htdocs\add_answer.php中的a_名称

注意:未定义索引:第31行C:\xampp5\htdocs\add_answer.php中的电子邮件

注意:未定义索引:C:\xampp5\htdocs\add_answer.php中的a_answer位于第32行 键“PRIMARY”的重复条目“1”


您的代码中有一个竞争条件。当多个用户同时访问数据库时,他们最终将读取相同的
$Max\u id
,然后尝试插入相同的
$Max\u id+1
。例如:

  • 用户1选择id 42
  • 用户2选择id 42
  • 用户1插入id 43
  • 用户2插入id 43

  • 您需要使用该属性声明主键列(或者简单地将其声明为一个属性)。这样,当您插入新行时,数据库引擎将自动用保证唯一的值更新id。

    警告:如果您只是在学习PHP,请不要使用该接口。它是如此可怕和危险,以至于在PHP7中被删除。替换类和指南类说明了最佳实践。您的用户数据不存在,存在,并且可以被利用。打印正确的错误消息,而不是无用的错误。将
    echo“error”
    替换为
    echo mysql\u error()
    ,并将结果编辑到您的问题中。正如上面有人评论的那样,不要使用mysql\u查询。如果您是PHP新手,请使用PDO库,或者如果您不太喜欢冒险,请使用MySQLi库。
    <?php
    
    $host="localhost"; // Host name 
    $username=""; // Mysql username 
    $password=""; // Mysql password 
    $db_name="test"; // Database name 
    $tbl_name="forum_answer"; // Table name 
    
    // Connect to server and select databse.
    mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
    mysql_select_db("$db_name")or die("cannot select DB");
    
    // Get value of id that sent from hidden field 
    $id = $_POST['id'];
    
    // Find highest answer number. 
    $sql="SELECT MAX(a_id) AS Maxa_id FROM $tbl_name WHERE question_id='$id'";
    $result=mysql_query($sql);
    $rows=mysql_fetch_array($result);
    
    // add + 1 to highest answer number and keep it in variable name "$Max_id". if there no answer yet set it = 1 
    if ($rows) {
        $Max_id = $rows['Maxa_id']+1;
    }
    else {
        $Max_id = 1;
    }
    
    // get values that sent from form 
    $a_name = $_POST['a_name'];
    $a_email = $_POST['a_email'];
    $a_answer = $_POST['a_answer']; 
    
    $datetime=date("d/m/y H:i:s"); // create date and time
    
    // Insert answer 
    $sql2="INSERT INTO $tbl_name(question_id, a_id, a_name, a_email, a_answer, a_datetime)VALUES('$id', '$Max_id', '$a_name', '$a_email', '$a_answer', '$datetime')";
    $result2=mysql_query($sql2);
    
    if($result2){
        echo "Successful<BR>";
        echo "<a href='view_topic.php?id=".$id."'>View your answer</a>";
    
        // If added new answer, add value +1 in reply column 
        $tbl_name2="forum_question";
        $sql3="UPDATE $tbl_name2 SET reply='$Max_id' WHERE id='$id'";
        $result3=mysql_query($sql3);
    }
    else {
        echo "ERROR";
    }
    
    // Close connection
    mysql_close
    
    ();
    ?>