2017-09-05 2 views
0

私はphpとmysqlを初めて使いましたが、私はSilex 2.0とSymfonyで自分のクラスにしなければならないプロジェクトがあり、私のPHPコードと外国語に問題があります。データベース内の私の製品テーブルのキー。PHP/MySQLの外部キーはデータベースにid = 0として保存されます

問題は私のプログラムで関数を保存する適切な方法です。

は、ここで私は新製品を追加したり、編集しようとすると、私のデータベースに何が起こるかだ - 私が取得idCategoryとidProducent = 0:/

そして、私のコードの一部はProductModel.phpでそれを保存する責任がありますデータベースに(テーブルの製品に):ここで

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']) 
     );   
    } 
} 

あなたはProductController.phpは、[Iが思う部分がここでは重要である]があります。 また

がProducentsModel.phpと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); 
} 

申し訳ありませんが、ご理解いただければ幸いです。

+1

テーブル構造を共有できますか? –

+0

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

+0

MyISAMまたはInnoDBを使用していますか? –

答えて

0

データベースは大丈夫でした。このバグはProductController.phpにありました。そこにはリンクがあります。これは、両方の編集中のように見えるし、オプションを追加すると仮定方法です:

($ I = 0; $テスト[$ i]を= NULL;私は++ $!)のための

{ $ choiceCategory [$テスト[の$ i] ['name']] = $ 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']; 
    } 

そして、これを削除}

choice_label placeholder=>'Choose'まで。

お手数ですがご迷惑をおかけして申し訳ありません。

0

この逐語的にコピーしないでくださいしかし、あなたのSQLのような何かが欠落しています。

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

私はあなたが言ったことをしました。テーブルのカテゴリと製品の外部キーを追加しました。ここには私が持っているものがあります: http://screenshot.sh/mE94ENVCQ2zgE http://screenshot.sh/ m7wozmtmkH41y – Abadd0n

+0

それは期待されています。完全性の制約は、あなたが親を削除することを妨げていて、それを "子供たち"がファントムの記録として残っているままにすることです。 2つが独立して存在する場合、FKはNULLにする必要があります。 –

+0

SQLスキーマのダンプをテキスト形式で投稿して、コピー&ペーストすることができます。 –

関連する問題