PDO Вставка foreach - PullRequest
       17

PDO Вставка foreach

0 голосов
/ 09 октября 2018

Я пытаюсь вставить массив значений несколько раз в таблицу.

У меня есть простой массив, который генерируется пользователем, установившим флажок, и это то, что добавляется в массив, затем я хочучтобы вставить каждое значение в таблицу, я подумал, что мог бы сделать это с помощью цикла foreach и выполнить итерацию $ i, но, похоже, я не могу, мне не нужно беспокоиться о безопасности или чем-то еще, так как это внутренне используется двумя людьми.

вот что у меня есть:

foreach($detailsinvoice as $desc){ 
  $conn3 = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  $sql3 = "INSERT INTO 
             xero_invoices (ContactName, Description)
             VALUES (:ContactName, :Description)";  
  $st3 = $conn3->prepare ( $sql3 );
  $st3->bindValue( ":ContactName", $this->ContactName, PDO::PARAM_STR );
  $st3->bindValue( ":Description", $desc, PDO::PARAM_STR );
  $st3->execute();
  $this->InvoiceNumber = $conn3->lastInsertId();
  $conn3 = null;
}

Это была моя первая попытка, но я понял, что соединение может быть использовано только один раз, а затем завершается, поэтому я попробовал итерацию, но снова я узнал, что выне может сделать это с помощью оператора PDO.

$i = 3;
foreach($detailsinvoice as $desc){ 
  $conn[$i] = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  $sql[$i] = "INSERT INTO 
             xero_invoices (ContactName, Description)
             VALUES (:ContactName, :Description)";  
  $st[$i] = $conn[$i]->prepare ( $sql[$i] );
  $st[$i]->bindValue( ":ContactName", $this->ContactName, PDO::PARAM_STR );
  $st[$i]->bindValue( ":Description", $desc, PDO::PARAM_STR );
  $st[$i]->execute();
  $this->InvoiceNumber = $conn[$i]->lastInsertId();
  $conn[$i] = null;
  $i++;
}

detailsinvoice - это массив, и ContactName будет одинаковым каждый раз (имя контакта работает, просто нужно выяснить, зацикливается ли массив)

Буду признателен, если кто-нибудь укажет мне правильное направление.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Понятия не имею, откуда у вас идея, что соединение может использоваться только один раз.Вы должны подключиться только один раз в сценарии.Затем, пока вы сохраняете и передаете переменную $conn любым функциям, которые вы можете использовать (область действия, конечно, уместна здесь), вы можете использовать ее столько раз, сколько захотите.

// connect ONCE per script
$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );

// write the query once
$sql = "INSERT INTO xero_invoices (ContactName, Description)
             VALUES (:ContactName, :Description)";  

// and prepare it once.
$st = $conn->prepare ( $sql );

// now loop over the array of parameters any number of times you like
foreach($detailsinvoice as $desc){ 

    $st->bindValue( ":ContactName", $this->ContactName, PDO::PARAM_STR );
    $st->bindValue( ":Description", $desc, PDO::PARAM_STR );
    $st->execute();

    // this line looks wrong, as $this->InvoiceNumber will get overwritten
    // each time round the loop
    //$this->InvoiceNumber = $conn->lastInsertId();

    // maybe you ment this, so at least you would have them all???? 
    $this->InvoiceNumber[] = $conn->lastInsertId();

    // or I have to assume you are going to add another query HERE
    // that will use that ID
}

Концепцияиз подготовленного утверждения заключается в том, что оно передается в базу данных, компилируется, оптимизируется и сохраняется в базе данных почти как сохраненная процедура.

После подготовки ее можно использовать снова и снова.Все, что вы делаете, это вводите новые значения в ваши параметры каждый раз, когда вы его выполняете.

0 голосов
/ 09 октября 2018

Особенностью подготовленных операторов является то, что вы можете подготовить инструкцию один раз , а затем выполнить ее несколько раз, чтобы ваш код можно было переписать как:

// Create a connection
$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$sql = "INSERT INTO 
        xero_invoices (ContactName, Description)
        VALUES (:ContactName, :Description)";  
// Create a statement
$st = $conn->prepare ($sql);
foreach ($detailsinvoice as $desc) { 
    // bind values and execute statement in a loop:
    $st->bindValue( ":ContactName", $this->ContactName, PDO::PARAM_STR );
    $st->bindValue( ":Description", $desc, PDO::PARAM_STR );
    $st->execute();
    $this->InvoiceNumber = $conn->lastInsertId();
}
// this is optional
$conn = null;
...