2012-06-24 5 views
7

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.

cevap

1

Sınırlı bir veri kümesi olacak alanlarınız varsa (calibre kesinlikle birdir ve manfacturer da çalışacağından şüpheliyim) veritabanındaki tabloları önceden doldurabilir ve bir arama alanı.

HTML formunda, bir metin giriş alanı yerine, bunun yerine bir seçim kutusu yazdırabilirsiniz. Seçimin değeri, arama alanındaki kimliğidir - veritabanındaki arama alanlarına herhangi bir şey ekleme konusunda endişelenmenize gerek yoktur.

Geçmişte bunu yapmak zorunda kaldığımda, veri ekini yapmak için bir işlev yazdım; Değerin tabloda olup olmadığını kontrol eder. Öyleyse, alanın dizinini döndürür; aksi halde, onu yeni bir giriş olarak ekler ve yeni girdinin kimliğini döndürür. En zarif çözüm değil, ama iyi çalışıyor.

+0

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

2

Neyin eşsiz olduğunu (koparılmamış) oluşturmaya çalışmalısın, modeli, türü ve kalibre.

Ardından, eşsizliği güçlendirmek bu tablolar için benzersiz dizinler oluşturmak gerekir. Örneğin benzersiz bir model tanımlamak için make_id, MODEL_NAME ve caliber_id kullanabilir http://dev.mysql.com/doc/refman/5.0/en/create-index.html

bakınız.

Benzersiz dizininizi ayarlamak için. Birincil anahtar endeksinin benzersiz bir dizin olabileceğine dikkat edin, ancak başka benzersiz dizinlere de sahip olabilirsiniz.

Tablolarınızı doldurmak için INSERT ON DUPLICATE KEY UPDATE kullanabilirsiniz. Buraya bakın: Eğer bu ilk üç tablolardan kimlikleri gerekir: Bütün bu düzgün çalışması için http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

, her bir model satır doldurmak çalışmadan önce emin uygun type, caliber ve make satır var olmaları gerekecek dördünü doldur.

İlgili konular