【问题标题】:Data not getting inserted into database with foreign key数据未使用外键插入数据库
【发布时间】:2014-02-09 06:02:30
【问题描述】:

我已经构建了一个多维数组,其中包含要插入的表名、列名和值。我将此数组转换为INSERT 命令,然后执行它。在我尝试两次插入同一张表之前,一切都按预期工作。我有一个父表company。数据库中的所有其他 19 个表都包含一个名为 CompanyID 的列,它是一个引用 company 表中的 CompanyID 列的外键。我需要做的是能够两次插入其中一个子表以获得额外的地址或联系该公司的人员。出于某种原因,如果我复制数组以便它应该两次添加到某个表中,它只会插入一次。也不会抛出任何错误。有人可以帮我解决这个问题。

这是数组:

$surveyResults = array(
                    'additionallocations' => array(
                            'CompanyID' => $CompanyID,
                            'Address' => $Address,
                            'City' => $City,
                            'State' => $State,
                            'Zip' => $Zip,
                            'Country' => $Country,
                        ),
                    'sales' => array(
                        'CompanyID' => $CompanyID,
                        'FirstName' => $FirstName,
                        'LastName' => $LastName,
                        'Email' => $Email,
                        'Phone' => $Phone
                        ),
                    'owner' => array(
                        'CompanyID' => $CompanyID,
                        'FirstName' => $FirstName,
                        'LastName' => $LastName,
                        'Email' => $Email,
                        'Phone' => $Phone
                        ),
                    'decisionmaker' => array(
                        'CompanyID' => $CompanyID,
                        'FirstName' => $FirstName,
                        'LastName' => $LastName,
                        'Email' => $Email,
                        'Phone' => $Phone
                        ),
                    'decisionmaker' => array(
                        'CompanyID' => $CompanyID,
                        'FirstName' => $FirstName,
                        'LastName' => $LastName,
                        'Email' => $Email,
                        'Phone' => $Phone
                        )
                    );

通知decisionmaker 被列出两次。这应该将相同的信息插入到数据库中,但它只插入一次。我什至尝试对最后一个 decisionmaker 数组值进行硬编码,因此除了 CompanyID 之外它们都不同,它仍然不会插入。

以下是我如何创建 SQL 语句并执行它。

foreach($surveyResults as $key => $table){
                $sql1 = null;
        $keys = array_keys($table);
            $values = null;
            $x = 1;

            foreach($table as $row => $value) {
                $values .= "'$value'";
                if($x < count($keys)) {
                    $values .= ', ';
                }
                $x++;
            }

        $sql1 = $conn->prepare("INSERT INTO {$key} (`" . implode('`, `', $keys) . "`) VALUES ({$values});");
        $sql1->execute();

        echo $CompanyID;
        echo "Successful  <br/>";
    }

建表查询:

CREATE TABLE IF NOT EXISTS `decisionmaker` (
  `id` int(3) NOT NULL AUTO_INCREMENT,
  `CompanyID` int(3) NOT NULL,
  `FirstName` varchar(30) NOT NULL,
  `LastName` varchar(30) NOT NULL,
  `Email` varchar(50) NOT NULL,
  `Phone` varchar(15) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `CompanyID` (`CompanyID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=24 ;

--
-- Constraints for dumped tables
--

--
-- Constraints for table `decisionmaker`
--
ALTER TABLE `decisionmaker`
  ADD CONSTRAINT `DecisionMaker_ibfk_1` FOREIGN KEY (`CompanyID`) REFERENCES `company` (`CompanyID`) ON DELETE CASCADE ON UPDATE CASCADE;

这是公司的表转储:

CREATE TABLE IF NOT EXISTS `company` (
  `CompanyID` int(3) NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Address` varchar(50) NOT NULL,
  `City` varchar(50) NOT NULL,
  `State` varchar(30) NOT NULL,
  `Zip` int(5) NOT NULL,
  `Country` varchar(20) NOT NULL,
  `Website` varchar(50) NOT NULL,
  `NOL` int(2) NOT NULL DEFAULT '1',
  PRIMARY KEY (`CompanyID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=35 ;

【问题讨论】:

    标签: php mysql sql arrays


    【解决方案1】:

    问题很简单

    $surveyResults 与决策者具有相同的密钥。

    如果您在foreach 之前print_r($surveyResults); 用于将数据插入数据库,您会发现decisionmaker 不是两个键,而是只有一个。

    这是因为一个数组不能包含两次相同的键。例如

        $array = array( 'key' => 'for', 'key' => 'example' );
        print_r($array);
    

    只会输出

    Array (
        [key] => example
    )
    

    解决此问题的简单方法:

    1. 在第二个decisionmaker里面surveyResults,把key改成decisionmaker2
    2. foreach($table as $row =&gt; $value) {之前添加以下代码:
      if ($key == 'decisionmaker2')
      $key = 'decisionmaker';

    这应该可以解决您看到的问题:)

    【讨论】:

    • 简直令人沮丧:)
    • 非常感谢,如果可以的话,我现在就给你高分
    【解决方案2】:

    你能发布这个表的创建语句吗? FOREIGN KEYS 要求您指定如何处理重复项。

    【讨论】:

    • 我使用 phpmyadmin,当我使用插入按钮时,INSERT 查询与我使用生成的查询提供的查询相同
    • 你做到了!你有没有在 PHP 之外直接在 MySQL 工作台或类似的东西中尝试过这个?我看不出你的所作所为有什么问题。我会说我没有看到您从调查中删除输入数据,这是一个很大的危险信号。希望你是,但如果不是,那可能会导致 sql 注入攻击。确保在所有输入上都使用 real_escape_string 以确保它们可以安全插入。在 php 之外尝试这个,看看它是否有效......我也会尝试导入,但我猜这是 php 问题。
    • 我还没有实现数据清理,但是一旦我让数据库正常工作我会做的事情我还有很多工作要做。
    • 去掉外键约束,试试同样的测试。确保外键是问题。
    • 我删除了外键,它仍然做同样的事情
    【解决方案3】:

    试试下面的代码,看看插入了多少次。

    并且在你的 php 设置中设置错误模式,这样你就可以看到错误信息。

    在回复您的结果后。

    foreach($surveyResults as $key => $table){
                    $sql1 = null;
            $keys = array_keys($table);
                $values = null;
                $x = 1;
    
                foreach($table as $row => $value) {
                    $values .= "'$value'";
                    if($x < count($keys)) {
                        $values .= ', ';
                    }
                    $x++;
                }
    
            $sql1 = $conn->prepare("INSERT INTO {$key} (`" . implode('`, `', $keys) . "`) VALUES ({$values});");
            if($sql1->execute())//changed code
              echo $CompanyID;
    
            echo "Successful  <br/>";
        }
    

    【讨论】:

    • 我没有收到任何错误,它执行了 5 次
    • 技术上是 4,因为我有新公司的初始插入
    • 是您的错误和警告模式在 php.ini 中设置为 on
    • 我在文件顶部添加了ini_set('display_errors', TRUE);
    • 您的数据库没有问题。问题可能与您的查询有关。
    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多