2014-02-09 4 views
1

Я построил многомерный массив, который содержит имя таблицы, имя столбца и значения, которые нужно вставить. Я преобразовываю этот массив в команду 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 ; 

ответ

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

Это должно решить эту проблему, что вы видите :)

+0

Просто разочарование :) – Yamaha32088

+0

Спасибо большое, я бы дал вам пятерку прямо сейчас, если бы мог – Yamaha32088

0

Можете ли вы опубликовать заявление создать для этой таблицы? FOREIGN KEYS требует указать, как обрабатывать дубликаты.

+0

хорошо я отправил это я считаю, что это то, что вы хотели – Yamaha32088

+0

я использую PHPMyAdmin и когда я использую кнопку вставки есть запрос INSERT идентичен тому, что Я даю его с моим сгенерированным запросом – Yamaha32088

+0

вы сделали! Вы пробовали это за пределами PHP непосредственно на рабочем столе MySQL или что-то подобное? Я не вижу ничего плохого в том, что вы делаете. Я скажу, что я не вижу, как вы очищаете входные данные от своего опроса, и это большой красный флаг. Надеюсь, вы, но это может привести к вторжениям в sql, если нет. Убедитесь, что вы используете real_escape_string на всех своих входах, чтобы убедиться, что они безопасны для вставки. Попробуйте это за пределами php и посмотрите, работает ли это ... Я также попытаюсь импортировать, но я предполагаю, что это проблема php. – willthiswork89

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/>"; 
    } 
+0

У меня нет ошибок, и он выполняется 5 раз – Yamaha32088

+0

технически 4, потому что у меня есть начальная вставка для новой компании – Yamaha32088

+0

- ваш режим ошибок и предупреждений включен в php.ini –

Смежные вопросы