论坛响应错误:PRIMARY键的重复条目

时间:2016-12-31 22:20:57

标签: php mysql

我一直在为论坛编写一些代码并且是PHP新手,但我遇到了一些麻烦。 当我通过输入答案测试程序时,我得到一个显示“错误”的网页。

echo "ERROR"更改为echo mysql_error()后,网页更改为:

  

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

     

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

     

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

     

注意:未定义的索引:第32行的C:\ xampp5 \ htdocs \ add_answer.php中的a_answer   键'PRIMARY'重复输入'1'

<?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

();
?>

目前我并不关心安全问题,因为我打算稍后在赛道上解决安全问题。

1 个答案:

答案 0 :(得分:0)

您的代码中存在竞争条件。当多个用户同时访问数据库时,他们最终读取相同的IEnumerator PlayerAction(PlayerStats playerStats, int incrementor1) { bool loop = true; while (loop) { if (Input.anyKeyDown) { loop = false; Debug.Log("Action is break"); yield break; } else { yield return new WaitForSeconds(2); playerStats.Energy += incrementor1; GameClock.Tic++; Debug.Log("My first courutine is working!"); } } } ,然后尝试插入相同的$Max_id。例如:

  1. 用户1选择id 42
  2. 用户2选择id 42
  3. 用户1插入id 43
  4. 用户2插入id 43
  5. 您需要使用AUTO_INCREMENT属性声明主键列(或者只是将其声明为SERIAL)。这样,当您插入新行时,数据库引擎将自动使用保证的唯一值更新id。