【问题标题】:PHP/MySQL foreign keys saves as id=0 to databasePHP/MySQL 外键保存为 id=0 到数据库
【发布时间】:2017-09-05 15:46:57
【问题描述】:

我是 php 和 mysql 的新手,但是我必须使用 Silex 2.0 和 Symfony 在我的课程上做一个项目,并且我的 php 代码和数据库中产品表中的外键存在问题。

问题在于我的程序中保存函数的正确方法。

当我尝试添加或编辑新产品时,我的数据库中会发生以下情况 - 我得到 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 [我认为这里很重要的部分]: https://codeshare.io/5w4rRD

还有来自 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);
}

很抱歉只给你链接,但这是我第一次接触 Stack Overflow,希望你能理解。

【问题讨论】:

标签: php mysql sql symfony silex


【解决方案1】:

不要逐字复制,但您的 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;

【讨论】:

  • 我按照你说的做了,我添加了表类别和产品的外键,这就是我所拥有的:screenshot.sh/mE94ENVCQ2zgEscreenshot.sh/m7wozmtmkH41y
  • 这是意料之中的。完整性约束是阻止您删除父级并将其“子级”作为幻影记录逗留的原因。如果两者可以独立存在,则FK需要为NULL。
  • 以文本形式发布您的 SQL 模式转储,以便我可以快速复制和粘贴 :)
  • 好的,所以我导入了你的架构 - 我看到你有一些 FK 设置 - 你具体是哪个表有问题?订单产品?应用 FK 后,您就不能再运行那些 INSERT 语句了?
  • 我的产品有问题 - 在您拥有 idCategory 和 idProducent 的产品中。当我尝试添加产品或编辑产品时出现错误。也许我们可以把这个对话改成聊天?我会向您发送更多有关问题的屏幕截图。
【解决方案2】:

数据库很好。该错误在 ProductController.php 中,您可以在上面的链接中找到它。这就是它在编辑和添加选项中的样子:

for ( $i=0; $test[$i] != NULL; $i++) { $choiceCategory[$test[$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'

很抱歉打扰你们,感谢您的快速回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 2012-09-29
    • 2017-10-10
    • 2010-12-04
    • 2019-08-17
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多