2010-03-22 2 views
1

게시 된 테이블 내에 post_tags라는 테이블 열이 있습니다. 여기에는 할당 된 태그가 @ 기호로 구분되어 저장됩니다. 또한 모든 태그 이름이 저장되는 태그라는 테이블이 있습니다. 좀 더 정규화 된 방식으로 데이터베이스를 디자인하고 싶습니다. 그러나이를 달성하기위한 목적으로는 가장 쉬운 옵션입니다.mysql 레코드를 미리 선택된 체크 박스로 표시하는 방법은 무엇입니까?

어쨌든, 난 체크 박스로 태그 테이블의 모든 항목을 화면에 표시 할, 그래서 수행

$query = mysql_query("SELECT * FROM tags ORDER BY name"); 

    while ($row = mysql_fetch_assoc($query)) { 

     $tag = $row['name']; 

     echo "<input type='checkbox' name='tags[]' value='$tag' />\n"; 

    } 

다음 내가 미리 선택 할 특정 게시물에 할당 된 태그를 갖고 싶어 . 나는 "파티"를 원하는

@ 돌고래 @ 해변 @

자, "해변"와 "돌고래"체크 박스에 : 나는 거기에 다음과 게시물이있는 경우 예를 들어, post_tags 열입니다 기본적으로 (다른 옵션의 체크 박스는 선택하지 않은 채로) 체크됩니다. 어떻게 할 수 있습니까?

+0

내가 대신 교차 테이블을 사용 post_tags 같은 열이하려는 모르겠어요. 그러나 실제로 데이터를 가져올 때 더 많은 처리를 수행하면됩니다. –

답변

0

먼저해야 할 일은 기존 데이터가 있는지 확인하는 것입니다. 다음에 기본 문자열을 넣지 경우에 따라서 해당 쿼리를 실행하고 $checkedstring을 말할 수에 해당 테이블 셀의 결과를 넣습니다.

<?php 
$checkedstring = "[email protected]@[email protected]"; 
//Pull from DB if exsists and set $checkedstring to that value 
/// 
$checkeditems = explode ("@" , $checkedstring); 
$checked = array(); 
foreach($checkeditems as $item) 
{ 
    $checked[$item]=true; 
}  

$query = mysql_query("SELECT * FROM tags ORDER BY name"); 

while ($row = mysql_fetch_assoc($query)) 
{ 
    $tag = $row['name']; 
    $checkedstatus = ''; 
    if($checked[$tag]) 
    { 
     $checkedstatus = "checked='checked'"; 
    } 
    echo "<input type='checkbox' name='tags[]' value='$tag' $checkedstatus />\n"; 
} 


?> 
+0

sooooooooooooooooooooooo 고맙습니다! – Jennifer

1

두 결과와 in_array() 기능을보십시오. 때문에 성능에 제프 질문의

<?php 
$tags = mysql_query("SELECT * FROM tags ORDER BY name"); 
$post_tags = "[email protected]@[email protected]"; 
$arr_tags = explode("@", $post_tags); 

while ($row = mysql_fetch_assoc($query)) { 
    $check = in_array($arr_tags, $row['name'])? 'checked="checked"' : ""; 
    echo '<input type="checkbox" name="tags[]" value="'.$row['name'].'" '.$check.' />'; 
    echo "\n"; 
} 
?> 

UPDATE, 나는 빠른 솔루션을 보면서 isset()를 사용하여이 값의 빠른 조회를 할 것 빠른 그래서입니다. array_flip()in_array()보다 3 시간 이하 과세입니다 :

<?php 
$tags = mysql_query("SELECT * FROM tags ORDER BY name"); 
$post_tags = "[email protected]@[email protected]"; 
$arr_tags = array_flip(explode("@", $post_tags)); 

while ($row = mysql_fetch_assoc($query)) { 
    $check = isset($arr_tags[$row['name']])? 'checked="checked"' : ""; 
    echo '<input type="checkbox" name="tags[]" value="'.$row['name'].'" '.$check.' />'; 
    echo "\n"; 
} 
?> 
+0

in_array 함수의 오버 헤드는 무엇입니까? 매번 배열 전체를 스캔합니까? –

+0

내 컴퓨터에서 중간 크기의 쿼리 결과를 테스트했는데 .25 초로 실행되었습니다. –

+0

업데이트가 멋지게 보입니다. in_array를 자세히 살펴볼 때마다 루프를 통해 배열을 검사하여 태그 수가 증가하면 문제는 있지만 플립과 이네트가 훨씬 좋아 보인다. –

관련 문제