PHP/MySQL 外键以 id=0 的形式保存到数据库

标签 php mysql sql symfony silex

我是 php 和 mysql 新手,但我必须在我的类(class)上使用 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 和 CategoryModel.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,希望您能理解。

最佳答案

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

关于PHP/MySQL 外键以 id=0 的形式保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46058934/

相关文章:

php - 按 href#/后重新初始化 Masonry/Isotope

mysql - 构建多对多关系的连接表

mysql修改datetime设置时分不修改月年日

php - PDO准备语句将NULL值插入mysql数据库

sql - 如何构造子查询/CTE 以替换嵌套聚合函数?

php - 使用 PHP 表单发送的邮件显示日语文本乱码

php - #1045 无法在 wamp 中登录 MySQL 服务器

mysql - 在 mysql 中,有没有简单的方法可以知道错误/警告号的含义,而不是谷歌搜索

sql - 带有绑定(bind)变量的 Oracle SQL 跟踪

php - 警告 : file_put_contents(): failed to open stream: Permission denied