【问题标题】:PHP foreach() loop then Insert Single Array Value to MySQL DB with Submit ButtonPHP foreach() 循环然后使用提交按钮将单个数组值插入 MySQL DB
【发布时间】:2019-10-23 07:11:54
【问题描述】:

在 json_decode() 之后,我运行一个 foreach() 循环来显示所有 json 结果以及每个结果的提交按钮。我写了一个 mysql INSERT 块来发布 json 结果。我试图弄清楚如何为每个 json 结果分配一个唯一的 ID,以便在我单击提交按钮后,该 JSON 对象会正确发布到我的数据库中。我的代码当前发生的情况是,只有数组中的最后一个值被发布,而不是我尝试提交的值。

我尝试迭代 foreach() 循环并将迭代器用作分配的唯一 ID。没用。我尝试在提交按钮旁边创建复选框,但这也没有成功。我不确定这是我的代码放置还是为什么我只能发布数组中的最后一个值。

<?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 个 Henry Lee 结果将从 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>";
    }

  }

?>

我正在尝试使用 foreach() 循环中的“add_doc”按钮插入正确的数组值,但我只能插入数组中的最后一个值。

【问题讨论】:

  • 我只看到一个插入调用。在您的foreach($json['results']... 之后,您的意思是让最后一段代码循环中吗?
  • 如果我将 if(isset($_POST['add_doc'])){....} 放在 foreach() 中,那么所有 10 条记录都会发布到 db。我正在尝试单独选择要发布的每条记录。
  • 好的,听起来您之前的思路是正确的。您需要在列出的每个项目后添加一些按钮/链接,上面写着“添加”或其他内容。我会追求传递身份证的想法。每个“项目”都有一个唯一的 ID,需要提交这些 ID,以便您知道要添加哪个。复选框和一个提交按钮,或每个项目的单个提交者。用户界面随心所欲。
  • $doc['number'] 是唯一的吗?此服务实际返回的任何唯一标识记录的内容?
  • 是的 $doc['number'] 是唯一的。我尝试以 Id 的形式传递此变量,并将此变量分配为按钮 id,但仍然只能发布数组中的最后一条记录。这里很困惑。不知道我做错了什么。看来提交按钮只能处理显示的最后一条记录。

标签: php arrays json mysqli php-curl


【解决方案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>';

使用提供的实际 ID 比在循环中使用一些计数更好,因为无法真正保证此服务返回的结果与处理表单提交时呈现的表单相同。 HTTP 是一个无状态协议等等。

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2013-04-09
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多