1

チェックボックスの値をデータベースに送信しようとしています。フォームはデータベースに送信されますが、すべてのチェックボックス フィールドはそうではありません。要するに、チェックボックスが の場合checked、データベースの適切な列を の値で更新する必要があります1。チェックボックスがcheckedフォーム送信にない場合、列の値は になり0ます。

私は何を間違っていますか?クエリが長いことはわかっています。作業したら、おそらくこれを 2 つのテーブルに分割します。参考 $this -> input -> post('email');までに&$this -> input -> post('email');は、投稿されていない Ajax 呼び出しから受け取った値です。

私のモデル:

// Add or update campaign on database
public function add_campaign() 
{        
    // grab campaign session data
    $userid = $this -> session -> userdata('user_id');
    $campaign = $this -> session -> userdata('campaign_name');
    $website = $this -> session -> userdata('campaign_user_website');
    $headline = $this -> session -> userdata('campaign_headline');
    $bar_color = $this -> session -> userdata('campaign_bar_color');
    $head_color = $this -> session -> userdata('campaign_head_color');
    $main_color = $this -> session -> userdata('campaign_main_color');
    $thanks_msg = $this -> session -> userdata('campaign_thanks');        

    //grab scorecard options
    $email_q = $this -> input -> post('email');
    $brand_q = $this -> input -> post('brand');
    $design_q = $this -> input -> post('design');
    $usability_q = $this -> input -> post('usability');
    $support_q = $this -> input -> post('support');
    $service_q = $this -> input -> post('service');
    $recommend_q = $this -> input -> post('recommend');
    $suggestion_q = $this -> input -> post('suggestion');
    $comments_q = $this -> input -> post('comments');

    $modified =  date('Y-m-d H:i:s');        

    // insert OR if campaign already exists, update the campaign values and date modified
    $this -> db -> query("
        INSERT INTO campaigns (userid, campaign, website, headline, bar_color, head_color, main_color, thanks_msg, email_q, brand_q, modified)
        VALUES ('$userid', '$campaign', '$website', '$headline', '$bar_color', '$head_color', '$main_color', '$thanks_msg', '$email_q', '$brand_q', '$modified')
        ON DUPLICATE KEY UPDATE userid='$userid', campaign='$campaign', website='$website', headline='$headline', bar_color='$bar_color', head_color='$head_color', main_color='$main_color', thanks_msg='$thanks_msg', email_q='$email_q', brand_q='$brand_q', modified='$modified'
        ");      
}

そして私の見解の一部:

<!-- Scorecard options -->
<div class="scordOption roundtop">
    <div class="checkicon"><input type="checkbox" name="email" class="email_score" value="1"></div>
    <div class="scoreOptionTxt">What is your email address?</div>
</div>

<div class="scordOption">
    <div class="checkicon"><input type="checkbox" name="brand" class="brand_score" value="1"></div>
    <div class="scoreOptionTxt">How would you rate our company's branding?</div>
</div>

正常に動作するコントローラー関数を指す Ajax 関数。コードを表示する必要はありません。その関数では、上記のモデルを指しています。

var score_options = {
        email: $('input.email_score').val(),
        brand: $('input.brand_score').val(),
        ajax : '1' // needed for controller, to verify that request is ajax
    };

    //display ajax loader animation
    $('#loading').show();

    $.ajax({
        url : 'ajax/embed_step',
        type : 'POST',
        data : score_options,
        success : function(msg) {
            $('.wizardContent').html(msg);
            // output success in this container             
            $.scrollTo(0, 500);
            // scroll to top on success 
            $('#loading').hide();
            // hide loading icon
        }
    });

    return false;    
4

1 に答える 1

1

チェックボックスがチェックされているかどうかに関係なく、すべてのチェックボックスフィールドが 1 の値で DB に登録されます

主な問題は次のとおりです。

email: $('input.email_score').val(),

valueこれは、入力がチェックされたかどうかに関係なく取得されます。このようなものを使用することをお勧めします (少なくとも今のところserialize()、フォームを送信するために を使用するなどのより効率的な方法があると思われますが、最初に問題を理解する必要があります)。 :

email: $('input.email_score:checked').val() ? 1 : 0,

この構文に慣れていない場合は、一般に「条件演算子」と呼ばれ、基本的にこれを行うのと同じです。

if ($('input.email_score:checked').val()) {
   email = 1;
} else {
   email = 0;
}

$('input.email_score:checked').val()undefined入力がチェックされていない場合は戻ります。name補足として、クラスではなく属性で入力を取得する方が理にかなっています。これを行う方法は他にもたくさんあります$('input.email_score:checked').length(チェックする数は?) などですが、好きな方法で行うことができます。

intval()さらに、PHP 側では、値が安全であることを確認するために、整数にキャストするか、次のように使用します。

$email_q = (int) $this->input->post('email');

または、代わりに、もう一度条件演算子を使用します (1 または 0 のみが必要なため、おそらくより適切です)。

$email_q = $this->input->post('email') ? 1 : 0;

チェックボックスは少しトリッキーです。なぜなら、チェックされていないものは通常、空の値を投稿するのではなく、まったく投稿しないからです。

于 2012-11-24T00:55:24.507 に答える