2012-06-24 23 views
7

Tôi đang cố gắng tạo ra một địa điểm vũ khí sẽ chứa khoảng 1000 khẩu súng. Đây không phải là rất nhiều mục cơ sở dữ liệu, nhưng tôi đang cố gắng giữ cho ánh sáng cơ sở dữ liệu càng tốt. Tôi đã tạo ra năm bảng, giữ bình thường trong tâm trí, và tôi đang gặp vấn đề đặt dữ liệu vào tất cả năm bảng trong một truy vấn. cơ sở dữ liệu của tôi được cấu trúc như sau:Làm cách nào để làm việc với nhiều bảng và không nhận dữ liệu trùng lặp? (MySQL/PDO)

+-----------------+ +-----------------+ +-----------------+ +-----------------+ 
|  make  + |  model  | |  image  | |  type  | 
+-----------------+ +-----------------+ +-----------------+ +-----------------+ 
| PK | make_id | | PK | model_id | | PK | model_id | | PK | type_id | 
+-----------------+ +-----------------+ +-----------------+ +-----------------+ 
| | make_name | | | make_id | | | image_path | | | type_name | 
+-----------------+ +-----------------+ +-----------------+ +-----------------+ 
        | | type_id | 
        +-----------------+   +------------------+ 
        | | caliber_id |   |  caliber  | 
        +-----------------+   +------------------+ 
        | | model_name |   | PK | caliber_id | 
        +-----------------+   +------------------+ 
        | | cost  |   | | caliber_name| 
        +-----------------+   +------------------+ 
        | | description| 
        +-----------------+ 

này có thể là quá bình thường, nhưng đây là những gì tôi đang làm việc với;)

Hãy để tôi chỉ mã:

dạng

<form action="post" method="addProduct.php" enctype="multipart/form-data"> 
    make: <input type="text" name="make" /> 
    model: <input type="text" name="model" /> 
    type: <input type="text" name="type" /> 
    caliber: <input type="text" name="caliber" /> 
    cost: <input type="text" name="cost" /> 
    desc.: <input type="text" name="description" /> 
    Image: <input type="file" name="image" id="image" /> 
      <input type="submit" name="submit" value="Add Item" /> 
</form> 

addProduct.php

$make  = $_POST['make']; 
$model  = $_POST['model']; 
$type  = $_POST['type']; 
$caliber  = $_POST['caliber']; 
$cost  = $_POST['cost']; 
$description = $_POST['description']; 
$image  = basename($_FILES['image']['name']); 
$uploadfile = 'pictures/temp/'.$image; 
if(move_uploaded_file($_FILES['image']['tmp_name'],$uploadfile)) 
{ 
    $makeSQL = "INSERT INTO make (make_id,make_name) VALUES ('',:make_name)"; 
    $typeSQL = "INSERT INTO type (type_id,type_name) VALUES ('',:type_name)"; 
    $modelSQL = "INSERT INTO model (model_id,make_id,type_id,caliber,model_name,cost,description,) VALUES ('',:make_id,:type_id,:caliber,:model_name,:cost,:description)"; 
    $imageSQL = "INSERT INTO image (model_id,image_path) VALUES (:model_id,:image_path)";  
    try 
    { 
     /* db Connector */ 
     $pdo = new PDO("mysql:host=localhost;dbname=gun",'root',''); 
     /* insert make information */ 
     $make = $pdo->prepare($makeSQL);  
     $make->bindParam(':make_name',$make); 
     $make->execute(); 
     $make->closeCursor(); 
     $makeLastId = $pdo->lastInsertId(); 
     /* insert type information */ 
     $type = $pdo->prepare($typeSQL); 
     $type->bindParam(':type_name',$type); 
     $type->execute(); 
     $type->closeCursor(); 
     $typeLastId = $pdo->lastInsertId(); 
     /* insert model information */   
     $model = $pdo->prepare($modelSQL); 
     $model->bindParam(':make_id',$makeLastId); 
     $model->bindParam(':type_id',$typeLastId); 
     $model->bindParam(':caliber',$caliber); 
     $model->bindParam(':model_name',$model); 
     $model->bindParam(':cost',$cost); 
     $model->bindParam(':description',$description);   
     $model->execute(); 
     $model->closeCursor();   
     $modelLastId = $pdo->lastInsertId(); 
     /* insert image information */ 
     $image = $pdo->prepare($imageSQL); 
     $image->bindParam(':model_id',$modelLastId); 
     $image->bindParam(':image_path',$image); 
     $image->execute(); 
     $image->closeCursor(); 
     print(ucwords($manu)); 
    } 
    catch(PDOexception $e) 
    { 
     $error_message = $e->getMessage(); 
     print("<p>Database Error: $error_message</p>"); 
     exit(); 
    } 
} 
else 
{ 
    print('Error : could not add item to database'); 
} 

Vì vậy, khi tôi thêm một mục bằng mã ở trên, mọi thứ đều hoạt động tốt, nhưng khi tôi thêm một mục khác bằng cùng tên nhà sản xuất, nó sẽ sao chép nó. Tôi chỉ muốn nó nhận ra nó đã tồn tại và không sao chép nó.

Tôi đã nghĩ đến việc đặt một số loại kiểm tra xem liệu dữ liệu đó đã tồn tại chưa và nếu có thì không nhập dữ liệu, nhưng lấy id và nhập vào các bảng khác khi được yêu cầu.

Một điều nữa tôi nghĩ là tạo một menu thả xuống cho dữ liệu có nhiều khả năng sẽ được nhân đôi và gán giá trị làm id. Tuy nhiên, tâm trí đơn giản của tôi không thể tìm ra cách tốt nhất để làm điều đó: (Hy vọng tất cả những điều đó có ý nghĩa, nếu không tôi sẽ cố gắng xây dựng.

Trả lời

1

Nếu bạn có trường chỉ có một tập hợp dữ liệu giới hạn (tầm cỡ chắc chắn là một, và tôi nghi ngờ manfacturer cũng sẽ hoạt động) bạn có thể điền trước các bảng trong cơ sở dữ liệu và biến nó thành một trường tra cứu.

Trên biểu mẫu HTML của bạn, thay vì có trường nhập văn bản, bạn có thể in ra một hộp chọn để thay thế. Giá trị của lựa chọn là ID trong trường tra cứu - bạn không cần phải lo lắng về việc thêm bất kỳ thứ gì vào các trường tra cứu trong cơ sở dữ liệu.

Khi tôi đã phải làm điều này trong quá khứ, tôi đã viết một hàm để thực hiện chèn dữ liệu; nó kiểm tra xem giá trị có nằm trong bảng hay không. Nếu có, nó sẽ trả về chỉ số của trường; nếu không, nó sẽ thêm nó dưới dạng mục nhập mới và trả về ID cho mục nhập mới. Nó không phải là giải pháp thanh lịch nhất, nhưng nó hoạt động tốt.

+0

Cảm ơn andrewsi, tôi đã đề xuất với bạn. Tôi chỉ điền các trường được chọn cho dữ liệu duy nhất. Một điều tôi thấy là, PDO có chức năng được tích hợp sẵn, như Ollie đã đề cập đến MySQL, rằng khi INSERTING dữ liệu nó sẽ nhận thấy các mục trùng lặp và sẽ không hoàn thành việc chèn trong khi ném một lỗi tùy chỉnh. Cảm ơn! – Mike

2

Bạn cần phải tìm ra những gì tạo thành một công cụ độc đáo (không trùng lặp) mô hình, chủng loại, và tầm cỡ.

Sau đó, bạn cần phải tạo ra chỉ số duy nhất cho những bảng thực thi sự độc đáo. Xem http://dev.mysql.com/doc/refman/5.0/en/create-index.html

Ví dụ, bạn có thể sử dụng make_id, model_name, và caliber_id để nhận diện ra một mô hình. Bạn cần

CREATE UNIQUE INDEX UNIQUEMODEL ON MODEL(make_id, caliber_id, model_name) 

để thiết lập chỉ mục duy nhất của bạn. Lưu ý rằng chỉ mục khóa chính có thể là một chỉ mục duy nhất, nhưng bạn cũng có thể có các chỉ mục duy nhất khác.

Sau đó, bạn có thể sử dụng INSERT ON DUPLICATE KEY UPDATE để điền các bảng của mình. Xem ở đây: http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

Đối với tất cả điều này để làm việc một cách chính xác, bạn sẽ phải đảm bảo phù hợp type, caliber, và make hàng tồn tại trước khi bạn cố gắng để cư mỗi model hàng: bạn cần id từ những ba bảng đầu tiên cư trú thứ tư.

Các vấn đề liên quan