2010-07-01 2 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 변수에 있습니다.

이제 문제가 발생했습니다. 양식을 사용할 때 제출시 빈 값을 선택하기 전까지는 모두 괜찮습니다. 이 $ 세부 여기서 문제는 내가 "NULL을"로 빈 옵션에 대한 값을 설정한다는 것입니다 $ _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은 모든 주위에 쉼표를 추가하기 때문에 그것을 삽입 NULL 대신 데이터베이스에 "NULL"을 넣으려고합니다. 이 경우 외래 키 제약 조건을 위반하게됩니다.

PHP/Kohana에서 NULL을 처리하는 간단한 방법이 있으므로 한 번 이상 NULL을 포함 할 수있는 각 쿼리를 비워 두거나 다시 작성할 필요가 없습니다. 여러 유효한 NULL을 얻을 수있을 때 어떻게됩니까? 분명히 이러한 유형의 상황을 간단하게 처리 할 수있는 방법이 있습니까?

답변

0

데이터베이스 업데이트 전에이 코드를 배치하면 문제가 해결 된 것으로 보입니다. 나는. $ val [ 'voicemail]을 PHP 상수 NULL로 설정하십시오.

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

그런 다음 원본 SQL 문을 계속 사용할 수 있습니다. Kohana는 자체적으로 작동하는 것처럼 보이고 NULL은 update 문에서 설정됩니다.

0

쿼리의 값을 이스케이프 처리하지 않는 DB::expr 메서드를 사용할 수 있습니다. 그런 식으로 원시를 삽입하십시오. NULL

그러나 객체 지향 프레임 워크를 사용했지만 폼의 엉망진창을 만들면 모든 이점을 누릴 수있어서 놀랍습니다. 고용 안정?

+0

전혀 아닙니다. 사실 나는 그 형태가 그렇게 추악하지 않다고 생각하지 않습니다. 나는 훨씬 더 많이 보았다. 아마 더 나은 방법을 보여줄 수 있을까요? – Matt