数据未通过外键插入数据库

时间:2014-02-09 06:02:30

标签: php mysql sql arrays

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

这是数组:

$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 ;

3 个答案:

答案 0 :(得分:1)

问题很简单

$ surveyResults与决策者拥有相同的关键。

如果您print_r($surveyResults);之前foreach将数据插入数据库,您会发现没有两个decisionmaker键,但只有一个。

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

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

只会输出

Array (
    [key] => example
)

解决此问题的简单方法:

  1. decisionmaker内的第二个surveyResults上,将密钥更改为decisionmaker2
  2. foreach($table as $row => $value) {之前添加以下代码:
    if ($key == 'decisionmaker2')
    $key = 'decisionmaker';
  3. 这应解决您所看到的问题:)

答案 1 :(得分:0)

您可以发布此表的create语句吗? FOREIGN KEYS要求您指定如何处理重复项。

答案 2 :(得分:0)

尝试以下代码,然后检查插入操作的次数。

并在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/>";
    }