代码之家  ›  专栏  ›  技术社区  ›  hookenz

选择具有在SQL中提交的空值的列表

  •  0
  • hookenz  · 技术社区  · 14 年前

    我在表单中有一个如下所示的选择列表。

    <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变量中。

    现在问题来了。 当我使用表单提交时,在选择提交中的空值之前,一切都可以。 这是一个方法,其中$detail等同于$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']));                   
    

    这里的问题是,我将空选项的值设置为“空”,但是因为Kohana在它插入的所有内容周围添加了逗号,所以它将尝试将“空”放入数据库而不是空。在这种情况下,这将违反外键约束。

    在php/kohana中,是否有一种简单的方法来处理空值,这样我就不必检查空值并重写可能多次包含空值的每个查询。 当您可以得到多个有效的空值时会发生什么?当然有办法简单地处理这些情况吗?

    2 回复  |  直到 14 年前
        1
  •  0
  •   hookenz    14 年前

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

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

    然后我可以继续使用原始的SQL语句。Kohana似乎表现得很好,在update语句中设置了空值。

        2
  •  0
  •   The Pixel Developer    14 年前

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

    然而,我很惊讶你使用了一个面向对象的框架,却通过创建一个混乱的表单而放弃了所有的优势。工作安全?