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