检索存储为数组的多个复选框

时间:2011-07-07 22:13:24

标签: php

我正在处理一个包含多个复选框的表单(每个复选框都有自己的值)。最后一个复选框标记为“其他”,当选中它时,应该出现一个文本输入,让用户写下他/她自己的值。

<input name="pVital[]" type="checkbox" id="pVital[]" value="I &amp; O" />I &amp; O<br/>
<input name="pVital[]" type="checkbox" id="pVital[]" value="Daily Weight" />Daily Weight<br/>
<input name="pVital[]" type="checkbox" id="pVital[]" value="Foley Catheter" />Foley Catheter<br/>
<input name="pVital[]" type="checkbox" id="pVital[]" onClick="showHide(whatever);" value="" />Other<br/>
<input name="pVital[]" type="text" id="whatever" style="visibility: hidden;" />

我使用php的implode函数将所有这些值插入到我的数据库中的相同字段中,作为字符串数组:

if ((isset($_POST['pVital']))){
    array_walk($spVital, 'GetSQLValueString');
    $spVital = implode(',',$_POST['pVital']);   
}

$insertSQL = sprintf("INSERT INTO admissionorder (VitalSigns) VALUES (%s)",
                      GetSQLValueString($spVital, "text"));

mysql_select_db($database_PPS, $PPS);
$Result1 = mysql_query($insertSQL, $PPS) or die(mysql_error());

这适用于插入,但我在检索这些复选框时遇到问题...如果合适,请使用“其他”文本输入。

2 个答案:

答案 0 :(得分:0)

好吧,我可以看到几个问题。

首先,第2行的array_walk没有做任何事情,因为它在空数组上运行?串?然后被破坏了。你应该沿着$ _POST元素走,然后冒了什么结果。

其次,如果有人检查那个“其他”的方框,你将在pVital中获得一个额外的空条目,这是一个更加尴尬的方式来确定该方框已被检查而不是给它自己的不同名称。

第三,你将一堆离散值折叠到一个文本字段中,然后期望能够解压缩文本字段 - 可能是通过沿逗号爆炸它? - 并且返回离散值,这是有问题的。

如果您实际控制数据库,我建议在模式之后制作一个表

admission_vital_signs(
    admission_order_id INT, 
    vital_sign_text VARCHAR, 
    is_free_text BOOL)

保留所说的离散值。

如果您不控制数据库但控制输出机制我建议使用自然界中没有出现的分隔符 - 管道“|”通常对此有好处 - 所以你至少可以干净利落地拆分东西,并且可以用FREETEXT ::(“::”在自然界中通常也找不到)任何自由文本前言,这样你就可以在它出现时识别它。

如果您不控制数据库或输出机制,则需要使用您必须使用的输出机制来编辑原始帖子。

编辑:

好吧,如果我理解正确的话,你是从数据库中检索这些数据并尝试从中解决这个问题,你是否应该在回发时勾选相应的方框,这样你就可以控制输出机制。以下一组说明假定您不控制数据库;如果你这样做,那么建造一张新桌子就是去这里的方法,但这种方法还是值得的。

将复选框命名为其他“pVitalOther”,值为“1”,文本字段为“pVitalOtherText”。没有括号。这里有一些进入和退出的伪代码。

if isset($_POST['pVitalOther'])
    $_POST['pVital'][] = "FREETEXT::{$_POST['pVitalOtherText']}";

$pvitals = implode('|', array_walk('MySQLEscape', $_POST['pVital']));
//and store $pvitals in the database

当你回来时:

$pvitals = explode('|', $row['VitalSigns']);
$pvitals_last = $pvitals[count($pvitals)-1];
if strstr("FREETEXT", $pvitals_last)
    $lastparts = explode('::', $pvitals_last);
    $pvitalOther = true;
    $pvitalOtherText = $lastparts[1];

然后当你在一些PHP中构建复选框管道时,就像

一样
<? php if (in_array('Daily Weight', $pVital)) echo "checked"; ?>

直接进入那些固定值复选框标签的中间位置。基于pVitalOther为您的“其他”做同样的事情,并设置自由文本输入字段的相应初始可见性和值。

答案 1 :(得分:0)

这对我有用:

<?php 
    $pvitals = explode('|', $row_pInfoRecordset['VitalSigns']);
?>

然后:

<input name="pVital[]" type="checkbox" id="pVital[]" value="I &amp; O" checked="<?php if (in_array('I &amp; O', $pvitals)) echo "checked"; else echo "unchecked"; ?>" />I &amp; O<br/>
  <input <?php if (in_array('Daily Weight', $pvitals)) echo "checked"; else echo "unchecked";  ?> name="pVital[]" type="checkbox" id="pVital[]" value="Daily Weight" />Daily Weight<br/>
  <input <?php if (in_array('Foley Catheter', $pvitals)) echo "checked"; else echo "unchecked"; ?> name="pVital[]" type="checkbox" id="pVital[]" value="Foley Catheter" />Foley Catheter<br/>
  <input <?php if (in_array('other', $pvitals)) echo "checked"; else echo "unchecked"; ?> name="pVital[]" type="checkbox" id="other" onClick="showHide(whatever);" value="other" />Other<br/>
    <input name="pVital[]" type="text" id="whatever" <?php if (in_array('other', $pvitals)) { $vis = 'style="visibility: visible;"'; echo $vis; ?> <?php } else { ?> style="visibility:hidden" <?php } ?>  value="<?php if (in_array('other', $pvitals)) echo end($pvitals); ?>">