Yaklaşık 1000 tüfek barındıracak bir ateşli silah sitesi oluşturmaya çalışıyorum. Bu çok fazla veritabanı girdisi değil, veritabanı ışığını mümkün olduğunca tutmaya çalışıyorum. Beş tablo oluşturdum, normalleşmeyi göz önünde bulundurarak ve bir sorguda beş tabloya veri eklerken sorun yaşıyorum. Benim veritabanı böylece gibi yapılandırılmıştır:;Birden çok tablo ile nasıl çalışır ve çift verileri nasıl almazsınız? (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|
+-----------------+
Bu TOO normalize olabilir, ama bu ile çalışıyorum budur
bana kodu göstereyim):
formu
<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');
}
Yukarıdaki kodu kullanarak bir öğe eklediğimde her şey iyi çalışıyor, ancak aynı üretici adını kullanarak başka bir öğe eklediğimde onu çoğaltacaktır. Sadece var olduğunu ve çoğaltıldığını anlamasını istiyorum.
Bu verinin zaten mevcut olup olmadığını görmek için bir çeşit kontrol koymayı düşünüyordum ve eğer giriyorsa verileri girmeyin, ancak kimliği alın ve gerekli olduğunda diğer tablolara girin.
Düşündüğüm başka bir şey, büyük olasılıkla çoğaltılacağı ve değer olarak kimliği atayacağınız veri için bir açılır liste oluşturmaktı. Ama, basit aklımı yapmanın en iyi yolunu anlayamıyorum :(Umarım tüm bunlar mantıklıdır, eğer olmasa bile detaylandırmaya çalışacağım.
Teşekkürler andrewsi, önerinizle gittim. Sadece benzersiz veri için seçim alanlarını dolduruyorum. Bulduğum başka bir şey ise, PDO'nun MySQL için bahsettiğim gibi, içine yerleştirilmiş bir işlevselliği var. Verileri INSERTING yaparken, tekrarlayan girişleri görecek ve özel bir hata yaparken ekleme işlemini tamamlayamayacaktı. Teşekkürler! – Mike