0

私は深刻な問題を抱えていて、それを理解していませんでした。「結果」というテーブル名があります。私が達成したいのは、新しいレコードを挿入すると、データベースに正しく挿入されることです。

そのレベルでは、私のスクリプトは正常に機能しています。しかし、データが入力される前にクリックして新しい結果レコードを追加すると、2回目にデータが表示されるので、データを更新したい場合は可能です。以前にデータが入力されていない場合は、データをデータベースに挿入します。重複データを入力するユーザーを制限することに成功しましたが、同じページにそのデータを表示することに成功しませんでした。

このリンクをクリックすると結果を管理するリンクを配置するショー テスト ページがあり、新しいページが開き、すべての学生が特定の 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

3 に答える 3

1

Student_id に一意のインデックスがあることがわかりました。これは、テーブルが常に各生徒の結果のセットを 1 つだけ保持することを意味します。したがって、「データが前に入力された場合」と言うときは、「同じ学生に対して 2 番目の結果セットが入力された場合」を意味していると思います。

次の 2 つのオプションがあります。

  • 重複する Student_id を入力しようとしたときに外部キー制約によってスローされた例外をキャッチし、その Student_id の結果を取得してフォームに入力します
  • または、おそらく、挿入する前に Student_id が存在するかどうかを確認し、存在する場合は挿入せず、その Student_id の結果を取得してフォームに入力します。したがって、次のようなものが必要になります。

    SELECT COUNT(*) FROM results WHERE student_id=12345

(12345は挿入しようとしているstudent_idです)

結果が 0 より大きい場合 (この場合は 1 のみ)、挿入せず、代わりにフェッチして、フォームに入力します。あれは:

SELECT * FROM results WHERE student_id=12345

編集:使用することもできます

INSERT... ON DUPLICATE KEY UPDATE

...そして、結果を確認して表示し、更新する必要がなくなります。

この質問を見て

于 2012-06-12T17:00:21.240 に答える
0

このためには、現在データベースに存在するデータを取得し、それを挿入するデータと比較する必要があります。一致が見つかった場合は、エラー メッセージを表示します。それ以外の場合は、挿入クエリを起動します

于 2012-06-12T16:48:25.687 に答える