質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

空の配列がPOSTできない

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,158

ogyougi

score 56

実現したいこと

配列が空かどうか不明な場合でも、配列をPOSTしたいです。

発生している問題・エラーメッセージ

空をPOSTしたときにこのエラーになります。

Notice: Undefined index: testArr in /   /ajax-post.php on line 615

該当のソースコード

testArrが空の時、下記PHPで上のエラーになります。

let testArr=[];    
$.ajax({
    url: ,
    type: 'POST',
    data: {
        testArr: testArr
    }
})
$testArr = [];
foreach ( $_POST['testArr'] as $k=>$v ) { // ここで上のエラーです
$testArr[$k] = hoo($v);
}

試したこと

まず配列が空でないときはエラーになりませんので、問題は空であるか否かにありそうです。

そして困ったことに、次のように型を指定してやってもエラーは消えませんでした。

$testArr = [];
$_POST['testArr'] = (array)$_POST['testArr']; 
foreach ( $_POST['testArr'] as $k=>$v ) { // やはりここでも上のエラーです
$testArr[$k] = hoo($v);
}


他に試すべきことや解決策があればぜひ知りたいです。
夜分遅くにすみませんが、よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

$_POST['testArr'] = (array)$_POST['testArr']; 

$_POSTのように自動で設定されるスーパーグローバル変数に値を代入(上書き)してはいけません。

検証のためかもしれませんが、このケースでのキャストはトラブルの元にしかなりません。

「空の配列」というとHTMLから送信される例で言うと「チェックボックスで何も選択されなかった」場合になりますが、その場合って何も送信しません。
チェックされたvalueを配列にして送るので。
つまり、空の配列=何も送られてない ということになると思います。
値を設定したら送信されていることから明らかですね。

空の配列を送って何をしたいのか分かりませんけど。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/15 09:08 編集

    何も送信しないとすると、どのように書いたらよろしいでしょうか?

    JSではこう空かどうか判定してから送信して

    if(testArr){
    $.ajax({
    url: ,
    type: 'POST',
    data: {
    testArr: testArr,
    sonotanoatai: sonotanoatai
    }
    })
    }else{
    $.ajax({
    url: ,
    type: 'POST',
    data: {
    // testArrはなし
    sonotanoatai: sonotanoatai
    }
    })
    }


    PHPではこう空なら空をセットする。とかでしょうか?

    if($_POST['testArr']){
    $testArr = [];
    foreach ( $_POST['testArr'] as $k=>$v ) {
    $testArr[$k] = hoo($v);
    }
    $result=$testArr;
    }else{
    $result=[];
    }

    キャンセル

  • 2019/05/15 09:18

    その「何も送信しない」ってどういう状態なのか分からないですけど。。
    もし「配列」であることが保証されいるならif(testArr){よりも if(testArr.length > 0){ のほうが望ましいです。
    PHP側は$_POSTよりもinput_filter() のほうが扱いやすいと思います。
    https://www.php.net/manual/ja/function.filter-input.php
    https://qiita.com/andrew954/items/ebcda40464011612cae5
    フィルタかけれるので「値がない」「配列でない」を明示的に弾くことができます。
    こういう記事もあるのでご確認を。
    https://qiita.com/mpyw/items/312e4cefb3e67928b328

    キャンセル

  • 2019/05/15 09:35

    仰る通りチェックボックスに何もチェックがないときです。でも他に送信する「sonotanoatai」などの値がいくつかあるので、送信自体は行いたいという状態ですね。サンプルとリンクをありがとうございます。

    キャンセル

  • 2019/05/15 10:11

    >仰る通りチェックボックスに何もチェックがないとき
    であればHTMLのform送信もajaxも概念は同じです。

    キャンセル

+1

そのままじゃ無理なのでpostしたいデータにstringfy使ってあとはうまくやる

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

動かしてませんが…

function get_post_ar() {
  if (!empty($_POST['testArr'])) return $_POST['testArr'];
  return array();
}
$testArr = [];
foreach ( get_post_ar() as $k=>$v ) { // ここで上のエラーです
  $testArr[$k] = hoo($v);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/15 09:36

    なるほど。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る