2012-03-14 141 views
1

我从MySQL表中拉取数据并将其加载到表单中以编辑(更新)记录。一切都很好,直到我来到复选框。表单中的复选框准确地反映了数据库中相应列中的值。但是当编辑人员修改编辑表单中的复选框时,它不会将数据传递给数据库。我已经阅读了一堆关于堆栈溢出的复选框Q &,但似乎没有找到我在找的东西。对不起,如果这是一个多余的问题。这是代码。使用PHP从复选框更新MySQL数据库

<label for="amenities-beach"> 
<input class="choose" name="amenitiesB" id="amenities-beach" type="checkbox" 
value="<?php echo $row1["amenitiesB"]; ?>" 
<?php echo $row1["amenitiesB"] ? 'checked="checked"' : ''; ?> /> 
&nbsp;Close to Beach</label> 

其中amenitiesB在:

$row1 = mysql_fetch_array($result); 

但是,当我在表单中更改值并提交:

value="<?php echo $row1["amenitiesB"]; ?> 

的是什么已经从DB与返回SELECT语句它什么也不传递给UPDATE语句中的变量。任何想法我失踪?我有6个这些复选框,amenitiesB,amenitiesK,amenitiesS,amenitiesP,amenitiesF,并且首选全部使用相同的代码。任何帮助,将不胜感激。 谢谢你, 戴夫

好吧,这里是代码:表格中的其他所有更新罚款。我试图将它传递给: $ amenitiesB = $ _POST ['amenitiesB'];
后来我把它放到UPDATE语句 Hotels.amenitiesB ='”。$ amenitiesB。 “”, 我的UPDATE语句, $查询=” UPDATE酒店 JOIN surfcup_Rates ON Hotels.id = surfcup_Rates.hotelid SET Hotels.hotel = ' “$酒店”。', 更多列,然后

Hotels.amenitiesB='".$amenitiesB."', 
Hotels.amenitiesB='".$amenitiesK."', 
Hotels.amenitiesB='".$amenitiesS."', 
Hotels.amenitiesB='".$amenitiesP."', 
Hotels.amenitiesB='".$amenitiesF."', 
Hotels.amenitiesB='".$preferred."',  

多个列,则:

WHERE Hotels.id='".$id."'"; 
+0

,你编译和运行UPDATE语句丢失的代码发送方法改变$ _ POST与$ _GET。 – hakre 2012-03-14 18:50:35

+0

1.检查值是否正确嵌入到表单中。 2.检查表单提交时是否将值传递回服务器。 3.检查你是否正确地将它构建到你的sql语句中。 4.检查查询是否实际运行没有错误 – 2012-03-14 18:53:22

+0

我们需要查看更多逻辑以帮助您。 – Crashspeeder 2012-03-14 18:55:47

回答

0

您遇到的问题是因为当复选框未选中时,默认情况下其数据不会传输到您的PHP,这就是为什么UPDATE查询参数为空有问题。 所以您的更新语句之前,你应该有:

$fieldenabled=(bool)(isset($_POST['CHECKBOXNAME']) ? TRUE : FALSE; 

并调用与您的更新查询。

编辑:当然,你可以根据的<form>

+0

哇,这是在这里产生一个布尔值的矫枉过正。 'isset($ _ POST ['CHECKBOXNAME'])'是你所需要的,它将自行产生TRUE或FALSE。你不需要将它转换为'(bool)',它已经是一个布尔值了......你当然不需要再测试它,并在三元运算符中返回TRUE或FALSE。 – Jason 2013-02-26 12:39:50

+0

是的,你理论上是对的,但是在某些条件下,我有过去的问题。比较可以被删除,但是对bool的投射并不会造成伤害,如果你使用===或!== – StormByte 2013-03-06 08:10:33

0

编辑:我觉得我得到的问题,当箱子开始。未选中,输入有一个空值,那么当你检查它时,它会传递一个空值......它永远不会填满你想要的检查值。所以,相反,你需要这样的事:

<input class="choose" name="amenitiesB" id="amenities-beach" type="checkbox" value="amenity B Selected" <?php echo $row1["amenitiesB"] ? 'checked="checked"' : ''; ?> /> 

...不要让“值”属性动态化,否则一旦它变空,它会永远是空的。

原来的答案:

当你说“的形式改变数值”我想你的意思是你取消选中该复选框...当你提交表单选中复选框从来没有发送任何数据。通过检查表单变量是否已经被传递来检查“未检查”状态。

例如:

if (isset($_GET['amenitiesB'])) { 
    // process with the knowledge that "amenitiesB" was checked 
} 
else { 
    // process with the knowledge that "amenitiesB" was unchecked 
} 

如果你的意思是你不小心动态改变的复选框别的东西的“价值”,那我就需要看到的是实现了这个代码。

在复选框中输入了“值”属性的主要目的是,当你传递变量作为数组:

<label for="amenities-beach"> 
    <input class="choose" name="amenities[]" id="amenities-beach" type="checkbox" value="<?php echo $row1["amenitiesB"]; ?>" <?php echo $row1["amenitiesB"] ? 'checked="checked"' : ''; ?> /> 
    &nbsp;Close to Beach 
</label> 

......特别要注意我已经改变了“名”属性从“amenitiesB”改为“amenities []”,如果通过所有设施复选框进行操作,则可以通过$ _GET ['amenities']数组(或$ _POST,if适用)。否则,没有太多理由使用复选框输入的“value”属性,因为只要知道$ _GET ['amenitiesB']被选中(因此与表单一起发送)或未选中(而不是随表格一起发送)。

+0

感谢您的帮助。我不知道这是否有帮助,但是当最初将表格加载到db中的表单时,复选框在amenitiesB列中输入“B”或在amenitiesK列中输入“K”等等。所以当我拉下数据进行编辑时,我认为这个值将是相同的“B”,“k”等。主要是因为编辑表单中的复选框反映了对要编辑的记录的正确检查。所以你所说的是......编辑表单中的复选框只是简单地说选中或不选中,而不是列的实际值。我有什么意义吗? – user316717 2012-03-14 19:51:17

+0

任何额外的上下文总是有帮助。因此,该行使用“amenitiesB”初始化为“B”,然后构建表单,并在处理完所有PHP之后,获得。然后取消选中它,并且希望数据库反映“amenitiesB”=“”。尽我所能收集,应该发生,除非你的未发布的代码中的其他地方有错误。接下来... – Jason 2012-03-15 02:01:23

+0

问题是,当PHP得到处理时,当amenitiesB为空时,复选框将如下所示:(注意空值属性),不管你检查了多少次,你总是会传回一个空值并且永远不会被检查。真的,你应该在数据库中使用布尔值,并忽略HTML中的值属性。 – Jason 2012-03-15 02:04:07