在插入数据时避免MySQL中的重复条目?

时间:2012-06-12 16:31:35

标签: php mysql duplicates record html-form

我遇到了严重的问题,我没弄明白。我有一个名为'results'的表名。我想要实现的是当我插入新记录时,它在数据库中正确插入。

在那个级别我的脚本运行正常。但我想第二次点击添加新的结果记录如果输入数据之前它会显示我的数据,这样如果我想更新我的数据,我可以。如果先前没有输入数据,那么我将数据插入数据库。我成功限制用户输入重复数据,但我没有成功在同一页面上显示数据。

我有一个展示测试页面,当我点击此链接时,我会放置链接管理结果,打开一个新页面,其中列出所有学生的特定class_id,并且在他们的名字后面有生物学,化学等领域...我输入他们的商标。

我的表结构是这样的:

results

的表结构
CREATE TABLE IF NOT EXISTS `results` (
  `result_id` int(11) NOT NULL AUTO_INCREMENT,
  `class_id` int(10) NOT NULL,
  `student_id` int(10) NOT NULL,
  `test_id` int(10) NOT NULL,
  `biology` int(10) NOT NULL,
  `chemistry` int(10) NOT NULL,
  `math` int(10) NOT NULL,
  `english` int(10) NOT NULL,
  `urdu` int(10) NOT NULL,
  `marks_obtained` int(10) NOT NULL,
  `created` datetime NOT NULL,
  `updated` datetime NOT NULL,
  PRIMARY KEY (`result_id`),
  UNIQUE KEY `student_id` (`student_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

如果您有任何疑问,请问我。很抱歉很长的解释!

<?php 
include("includes/config.php"); 

$id=$_GET['class_id'];
$id2 = $_GET['test_id'];

if($_SERVER['REQUEST_METHOD']=='POST'){

foreach($post as $key=>$val){
    $$key   =   $val;
}

$z  =   0;
foreach($post['biology'] as $biology1){
    $biology    =   $biology1;
    $student_id =   $post['student_id'][$z];
    $test_id =   $post['test_id'][$z];


    $chemistry      =   $post['chemistry'][$z];
    $math       =   $post['math'][$z];
    $english        =   $post['english'][$z];
    $urdu       =   $post['urdu'][$z];
    $marks_obtained =   $post['marks_obtained'][$z];
    $marks_obtained .= $biology+$chemistry+$math+$english+$urdu;

        if(isset($get['class_id']) and $get['test_id']){        

        $link = mysql_query("SELECT * from results where student_id='$student_id'");
        $res = mysql_num_rows($link);


        if($res>0) {

            $link2 = mysql_query("SELECT * from results where class_id='$class_id' AND test_id='$test_id'");

        }else {



    mysql_query("INSERT into results values('','$class_id','$student_id','$test_id','$biology','$chemistry','$math','$english','$urdu','$marks_obtained',now(),'')")or die(mysql_error());
    $z++;

            }
        }
    }
}
?>

HTML

<form method="post" action="" enctype="multipart/form-data">
    <table border="1" />


        <tr>
        <th>Student Name</th>

        <th>Biology</th>
        <th>Chemistry</th>
        <th>Math</th>
        <th>Engllish</th>
        <th>Urdu</th>



        </tr>
        <?php 

        $query = mysql_query("SELECT id,class_id,student_name from student where class_id='$id'") or die(mysql_error());
        while($rec =mysql_fetch_array($query)) {

        ?>

        <?php do { ?>

        <tr>
         <input name="class_id" type="hidden" value="<?php echo $rec['class_id'];?>" />
        <input name="student_id[]" type="hidden" value="<?php echo $rec['id'];?>" tabindex="1" />
        <input name="test_id[]" type="hidden"  value="<?php echo $id2;?>" tabindex="1" />

        <td><?php echo $rec['student_name'];?></td>




        <td><input name="biology[]" type="text" tabindex="2" value="<?php echo $rows['biology'];?>" /></td>
        <td><input name="chemistry[]" type="text" tabindex="5"  value="<?php echo $rows['chemistry'];?>" /></td>
        <td><input name="math[]" type="text" tabindex="7" value="<?php echo $rows['math'];?>" /></td>
        <td><input name="english[]" type="text" tabindex="4"  value="<?php echo $rows['english'];?>" /></td>
        <td><input name="urdu[]" type="text" tabindex="6" value="<?php echo $rows['urdu'];?>" /></td>
            <input name="marks_obtained[]" type="hidden" tabindex="9" />

      <?php } while($rows=mysql_fetch_array($link2))?>  <?php } ?>

        </tr> 

        <tr><td><button type="submit">Add Records</button></td></tr>
        </table>



    </form>

4 个答案:

答案 0 :(得分:2)

使用INSERT IGNORE而不是INSERT。如果记录没有复制现有记录,MySQL会像往常一样插入它。如果记录是重复的,则IGNORE关键字告诉MySQL以静默方式丢弃它而不会产生错误。

答案 1 :(得分:1)

我看到student_id上有一个唯一的索引。这意味着您的表格将随时为每位学生保留一组结果。所以我想当你说&#34;如果在&#34;之前输入数据?你的意思是&#34;如果为同一个学生输入了第二组结果&#34;。

您有两种选择:

  • 在尝试输入重复的student_id时捕获外键约束引发的异常,然后获取该student_id的结果并填充表单
  • 或者,更好的是,在插入之前检查student_id是否存在,如果存在,则不要插入,获取该student_id的结果并填充表单。 所以你需要这样的东西:

    SELECT COUNT(*)FROM results WHERE student_id = 12345

(其中12345是您要插入的student_id)

如果结果大于零(在这种情况下它只能是1),请不要插入,取代并填充表单。那就是:

SELECT * FROM results WHERE student_id=12345

修改:您也可以使用

INSERT... ON DUPLICATE KEY UPDATE

...并避免检查,显示结果和更新结果。

查看this question

答案 2 :(得分:0)

为此,您必须获取当前驻留在数据库中的数据,然后将其与插入的数据进行比较。如果找到匹配,则显示错误消息,否则触发插入查询

答案 3 :(得分:0)

您可以使用此字符&amp;&amp ;;来避免重复数据示例

if($_post['usename'] && $_post['password'] && $_post['items']){
  echo "You fill all items";
} else {
  echo fill all items recommended!!
}