我正在处理以下代码,以便从表单中选择复选框。如果我检查第一个复选框,一切都很好。如果我选中另一个复选框,则在发送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>
非常感谢任何帮助。 感谢。
答案 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解决方案是使用单一表单。目前,您有多个嵌套表单提交到以下位置:
您可以执行的操作是使用单个表单,根据单击的提交按钮确定要执行的操作。例如:
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>