1

jQueryの.serialize()を使用して、いくつかのチェックボックスやその他の入力を含むフォームデータをPHPスクリプトに投稿しています。

post.js:

$(function(){
$("#button").click(function(){
    $.ajax({
        type: "POST",
            url: "post.php",
            data: $("form#input").serialize(),

    success: function(data){
        $.getJSON('post.php', function(data) {
                        $.each(data, function(key, val) {

                        })
        })
    }
    })
    })
})

post.php:

$tags = array();
foreach($_POST['checkboxes'] as $key => $value){
  $tags[] = "$value";
}
$json = array(
  array(
    "tags" => $tags,
  ),
);
echo json_encode($json);

getJSONをpost.phpにポイントすると、エラーログに「PHP警告:foreach()に無効な引数が指定されました」というPHP警告が表示され、入力フォームからのデータが適切に渡されません(つまり、fwrite foreachが何も書き込まない後)。getJSONの別のファイル(data.phpなど)を参照する場合、またはそれをまったく含めない場合、投稿は正常に機能します。なぜこうなった?データを保存し、JSONデータを返す2番目のスクリプトを作成することもできますが、すべてを1つのスクリプトで行う方が簡単です。

4

4 に答える 4

2

取引は次のとおりです。

success: function(data){

上記の部分では、あなたが受け取っているデータは、json_encoded string containing key:value pairs of $tagsあなたが定義したように、返されます。

$.getJSON('post.php', function(data) {

これで、getJSONリクエストで値を渡さず、foreachステートメントは、チェックボックスの値を投稿して解析できるようにし、タグを作成することを期待しています。success: function(data)サーバーから返されるJSONをネイティブに解析し、準備が整うため、なぜこれを実行するのかよくわかりません。

$.each(data, function(key, val) {

単に$.getJSONリクエストを失い、各関数を使用するだけの場合は、サーバーから返されるタグを繰り返し処理することになります。これがあなたが望む意図された機能だと思います。

于 2012-07-06T14:30:47.473 に答える
1

チェックボックスが投稿されていないときにコードが壊れている

$tags = array();
if( array_key_exists('checkboxes', $_POST) && is_array($_POST['checkboxes']) ) {
    $tags = array_values($_POST['checkboxes']);
}

$json = array(
  array(
    "tags" => $tags,
  ),
);
echo json_encode($json);
于 2012-07-06T14:31:42.637 に答える
1

呼び出しで送信していないInvalid argument supplied for foreach値を期待しているため、取得しています。$_POST['checkboxes']$.getJSON

$.getJSON別のAJAX呼び出し、GETJSONファイルを取得するためのリクエストを送信します。POSTにリクエストを送信しましたpost.php。別の呼び出しを送信する必要はありません。

最初の呼び出しに追加dataType: 'json'すると、JSON応答が解析されます。

$.ajax({
    type: "POST",
    url: "post.php",
    data: $("form#input").serialize(),
    dataType: 'json',
    success: function (data) {
        $.each(data, function (key, val) {
            // code here
        });
    }
});
于 2012-07-06T14:32:08.450 に答える
0

必要なものがすでにあるので、「getJSON」を呼び出す必要はありません。必要なものはすべてデータにあります。したがって、「成功」コールバックは次のようになります。

function(data){
    var jsonData = $.parseJSON(data);
    $.each(jsonData, function(key, val) {

    })
}
于 2012-07-06T14:29:21.403 に答える