【问题标题】:Insert group only if checkbox is checked仅在选中复选框时插入组
【发布时间】:2013-08-03 11:46:37
【问题描述】:

我有点坚持这一点。仅当单击该组复选框时,我才尝试插入项目组。我已经测试了没有复选框的 SQL 插入,并且 SQL 可以完美地工作并插入数据。但是当我添加复选框和 if/else 语句时,它开始给我带来麻烦。

例如:
- 如果我选择第 1 组而不是第 2 组 - SQL 仅在插入第 1 组数据时才能正常工作
- 如果我选择第 2 组而不是第 1 组 - 插入仍然插入第 1 组数据
- 如果我选择第 1 组和第 2 组 - SQL 插入两行第 1 组数据
- 如果我不选择任何组,那么我会收到“警告:为 /home 中的 foreach() 提供的参数无效...” - 我稍后会整理出来。

我已标记“第 1 组”和“第 2 组”。如果单击复选框,我需要代码仅插入组,并忽略未单击的复选框组。任何帮助都会很棒。谢谢。

我一直在使用以下代码进行测试:

表格:

<form id="Form" method="post" action="/random.php" name="Form">
<input id="itemCurrency" type="hidden" value="2" name="itemCurrency"></input>


<div class="row">
<div class="col-lg-4">
<div class="itemHolder">
<img class="itemImg thumbnail" src="http://images.com/i/images.jpg"></img>
<div class="itemName">swim Shorts Wi...</div><
<div class="itemPrice">$33.33</div>
<div class="itemHref"><a target="_blank" href="http://random.com/product.aspx?id=40"> Visit Item Page </a></div>
</div>
</div>
   //GROUP 1    
     <input id="itemCheckBox[]" type="checkbox" value="checked" name="itemCheckBox[]"></input>
     <input id="itemName[]" type="hidden" value="some random text" name="itemName[]"></input>
     <input id="itemHref[]" type="hidden" value="http://random.com/product.aspx?id=2140" name="itemHref[]"></input>
     <input id="itemImg[]" type="hidden" value="http://images.com/i/image1s.jpg" name="itemImg[]"></input>
     <input id="itemPrice[]" type="hidden" value="$37.33" name="itemPrice[]"></input>
   //END GROUP 1    

<div class="col-lg-4">
<div class="itemHolder">
<img class="itemImg thumbnail" src="http://images.com/i/image_xl.jpg"></img>
<div class="itemName">Bomber Jacket With Fur</div>
<div class="itemPrice"> $88.88</div>
<div class="itemHref"><a target="_blank" href="http://random.com/Bomber-Jacket-With-fur/..">Visit Item Page</a></div>

</div>
</div>
   //GROUP 2
     <input id="itemCheckBox[]" type="checkbox" value="checked" name="itemCheckBox[]"></input>
     <input id="itemName[]" type="hidden" value="Bomber Jacket With Fur" name="itemName[]"></input>
     <input id="itemHref[]" type="hidden" value="http://random.com/Bomber-Jacket-With-fur/.." name="itemHref[]"></input>
     <input id="itemImg[]" type="hidden" value="http://images.com/i/image_xl.jpg" name="itemImg[]"></input>
     <input id="itemPrice[]" type="hidden" value="$88.88" name="itemPrice[]"></input>
   //END GROUP 2


     <input id="site" type="hidden" value="1" name="site"></input>
     <input id="submit_form" type="submit" value="yes" name="submit_form"></input>
</form>

PHP

if($submitForm == "yes" && $site == "1") {

foreach($_POST['itemCheckBox'] as $key => $val)
          {
   $fields[] = array(
      'itemCheckBox'=>$_POST['itemCheckBox'] [$key],
      'itemName' =>$_POST['itemName'] [$key],
      'itemHref' =>$_POST['itemHref'] [$key],
      'itemImg' =>$_POST['itemImg'] [$key],
      'itemPrice' =>$_POST['itemPrice'][$key] );

      //Remove non numaric characters from price(leave commas).
      $itemPrice = preg_replace('/[^0-9,.]/s', '', $itemPrice);

    //Data fields not in form
       $userId = "username";
       $userIp = $_SERVER['REMOTE_ADDR'];
       $itemType = "ADD LATER";
       $itemOutFit = "ADD LATER";
       $site = "1";
       $itemSale = "1";

      //Only insert if checkbox is clicked --NOT WORKING, ????
     if (isset($_POST['itemCheckBox'])){
            echo "CHECKED";
            echo "<br>";
    /*** INSERT data ***/
     $sql = "INSERT INTO items (userId,itemHref,itemImg,itemPrice,itemName,userIp,itemSite,itemType,itemCurrency,itemOutFit,itemSale) VALUES (:userId,:itemHref,:itemImg,:itemPrice,:itemName,:userIp,:itemSite,:itemType,:itemCurrency,:itemOutFit,:itemSale)";
      $q = $conn->prepare($sql);
            $q->execute(array(':userId'=>$userId, 
                ':itemHref'=>$itemHref[$key], 
                ':itemImg'=>$itemImg[$key], 
                ':itemPrice'=>$itemPrice[$key], 
                ':itemName'=>$itemName[$key], 
                ':userIp'=>$userIp, 
                ':itemSite'=>$itemSite, 
                ':itemType'=>$itemType,
                ':itemCurrency'=>$itemCurrency,
                ':itemOutFit'=>$itemOutFit,
                ':itemSale'=>$itemSale));   

                               } else  {
                               echo "NOT CHECKED";
                               echo "<br>";

                               }

/*  
echo $conn->errorCode();
echo "<br>"; ('SET CHARACTER SET utf8')
echo $conn->errorInfo();
echo "<br>";
//die(print_r($q->errorInfo(), true));
 */                
                         }

更新 试图将 php 剥离为基本代码,但仍然没有成功。做同样的事情....任何人都知道我该如何解决这个问题。

            foreach($_POST['itemCheckBox'] as $key => $val)
                       {
                       $i = 0;
            $itemCheckBox = $_POST['itemCheckBox'];
            $itemName = $_POST['itemName'];
            $itemHref = $_POST['itemHref'];
            $itemImg = $_POST['itemImg'];
            $itemPrice = $_POST['itemPrice'];

  echo $i;
  echo "<br>";     
  $i = $i +1;

                     if (isset($_POST['itemCheckBox'])){
                                                 echo "<br>";
                                                         echo "CHECKED";
                                                         echo "<br>";
                echo "<br>";
                echo $itemCheckBox[$i];     
                echo "<br>";
        echo $itemName[$i];    
            echo "<br>";
        echo $itemHref[$i];  
            echo "<br>";
        echo $itemImg[$i];  
            echo "<br>";
                echo $itemPrice[$i];   

                         } else  {
                       echo "NOT CHECKED";
                       echo "<br>";
                       $i = $i +1;

                       }

               }

【问题讨论】:

  • 尝试在所有情况下输出$_POST数据,看看你有什么。问题是,如果您不选择任何复选框,或者只选择 1 - 其他数据 (itemName, itemHref) 仍将作为数组发布,并且每个都有 2 个元素。
  • 代码中是否使用了 $fields 数组?我看到很多变量,比如 $itemPrice 和 $itemImg,应该是 $fields[$key]['itemPrice'] 和 $fields[$key]['itemImg']?
  • LEVI- 我已经改变了你说的变量名,但是当我尝试插入时它仍然做同样的事情。
  • 如果你 print_r($fields[$key]);在您执行查询之前,它是否显示正确的数据,还是不正确? (在 $q = $conn->prepare($sql); 的那一行之后)
  • @u_mulder - 我认为这是问题所在,但我不知道如何解决它。把我的头发拉到这里来。在过去的几个小时里尝试了各种各样的事情......但没有运气。

标签: php sql forms


【解决方案1】:

我发现可能导致该问题的几件事:

  1. 在您的 PHP 中,您有一行包含以下内容:

    //Remove non numaric characters from price(leave commas).
    $itemPrice = preg_replace('/[^0-9,.]/s', '', $itemPrice);
    

    我没有看到 $itemPrice 是在哪里定义的,应该是:

    $itemPrice = preg_replace('/[^0-9,.]/s', '', $fields['itemPrice']);
    
  2. 您获得“警告:在 /home... 中为 foreach() 提供的参数无效”的问题可以通过检查以确保它存在并且是循环前的数组来解决。您可以使用 !empty() 和 is_array() 来检查。

    if(!empty($_POST['itemCheckBox']) 和 is_array($_POST['itemCheckBox'])){}

附带问题: 您输入的 ID 都是相同的,“itemCheckBox[]”、“itemName[]”等都是用于所有这些的相同 ID。如果您想正确使用javascript或css,这可能会导致将来出现问题。

编辑: 在您修改后的示例中,问题是每次循环进入循环时都会设置 $i=0 ,因为您在 foreach 的顶部声明了它。如果您重新使用 $key 作为索引,它应该可以工作。见下文:

//GROUP 1 checkbox
     <input id="itemCheckBox[]" type="checkbox" value="0" name="itemCheckBox[]"></input>

//GROUP 2 checkbox
     <input id="itemCheckBox[]" type="checkbox" value="1" name="itemCheckBox[]"></input>

我还建议您调整 HTML 项目以匹配您传递的密钥:

<input id="itemName[1]" type="hidden" value="Bomber Jacket With Fur" name="itemName[]"></input>
     <input id="itemHref[1]" type="hidden" value="http://random.com/Bomber-Jacket-With-fur/.." name="itemHref[]"></input>
     <input id="itemImg[1]" type="hidden" value="http://images.com/i/image_xl.jpg" name="itemImg[]"></input>
     <input id="itemPrice[1]" type="hidden" value="$88.88" name="itemPrice[]"></input>


foreach($_POST['itemCheckBox'] as $key => $val) {
  $itemCheckBox = $_POST['itemCheckBox'];
  $itemName = $_POST['itemName'];
  $itemHref = $_POST['itemHref'];
  $itemImg = $_POST['itemImg'];
  $itemPrice = $_POST['itemPrice'];


  if (isset($_POST['itemCheckBox'])){
      echo "<br>";
      echo "CHECKED";
      echo $itemCheckBox[$key];
      echo "<br>";
      echo "<br>";
      echo $itemCheckBox[$itemCheckBox[$key]];     
      echo "<br>";
      echo $itemName[$itemCheckBox[$key]];    
      echo "<br>";
      echo $itemHref[$itemCheckBox[$key]];  
      echo "<br>";
      echo $itemImg[$itemCheckBox[$key]];  
      echo "<br>";
      echo $itemPrice[$itemCheckBox[$key]];   

    } else  {
      echo "NOT CHECKED";
      echo "<br>";
    }

}

【讨论】:

  • 感谢您的意见,我已经按照您的建议进行了更改。我只在“测试”期间留下了相同的 ID。在我让所有的 PHP 顺利运行之后,我打算做一些这样的改变 :)
  • 感谢您的帮助...我尝试了该代码,但它仍然没有提供正确的信息。如果我只选择“第 2 组”,由于某种原因,它仍然会给出“第 1 组”数据。如果设置了 itemCheckBox,几乎就像数组 [$key] 只会增加 1。我试图将 $key++ 添加到 else 部分来解决这个问题,但它没有用....
  • 啊,不敢相信我忽略了这一点。由于项目的所有信息都在隐藏的输入中,所有这些都会被传入。所以当只有一个复选框被选中时,它将从第一个项目中提取。当两者都进入时,有足够的“钥匙”可以从两者中拉出。您是否可以为项目添加密钥?我用一个例子修改了上面的答案。这会更好地将您的复选框绑定到项目信息。
  • 完成,效果很好...感谢您的耐心和帮助。就在时间的紧要关头,再长一点,我就不会留下任何头发了哈哈......为你+10业力;)
猜你喜欢
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多