0

これは私のテーブルです

CREATE TABLE room ( room_ID VARCHAR(8), room_name TEXT(50), room_capacity INT(3), room_building VARCHAR(20), room_type VARCHAR(20), room_desc TEXT(100), PRIMARY KEY (room_ID) );

これが私の挿入コードです。

<?php
//Start session
session_start();

//Import connection
include('conn.php');

$room_ID = $_POST["room_ID"];
$room_type = $_POST["room_type"];
$room_name = $_POST["room_name"];
$room_capacity = $_POST["room_capacity"];
$room_building = $_POST["room_building"];
$room_desc = $_POST["room_desc"];

//echo $room_ID;
//echo $room_type;
//echo $room_name;
//echo $room_capacity;
//echo $room_building;
//echo $room_desc;

//Check for duplicate room ID
//if($room_ID != '') {
    $qry = "SELECT room_ID FROM room WHERE room_ID = '".$room_ID."'";
    $result = mysql_query($qry);
    if($result) {
        if(mysql_num_rows($result) > 0) { 
            header("location: duplicateID.php");
            exit();
        }
        @mysql_free_result($result);
    }
    else {
        die("Yang ini lah failed");
    }
}

//Create INSERT query
$qry = "INSERT INTO room (room_ID, room_name, room_capacity, room_building, room_type, room_desc)
        VALUES('$room_ID', '$room_name', '$room_capacity', '$room_building', '$room_type', '$room_desc')";
$result = @mysql_query($qry);

//Check whether the query was successful or not
if($result) {
    header("location: addroomsuccess.php");
    exit();
} else {
    die("Query failed");
}?>

しかし、問題は、そうでなければプロセスが最初に立ち往生していることです。しかし、そうでなければそれらを削除すると、クエリはまだ失敗しました。なぜこれが起こったのですか?主キーのデータ型として varchar を使用しているからですか?

4

1 に答える 1

0

これはとても間違っています。

1) PK がある場合は、重複を取得しないため、チェックは無意味です。

2) 差し込むだけ。失敗した場合は、重複またはその他の問題があります。最初に確認することは機会を狭めるだけですが、マルチユーザー環境ではまだうまくいかない可能性があります.

3) SQL インジェクション - それを読んで、それを回避する SQL を実装する際に理解します (パラメーター)。

しかし、あなたの質問に答えるために、PKとしてのVARCHARとは何の関係もありません-それが理にかなっていれば問題ありません。@AlexandreLavoieのアドバイスは適切でも関連性もありません(申し訳ありません!)。

于 2013-05-28T10:37:12.957 に答える