Цикл PHP foreach (), затем вставьте одно значение массива в базу данных MySQL с помощью кнопки «Отправить»

После json_decode() я запускаю цикл foreach() для отображения всех результатов json вместе с кнопкой отправки для каждого результата. Я написал блок mysql INSERT для публикации результатов json. Я пытаюсь выяснить, как назначить каждому результату json уникальный идентификатор, чтобы после нажатия кнопки отправки этот объект JSON был правильно отправлен в мою базу данных. Что происходит в настоящее время с моим кодом, так это то, что публикуется только последнее значение в массиве, а не значение, которое я пытаюсь отправить.

Я пробовал повторять цикл foreach() и использовать итератор в качестве назначенного уникального идентификатора. Не работает. Я попытался создать флажки рядом с кнопками отправки, и это тоже не сработало. Я не уверен, что это мое размещение кода или почему я могу опубликовать только последнее значение в массиве.

<?php

$curl = curl_init();

$provider_first_name = 'Henry';
$provider_last_name = 'Lee';
$provider_state = 'CA';
$provider_postal_code = '';

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://npiregistry.cms.hhs.gov/api?first_name=". $provider_first_name . "&last_name=" . $provider_last_name . "&state=" . $provider_state . "&postal_code=" . $provider_postal_code . "",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",

));

$response = curl_exec($curl);

$json = json_decode($response, TRUE);

/** 10 результатов Генри Ли будут отображаться в цикле foreach() **/

$i = 0;

foreach($json['results'] as $doc){
/** JSON Responses Listed Below **/

  $p_name = $doc['basic']['first_name'] . " " . $doc['basic']['last_name'] . ", " . $doc['basic']['credential'];

  $p_npi = $doc['number'];

  $p_address_one = $doc['addresses'][0]['address_1'];

  $p_address_two = $doc['addresses'][0]['city'] . ", " . $doc['addresses'][0]['state'] . " " . $doc['addresses'][0]['postal_code'];

  $p_skills = $doc['taxonomies'][0]['desc'];

  $p_phone = $doc['addresses'][1]['telephone_number'];

  if(empty($doc['addresses'][1]['telephone_number'])){

    $p_phone = 'Not Available';
  }

  //** Echo Each Array Value In Bordered Card **/

  echo "
       <div class='col-md-4 col-sm-12 wow fadeIn' style='padding-top: 9px;'>
         <div class='card border border-secondary mb-3' style='max-width: 18rem;'>
           <div class='card-header text-center'>
             <i class='fa fa-user-md' aria-hidden='true'></i> $p_name
           </div>
           <div class='card-body text-primary text-center'>

             <p class='card-text text-center'>
               NPI Number: $p_npi
             </p>

             <p class='card-text text-center'>
               $i 
             </p>

             <p class='card-text text-center'>
               <i class='fa fa-map-marker' aria-hidden='true'></i> $p_address_one 
             </p>

             <p class='card-text text-center'>
               $p_address_two 
             </p>

             <p class='card-text text-center'>
               <i class='fa fa-phone cyan-text' aria-hidden='true'></i> $p_phone
             </p>

             <p class='card-text text-center'>
               <i class='fa fa-user-md cyan-text' aria-hidden='true'></i> $p_skills
             </p>
           </div>

           <div class='card-footer' style='height: 73px;''>
             <form action='' method='post' id='".$json['results'][$i]."'>
               <div class='form-group'>
                 <div class='flex-center'>
                   <div class='form-row align-items-center'> 
                     <button class='btn btn-pink btn-sm' name='add_doc' type='submit'><i class='fa fa-trash px-1' aria-hidden='true'></i> Add Provider</button>
                   </div>
                 </div>
               </div>
             </form>
           </div>
         </div> 
       </div>
       ";
       $i++;

 }
?>

<?php

  if(isset($_POST['add_doc'])){

    $add_doc = "INSERT INTO user_posted_providers (user_id, provider_name, provider_npi, provider_address_one, provider_address_two, provider_phone, provider_skills, created_at) VALUES ('$user_id', '$p_name', '$p_npi', '$p_address_one', '$p_address_two', '$p_phone', '$p_skills', NOW())";

    $run_doc = mysqli_query($connection, $add_doc);

    if($run_doc){
      echo "<script>alert('Provider Added')</script>";
      echo "<script>window.open('user_provider_search-r.php','_self')</script>";
    }

  }

?>

Я пытаюсь вставить правильные значения массива с помощью моей кнопки «add_doc» в цикле foreach(), но я могу вставить только последнее значение в массив.


person Cody Long    schedule 07.06.2019    source источник
comment
Я вижу только один вызов для вставки. После вашего foreach($json['results']... Вы имели в виду, что этот последний блок кода может быть внутри цикла?   -  person ficuscr    schedule 07.06.2019
comment
Если я помещу if(isset($_POST['add_doc'])){....} внутри foreach(), то все 10 записей будут отправлены в БД. Я пытаюсь индивидуально выбрать каждую запись для публикации.   -  person Cody Long    schedule 07.06.2019
comment
хорошо, похоже, вы были на правильном пути раньше. Вам нужна кнопка/ссылка после каждого элемента, который вы перечисляете, с надписью «добавить» или что-то еще. Я бы продолжил идею передачи удостоверения личности. Каждый «элемент» имеет уникальный идентификатор, который необходимо отправить, чтобы вы знали, что добавить. Либо флажки и одна кнопка отправки, либо отдельные отправители для каждого элемента. Что бы вы ни предпочли для пользовательского интерфейса.   -  person ficuscr    schedule 07.06.2019
comment
Является ли $doc['number'] уникальным? Что-нибудь на самом деле возвращенное этой службой, что однозначно идентифицирует запись?   -  person ficuscr    schedule 07.06.2019
comment
Да $doc['number'] уникален. Я попытался передать эту переменную в форме как я, а также назначить эту переменную как идентификатор кнопки, но я все еще могу опубликовать только последнюю запись в массиве. Запутался здесь. Не уверен, что я делаю неправильно. Кажется, кнопка отправки может обрабатывать только последнюю отображаемую запись.   -  person Cody Long    schedule 07.06.2019


Ответы (1)


Таким образом, может быть проще объяснить с помощью некоторого кода, который немного упрощен. Я хочу показать вам, как предоставить пользователю форму для выбора, а затем использовать эти выбранные значения при отправке формы.

Похоже, вы понимаете концепцию по большей части. Думаю, я не понимаю, где вы застряли. Давайте посмотрим на этот код, используя флажки и одну форму. Поймите то, чем я поделился, попробуйте реализовать это, дайте мне знать, где/если вы остановитесь.

<?php
//simplified proof of concept...

//your cURL stuff would be here...
$json['results'] = [
    [
        'title' => 'Title A',
        'someIdNumber' => '123'
    ],
    [
        'title' => 'Title B',
        'someIdNumber' => '456'
    ],
    [
        'title' => 'Title C',
        'someIdNumber' => '111'
    ]
];
//...


//Has user submitted their selection? If so handle it
if (!empty($_POST)) {
    //var_dump($_POST);
    /*
    If I check the last two I'd get back the following:
    array (size=1)
      'itemId' => 
        array (size=2)
          456 => string 'on' (length=2)
          111 => string 'on' (length=2)
     */

    //now, loop on the 'results' if in our 'selection'  then do the insert, otherwise skip and check next record...
    foreach($json['results'] as $doc) {
        if (array_key_exists($doc['someIdNumber'], $_POST['itemId'])) {
            echo "selected id: {$doc['someIdNumber']}";
            //in set, do the insert here...
            //$sql = ''....
        } else {
            echo "NOT A selected id: {$doc['someIdNumber']}";
        }
    }    

    return; //->
}



//if user has NOT submitted their selection, then render the form...

echo '<form method="post" action="">';
foreach($json['results'] as $doc) {
    echo "<div>
            <h2>{$doc['title']}</h2>
            <input type='checkbox' name='itemId[{$doc['someIdNumber']}] />';
          </div>
        ";
}

echo '<br/><button type="submit" value="submit">Add Selected</button>';
echo '</form>';

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

person ficuscr    schedule 07.06.2019