2010-07-01 40 views
0

我有一个选择列表,如下面的表格。选择列表,并在SQL中提交一个NULL

<select name="0[voicemail]" > 
<option value="" selected="selected"></option> 
<option value="800">800</option> 
<option value="801">801</option> 
<option value="802">802</option> 
<option value="803">803</option> 

<option value="805">805</option> 
<option value="807">807</option> 
<option value="808">808</option> 
<option value="809">809</option> 
<option value="810">810</option> 
<option value="811">811</option> 
<option value="820">820</option> 
<option value="830">830</option> 
<option value="831">831</option> 

<option value="9778">9778</option> 
<option value="9995">9995</option> 
</select> 

这是由一些Kohana PHP代码生成的。

 $id = 0; 
     $disabled = ''; 
     foreach ($line_detail as $line){ 
      echo '<tr class="d'.($id & 1).'">'; 
      echo '<td>'.$line->did.form::hidden($id."[did]", $line->did).'</td>'; 
      echo '<td>'.form::input($id."[cid_prefix]", $line->cid_prefix).'</td>'; 
      echo '<td>'.$line->type.'</td>'; 
      echo '<td>'.form::input($id."[ivr_context]", $line->ivr_context, "disabled='true'").'</td>'; 

      if ($line->ivr_context != ''){ 
       $disabled = "disabled='true'"; 
       echo '<td>'.form::input(array('name'=>$id."[dial_timeout]", 'size'=>15, 
              'maxlength'=>3), $line->dial_timeout, $disabled). 
        form::hidden($id."[dial_timeout]", $line->dial_timeout).'</td>'; 

       echo '<td>'.form::dropdown($id."[voicemail]", $phones, $line->voicemail, $disabled). 
        form::hidden($id."[voicemail]", $line->voicemail).'</td>'; 
      } else { 
       echo '<td>'.form::input(array('name'=>$id."[dial_timeout]", 'size'=>15, 
              'maxlength'=>3), $line->dial_timeout, $disabled).'</td>'; 
       echo '<td>'.form::dropdown($id."[voicemail]", $phones, $line->voicemail, $disabled).'</td>'; 
      } 

      echo '<td>'.form::input($id."[notes]", $line->notes).'</td>'; 
      echo "</tr>"; 
      $id++; 
     } 

并非所有都显示,但基本上这些选项都在$ phones变量中。

现在的问题。 当我使用表单提交时,一切都很好,直到我选择提交中的空值。 这是$细节等同于$ _ POST

foreach($detail as $key => $val){ 
     $this->db->query("UPDATE dids SET cid_prefix=?, dial_timeout=?, voicemail=?, notes=? WHERE did=?", 
     array($val['cid_prefix'], 
      $val['dial_timeout'], 
      $val['voicemail'], 
      $val['notes'], 
      $val['did']));     

这里的问题是,我设置为空选项的值是“NULL”的方法里面,但因为Kohana中增加了周围的一切逗号它插入它将尝试将“NULL”放入数据库而不是NULL。在这种情况下,这将违反外键约束。

是否有一种简单的方法来处理PHP/Kohana中的NULL,这样我就不必检查空白并重写每个可能包含NULL的查询一次以上。 当你可以得到多个有效的NULL时会发生什么?肯定有办法简单地处理这些类型的情况?

回答

0

在数据库更新之前放置此代码似乎可解决此问题。即将$ val ['voicemail]设置为PHP常量NULL。

if (empty($val['voicemail'])){ 
    $val['voicemail'] = NULL; 
} 

然后我可以继续使用原始的SQL语句。 Kohana似乎在更新语句中表现自己并且设置了NULL。

0

您可以使用DB::expr方法,该方法不会转义查询中的值。这样你插入一个原始的NULL

但是,我很惊讶你已经使用了一个面向对象的框架,但通过创建一个窗体混乱缩小了所有的优点。就业保障?

+0

没有。其实我不认为这种形式很丑陋。我看到了更糟的情况。也许你可以给我一个更好的方法? – Matt 2010-07-04 22:09:43