2017-09-05 10 views
0

Je suis nouveau sur php et mysql mais il y a un projet que je dois faire sur mes cours avec Silex 2.0 et Symfony et j'ai des problèmes avec mon code php et étranger clés dans ma table de produits dans la base de données.Les clés étrangères PHP/MySQL enregistre comme id = 0 à la base de données

Le problème est lié au bon fonctionnement des fonctions de sauvegarde de mon programme.

Voici ce qui se passe dans ma base de données lorsque je tente d'ajouter ou de modifier nouveau produit - je reçois idCategory et idProducent = 0.:/

Et il fait partie de mon code ProductModel.php responsable de l'enregistrer la base de données (produits de table):

public function addProduct($data) 
{ 
    $sql = 'INSERT INTO 
       `products` (`id`, `idCategory`, `idProducent`, `name`, `price_netto`, `price_brutto`, `desc`) 
      VALUES 
       (NULL,?,?,?,?,?,?)'; 
    $data['price_netto'] = $data['price_brutto'] * 1.22; 
    $this->_db->executeQuery(
     $sql, array(
     $data['idCategory'], $data['idProducent'], $data['name'], 
     $data['price_netto'], $data['price_brutto'], $data['desc']) 
    ); 
} 
public function saveProduct($data) 
{ 
    if (isset($data['id']) && ctype_digit((string)$data['id'])) { 
     $sql = "UPDATE 
        products 
       SET 
        idCategory = ?, idProducent = ?, name = ?, 
        price_netto = ?, price_brutto = ?, `desc` = ? 
       WHERE 
        id = ?"; 
     $data['price_netto'] = $data['price_brutto'] * 1.22; 
     $this->_db->executeQuery(
      $sql, array(
      $data['idCategory'], $data['idProducent'], $data['name'], 
      $data['price_netto'], $data['price_brutto'], $data['desc'], $data['id']) 
     ); 
    } else { 
     $sql = "INSERT INTO 
        `products` (`id`, `idCategory`, `idProducent`, `name`, `price_netto`, `price_brutto`, `desc`) 
       VALUES 
        (NULL,?,?,?,?,?,?)"; 
     $data['price_netto'] = $data['price_brutto'] * 1.22; 
     $this->_db->executeQuery(
      $sql, array($data['id']), array(
      $data['idCategory'], $data['idProducent'], $data['name'], 
      $data['price_netto'], $data['price_brutto'], $data['desc']) 
     );   
    } 
} 

ici vous avez ProductController.php [la partie que je pense est important ici]: https://codeshare.io/5w4rRD

fonctionne également de ProducentsModel.php et CategoriesModel.php:

public function getProducents() 
{ 
    $sql = 'SELECT * FROM producents;'; 
    return $this->_db->fetchAll($sql); 
} 
public function getCategories() 
{ 
    $sql = 'SELECT * FROM categories;'; 
    return $this->_db->fetchAll($sql); 
} 

Désolé pour vous donner seulement des liens mais cela est ma première fois avec le débordement de pile, espère que vous comprendrez.

+1

pouvez-vous partager votre structure de table? –

+0

http://screenshot.sh/oe5YXJ1HXU3Jq http://screenshot.sh/n9GN2B179sVUM – Abadd0n

+0

Utilisez-vous MyISAM ou InnoDB? –

Répondre

0

Base de données était bien. Le bug était dans ProductController.php que vous pouvez trouver dans le lien là-haut. Voici comment cela suppose pour ressembler à la fois modifier et ajouter des options: (! $ I = 0; $ test [$ i] = NULL; $ i ++)

pour { $ choiceCategory [$ test [$ i] ['nom']] = $ test [$ i] ['id'] ;; }

$producentModel = new ProducentsModel($app); 
    $test = $producentModel->getProducents(); 

    $choiceProducent = array(); 

    for ($i=0; $test[$i] != NULL; $i++) { 
     $choiceProducent[$test[$i]['name']] = $test[$i]['id']; 
    } 

Et supprimer ceci: choice_label jusqu'à placeholder=>'Choose'.

Désolé de vous déranger les gars et merci pour une réponse rapide.

0

Ne pas copier ce mot à mot, mais votre SQL manque quelque chose comme:

CREATE TABLE `products` (
    id INT UNISIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 

    ... missing part below 

    CONSTRAINT `FKID_CATEGORY_ID` FOREIGN KEY (`idCategory`) REFERENCES `categories` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

CREATE TABLE IF NOT EXISTS `products` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `idCategory` int(10) unsigned DEFAULT NULL, 
    `idProducent` int(10) unsigned DEFAULT NULL, 
    `name` char(32) COLLATE utf8_bin NOT NULL, 
    `price_netto` float NOT NULL, 
    `price_brutto` float unsigned NOT NULL, 
    `desc` text COLLATE utf8_bin, 
    PRIMARY KEY (`id`), 
    KEY `FK_products_1` (`idCategory`), 
    KEY `FK_products_2` (`idProducent`), 
    CONSTRAINT `FK_products_1` FOREIGN KEY (`idCategory`) REFERENCES `categories` (`id`), 
    CONSTRAINT `FK_products_2` FOREIGN KEY (`idProducent`) REFERENCES `producents` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 
+0

J'ai fait ce que vous avez dit et j'ai ajouté des clés étrangères des tableaux Catégories et Produits et voici ce que j'ai: http://screenshot.sh/mE94ENVCQ2zgE http://screenshot.sh/ m7wozmtmkH41y – Abadd0n

+0

C'est à prévoir.La contrainte d'intégrité est ce qui vous empêche de supprimer un parent et de laisser ses "enfants" s'attarder comme des enregistrements fantômes. Le FK doit être NULL si les deux peuvent exister indépendamment. –

+0

Post le vidage de votre schéma SQL - sous forme de texte afin que je puisse copier et coller rapidement :) –