只有选中

时间:2016-04-14 07:43:26

标签: php html checkbox foreach

我正在处理以下代码,以便从表单中选择复选框。如果我检查第一个复选框,一切都很好。如果我选中另一个复选框,则在发送bulkcopy表单时会出现“未定义索引”错误。请记住,我正在使用post方法获取复选框,并且由于表单位置和字段的复杂性,提交按钮位于复选框上方。我需要的是选择多个复选框并将某些值添加到数据库中。

<?php //bulkcopy.php

  session_start();
  if($_SESSION['admin_logged_in'] != true){
    header("Location:login.html");
    exit();
  }
  include 'db.php';

  $from = mysql_real_escape_string($_GET['from']);
  $room = mysql_real_escape_string($_POST['room']);

  if(!empty($_POST['id'])) {
    foreach($_POST['id'] as $check) {
      $id = $check;

      $sel = mysql_query("select * from $from where id = '$id' limit 1 ") or die(mysql_error());

      while($row = mysql_fetch_array($sel)){
        $preview = $row['preview'];
        $text = $row['text'];
        $title = $row['title'];
        $images = $row['images'];
      }

      $ins = mysql_query("insert into $room (id, preview, text, title, images) values (' ', '$preview', '$text', '$title', '$images') ") or die(mysql_error());

    }

    header("Location:admin.php");
  }

?>

表格的代码可以在下面找到:

<form class="form-inline" name="bulkcopy" method="post" action="bulkcopy.php?from=sights"> <b>Bulk Copy:</b> 
    <select name='room' class="form-control">
        <option>Select...</option>
        <option value="Orhan">Orhan</option>
        <option value="Deniz">Deniz</option>
        <option value="Irini">Irini</option>
        <option value="Katina">Katina</option>
        <option value="Gulbin">Gulbin</option>
        <option value="Mihalis">Mihalis</option>
    </select>
    <input class="btn btn-primary" type="submit" name="submit" value="Go"><br /><br />
</div>
<table class="table table-bordered table-striped">
    <th>Entry Name</th>
    <th>Display Order</th>
    <th>Copy to...</th>
    <th>Status</th>
    <th>Image</th>
    <th>Edit</th>
    <th>Delete</th>
    <th>Duplicate</th>

    <?php while($row = mysql_fetch_array($sel)) { ?>
    <tr>
        <td>
            <input type="checkbox" name="id[]" value="<?php echo $row['id']; ?>">
            </form>
            <?php echo $row['title']; ?>
        </td>
        <td>
            <form name="order" method="post" action="sightorder.php?id=<?php echo htmlspecialchars($row['id']); ?>">
                <div class="col-md-4">
                    <input class="form-control" type="number" name="order" value="<?php echo htmlspecialchars($row['ordernum']); ?>">
                </div>
                <div class="col-sm-3">
                    <input type="submit" name="submit" value="Set Order" class="btn btn-primary">
                </div>
            </form>
        </td>
        <td>

            <form name="copyto" method="post" action="copyto.php?from=sights&id=<?php echo htmlspecialchars($row['id']); ?>">
                <input type="checkbox" name="room[]" value="Orhan"> O -
                <input type="checkbox" name="room[]" value="Deniz"> D -
                <input type="checkbox" name="room[]" value="Irini"> I -
                <input type="checkbox" name="room[]" value="Katina"> K -
                <input type="checkbox" name="room[]" value="Gulbin"> G -
                <input type="checkbox" name="room[]" value="Mihalis"> M 
                <input type="submit" name="submit" value="Copy" class="btn btn-primary">
            </form>

        </td>
        <td>
            <a href="sightstatus.php?id=<?php echo htmlspecialchars($row['id']); ?>&status=<?php echo $row['status']; ?>"><?php if($row['status'] == 1){ ?><i class="fa fa-check fa-lg"></i><?php }else{ ?><i class="fa fa-times fa-lg"></i><?php } ?></a>
        </td>
        <td>
            <a href="sightimages.php?id=<?php echo $row['id']; ?>"><i class="fa fa-image fa-lg"></i></a>
        </td>
        <td>
            <a href="editsight.php?id=<?php echo htmlspecialchars($row['id']); ?>"><i class="fa fa-edit fa-lg"></i></a>
        </td>
        <td>
            <a onclick="return confirmDelete()" href="delsight.php?id=<?php echo htmlspecialchars($row['id']); ?>"><i class="fa fa-trash fa-lg"></i></a>
        </td>
        <td>
            <a href="duplicatesight.php?id=<?php echo htmlspecialchars($row['id']); ?>"><i class="fa fa-copy fa-lg"></i></a>
        </td>
    </tr>
    <?php } ?>
</table>

非常感谢任何帮助。 感谢。

8 个答案:

答案 0 :(得分:2)

你这里有问题

<?php
    while($row = mysql_fetch_array($sel)){ ?>
        <tr><td><input type="checkbox" name="id[]" value="<?php echo $row['id']; ?>"> <?php echo $row['title']; ?></td></form>

while循环没有右括号,并且在添加第一个复选框后关闭表单。因此,如果未选中该复选框,则不会发布输入,因此未定义索引。确保在添加完所有行之后才关闭表单,如此

<?php
    while($row = mysql_fetch_array($sel)){ ?>
        <tr><td><input type="checkbox" name="id[]" value="<?php echo $row['id']; ?>"> <?php echo $row['title']; ?></td></tr>
<?php } ?>
  </table>
</form>

答案 1 :(得分:1)

在审核了您提供的完整页面的raw HTML后,很明显问题是您正在尝试嵌套多个无效HTML格式的表单。有关更多信息,请参阅this answer。这个答案确实链接到a workaround,但这是一个丑陋的黑客,应该可以避免。

我相信您的案例中适当的,有效的HTML解决方案是使用单一表单。目前,您有多个嵌套表单提交到以下位置:

  1. bulkcopy.php从=景点?
  2. sightorder.php?ID = 1
  3. copyto.php从=视域&安培;?ID = 1
  4. copyto.php从=视域&安培;?ID = 46
  5. 等...
  6. 您可以执行的操作是使用单个表单,根据单击的提交按钮确定要执行的操作。例如:

    switch ($_POST['submit']) {
        case 'Go':
            // process bulkcopy
            break;
    
        case 'Set Order':
            // process siteorder
            break;
    
        // etc...
    }
    

答案 2 :(得分:0)

如果你的变量复选框是一个表$ _POST ['id'] 当你这样做的时候

__tostring__

如果你没有检查第一个输入第一个变量

foreach($_POST['id'] as $check) {
  $id = $check;
  ...
}

你可以在foreach中做另一个条件

$check = $_POST['id']['0'];  // is empty

答案 3 :(得分:0)

在上次生成的html中,您要提交的输入不在bulkcopy格式内。正如其他人指出你应该改变你的html标记。一个快速的方法来使这项工作而不改变你的标记是使用javascript.Just添加到你的html的底部。它将采取你想要提交的输入并附加它们到bulkcopy表格。

    <script>
    $(document).ready(function(){
     $('form[name="bulkcopy"]').submit(function( event ) {
     $('input[name="id[]"]').clone().hide().appendTo($(this) );
   });
   });
    </script>

此外,在尝试访问它们并使用它们插入数据库之前,你应该使用mysql_num_rows()检查你是否真的有结果。你的代码的问题是里面的变量

 while($row = mysql_fetch_array($sel)){
   ....
   }
如果结果集为空,则永远不会定义

。但是,虽然它们从未被定义过,但您稍后会尝试在插入查询中使用它们。所以只需检查您是否有结果:

 <?php
session_start();
 if($_SESSION['admin_logged_in'] != true){
  header("Location:login.html");
  exit();
}
 include 'db.php';

$from = mysql_real_escape_string($_GET['from']);
$room = mysql_real_escape_string($_POST['room']);

if(isset($_POST['id'])&&!empty($_POST['id'])) {
foreach($_POST['id'] as $check) {
  if(empty($check)) continue;
  $id = $check;

  $sel = mysql_query("select * from $from where id = '$id' limit 1 ") or die(mysql_error());

if(mysql_num_rows($sel)>0){
  while($row = mysql_fetch_array($sel)){
    $preview = $row['preview'];
    $text = $row['text'];
    $title = $row['title'];
    $images = $row['images'];
 }

  $ins = mysql_query("insert into $room (id, preview, text, title, images) values (' ', '$preview', '$text', '$title', '$images') ") or die(mysql_error());

 }

}

header("Location:admin.php");
}

?>

答案 4 :(得分:0)

您的表单不会POST输入名称为&#39; room&#39;。因此,当您尝试使用此行$room = mysql_real_escape_string($_POST['room']);进行检查时,$_POST数组中没有带有索引&#39; room&#39;的项目,因此未定义的索引错误。

要调试此类事情,分析表单提交的请求/响应标头会很有帮助。如果您使用Chrome,请按Ctrl + Shift + I打开开发者控制台,选择“网络”标签,然后在提交表单时,查看弹出的条目的详细信息。您将能够在此处看到所发送内容的名称和值,并让您了解出现问题的地方。其他浏览器都可用,每个浏览器都有自己的版本。

此外,在访问您未定义的任何变量之前,或者不能依赖(例如表单提交)之前,您应该使用isset()确保变量在使用之前存在 - 这将阻止您获得的错误,并允许您更容易地发现它出错的地方:

if (!isset($_POST['room'])) {
  print('Please select something');
} else {
  $room = $_POST['room']; // technically not needed tho :p
  //...
}

答案 5 :(得分:0)

  <form bulkcopy>
  ....

  <table>
  <?php while: ?>
      // </form> it must be deleted
      ...
      <div sightorder>
         ...
         <input submit onclick="return send_sightorder(this);">
      </div>

      ...
      <div copyto action="copyto.php?from=sights&id=<?php echo htmlspecialchars($row['id']); ?>">
          ...
          <input submit onclick="return send_copy(this);">
      </div>

  <?php end while ?>
  </table>
  </form> // bulkcopy's close tag 
  <script>
     /// Function send_sightorder is same.
     function send_copy(clicked_element) {
         var form = clicked_element.parent;
         var inputs = form.getElementsByTagName("input");
         var data = inputs[0].name + "=" + inputs[0],checked + "&";
         var URL = window.location.host + form.getAttribute("action");     

         for (i=1; i<inputs.length-1; ++i) {
             data = "&" + inputs[i].name + "=" + inputs[i].checked + "&";
         }

         xmlhttp = new XMLHttpRequest();
         xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
               // redirect to new page or something else ...
               window.location = URL;
            }
         }
         xmlhttp.open("POST", URL,true);
         xmlhttp.send(data);

         return false;
     }
  </script>

答案 6 :(得分:0)

你是callling,sightorder.php还是copyto.php?通过哪个提交按钮,设置订单或复制?

在这两种情况下,您都是通过GET而不是通过POST发送ID。

哪一行产生错误?

卢卡

答案 7 :(得分:0)

你自己造成了问题。

据我所知,您发送多个列的复选框时出现问题&#34;条目名称&#34;使用&#34;批量复制按钮&#34;。

它应该如何运作。这是因为您正在关闭表单&#34;显示顺序&#34;专栏,实质上是它只有第一个复选框。如果您要将所有选中的复选框发布到&#34; bulkcopy&#34;脚本,您必须将其声明为所有复选框的单独表单,或者使用JS,例如。使用你包含的jQuery:

// how to collect checked ids of checkboxes.
var ids = [];
var boxes = $('input[name="id[]"]');
for(var i in boxes) {
  if(boxes[i].checked) {
    ids.push(boxes[i]);
  }
}

用例如上面的东西挂钩。您的sumbit按钮的on('click')。在这里,有一些例子如何使用JS准备和发送表单。

修改

还有更简单的方法。您必须在表单中添加id

<form class="form-inline" name="bulkcopy" id="bulkcopy" method="post" action="bulkcopy.php?from=sights">

并将您的复选框设置为由其拥有:

<input type="checkbox" name="id[]" value="1"  form="bulkcopy">
<input type="checkbox" name="id[]" value="46"  form="bulkcopy">

应该可以轻松解决您的问题。

别忘了删除多余的表格结束标签:

// -----------------------------------------------------------v
<input type="checkbox" name="id[]" value="1" form="bulkcopy"></form>

他们以后可能很容易破坏您的解决方案。在提交按钮后立即关闭:

    <input class="btn btn-primary" type="submit" name="submit" value="Go"><br /><br />
</form>