2012-04-22 13 views
1

私は、ユーザが選択するチェックボックスのリストを持っているとしましょう。既にチェックされているチェックボックスを更新する

<input type="checkbox" name="utility[]" id="utility[]" value="Water" />Water<br /> 
<input type="checkbox" name="utility[]" id="utility[]" value="Cable" />Cable<br /> 
<input type="checkbox" name="utility[]" id="utility[]" value="Electricity" />Electricity<br /> 
etc... 

ユーザが水を選択し、データベースに追加されました。ユーザはリストを更新したいと考えています:

<input type="checkbox" name="utility[]" id="utility[]" value="Water" checked="checked"/>Water<br /> 
<input type="checkbox" name="utility[]" id="utility[]" value="Cable" />Cable<br /> 
<input type="checkbox" name="utility[]" id="utility[]" value="Electricity" />Electricity<br /> 
etc... 

ユーティリティがPHPですでにチェックされていることを確認する方法はありますか?

答えて

2

は、任意のインスタンスを「確認」することなく、この...

まず、変数内のすべてのhtmlをコンパイルしています。

$boxes = ''; 
$boxes .= '<input type="checkbox" name="utility[]" id="utility[]" value="Water" />Water<br />'; 
$boxes .= '<input type="checkbox" name="utility[]" id="utility[]" value="Cable" />Cable<br />'; 
$boxes .= '<input type="checkbox" name="utility[]" id="utility[]" value="Electricity" />Electricity<br />'; 

ここでフィールドの配列をチェックしてループします。ここでもサンプル配列を提供しています。

$already_checked = array('Water', 'Electricity'); 

foreach($already_checked as $ac) { 
    $find = 'value="' . $ac . '"'; 
    $replace = $find . ' checked="checked"'; 
    $boxes = str_replace($find, $replace, $boxes); 
} 

echo $boxes; 
+1

ありがとうございます。私はこれがうまくいくはずだと思う。 – OneSneakyMofo

+0

これはうまくいくが、直感的ではなく、特に効率的ではない。文字列を直線的に検索することは、catch-allメソッドや構造化された 'if'ステートメントよりも優れた、あるいはよりパフォーマンスの高いソリューションです。 –

+0

スチュワート、あなたはその点を見逃している。上記の方法(つまり、単純なhtml)でチェックボックスの大きなリストを維持する方が、入力ごとに別々のif文を編集する方がはるかに簡単です。私はそれが技術的にはより強烈な方法であることに同意しますが、コードをきれいにします。 – HappyTimeGopher

0

あなたはこのような何かを行うことができます:

<input type="checkbox" name="utility[]" value="Water" 
    <?= in_array('Water', $utilities) ? 'checked="checked"' : '' ?>" 
/> 

(上記$utilities変数はあなたのコードが構成されている方法に応じて、$_REQUEST['utilities']のようなもののためのスタンドである。)そのような

+0

すべてのチェックボックスフォームでifステートメントを使用する方法とは異なりますか?私はそれらの約50を持っており、それは非効率的だと思われる。 – OneSneakyMofo

+0

効率を上げるために、すべてのチェックボックスの値をブール値の配列にプルすることができます(数千もないと仮定して)。そうすれば、次のようなことができます: '<?= $ values ['Water']?'checked = "checked":' '?> ' –

+0

はい、それぞれの' input'に対して 'if'または' 3値演算子が効果的に必要になります。しかし、それは非常に単純な演算子なので、非効率的であるというわけではありません。パフォーマンスの問題は、単純にDBからデータを引き出す方法になります。 –

0

?私は肥大化の行の数百を持っ節約するために、過去に何をやったか

<input type="checkbox" name="utility[]" id="utility[]" value="Water" 
    <?php 
    if(isAlreadyChecked("Water")) 
    echo "checked=\"checked\"" 
    ?> 
/>Water<br /> 

<?php 
    function isAlreadyChecked(value) 
    { 
    //Check if it is already checked and return a boolean 
    } 
?> 
+0

私が下で言ったように、あなたが考えることができるより効率的な方法がありますか?私は今思考しようとしています。 – OneSneakyMofo

0

私はそこに、条件付きin_arrayのすべてのバリエーションを試してみましたが、これは(その値が以前に選択したため、データベースに挿入されたチェックボックスをオフにチェック)仕事を得ることができませんでした。私はテーブルジョインと複雑なクエリを試してみました。私は最終的にあきらめて、配列を開いたdisplay:hiddendivを生成しました(私は奇妙な理由で、爆発するのではなくIMPLODEする必要がありました)、その項目をコンマ区切りのテキストとしてリストしました。それから私は少しのjQuery indexOf()マジックを投げて、各チェックボックスの値が前記配列の一部であるかどうかを判断しました。 jQueryでこれを行うために10分フラットにしました。非常にシンプルです。

ここでライブや正常に動作しているいくつかのサンプルコードです:

.keywords { display:none; visibility:hidden; } 

とjQuery部分:

$(document).ready(function() { 
    $('.categories input').each(function(index,data) { 
     var str=$('.keywords').text(); 
     var catid = $(this).val(); 
     var chk = str.indexOf(catid); 
     if (chk >= 0) { 
      $(this).prop('checked', true); 
     } 
    }); 
}); 

私は願っています

<div class="categories"> 
    <span class="keywords"><?php $categories = array(); $categories = implode(', ', $keywords); echo $categories ?></span> 
    <em>Please verify category selections with each update.</em><br/> 
    <?php 
    include 'db.php'; 
     $sql = mysqli_query($con,"SELECT * FROM categoriesTable ORDER BY Category_Name ASC"); 
     while ($row = mysqli_fetch_assoc($sql)) 
     { 
     $key = urldecode($row['Category_Name']); 
     $id = urlencode($row['catID']); 
     echo "<input type='checkbox' name='Category_Key[]' value='$id' id='cat_$id' $chk> $key<br/>"; 
     } 
    ?> 
</div> 

CSSは不可視にdiv要素があることセットこれはなぜin_array条件がそれらに失敗しているのか不思議に思えている他の人に役立ちます。これは、データの永続性に関するデータとUIの間の夕暮れゾーンにあるので、これは正当なルートだと思います。複数のチェックボックス(ここで私の状況では約40のカテゴリがあります)を生成するための1つの "echo"文があり、その後、単純なjQuery .each()を使用して、