2

ajaxとPHPを少し練習しようとすると、何かを送信するたびに空のインデックスまたは未定義のインデックスが返される理由がわかりません。

PHP:

<?php

    if (!empty($_POST['message'])) {
        echo 'works';
    } else {
       echo 'empty';
    }

?>

空を返します。

JS:

$('form').submit(function(){

    var meth = $(this).attr('action');

    var msg = $('.msg');
    $.post(meth, function(data) {
        $('.messages').append(data);
    }) ;

    return false; 
}); 

HTML:

<form class="send" action="process.php" method="post">
    <textarea type="text" name="message" class="msg" value="blah"></textarea>
    <input type="submit" name="submit" class="submit">
</form>

私がただ'エコーをするなら'test'; process.phpファイルでは、機能します。それ以外の場合は未定義のインデックス。

私は何が間違っているのですか?

4

4 に答える 4

4

構文エラーを編集したようですので、このセクションは無視してかまいません。

頭のてっぺんに、2つの構文エラーがあります。1つはphpにあります。

<?php


  if (!empty($_POST['message'])) {
    echo 'works';
  } else [ // <- This should be a {
     echo 'empty';
  }

?>

そしてJSの1つ:

$('form').submit(function(){

      var meth = $(this).attr('action');

      var msg = $('.msg');
      $.post(meth, function(data) {

        $('.messages').append(data);

      }) // <- Should be a ; here

      return false; 
    });

また、コードを適切にインデントする必要があることを最初に指摘しておきます。そうしないと、スコープの深さを確認するのが難しく、コードが単純に判読できなくなります。

empty配列のインデックスが設定されているかどうかを確認するために使用するのは間違った関数です。これが、「未定義のインデックス」警告を生成しているものです。issetまたは代わりarray_key_existsに:

if (!isset($_POST['message'])) {
// or
if (!array_key_exists('message', $_POST)) {

このempty関数は、空の文字列、空の配列、NULLなど、空と評価される値が変数に含まれているかどうかをチェックするだけです。変数が設定されているかどうかはチェックしません。


さらに、value属性を設定してtextareaの値を設定することはありません。それはうまくいきません。次のように、開始タグと終了タグの間に値を配置して値を設定します。

<textarea class="msg">My message</textarea>

次に、値を要求してテキストを(jQueryで)フェッチします

var my_message = $('textarea.msg').val()
于 2012-05-06T00:53:50.863 に答える
3

これをテストする最良の方法は、送信されたデータをエコーバックすることです。

<?php
  if (isset($_POST['message'])) {
    echo $_POST['message'];
  }
?>

prop()を使用してactionプロパティを取得すると、通常は絶対リンクが取得されます。これは、より優れたIMOです。

$('form').on('submit', function(e){
    e.preventDefault();
    var meth = $(this).prop('action'),
        Mymsg = $('.msg').text(); //assuming the element contains text
    $.post(meth, {message: Mymsg}, function(data) {
        $('.messages').append(data);
    });
});

フォーム全体を送信するには、serializeを使用し、それを追加する予定でしたが、代わりにJonathanの回答を参照してください。

于 2012-05-06T01:06:17.667 に答える
2

デフォルトの動作を使用していないため、PHPがフォームフィールドのいずれかを受け取るには、フォームフィールドの名前と値を自分で渡す必要があります。

// ...
$.post(meth, $(this).serialize(), function(data) {
// ...

エラーarray_key_existsを回避するために使用することも検討してください。undefined

if (array_key_exists('message', $_POST)) {
    # ...
}
于 2012-05-06T01:06:14.740 に答える
0

<textarea></textarea>次のように、タグの間にテキスト領域の値を入れてみてください。

<textarea type="text" name="message" class="msg">blah</textarea>

Textareaは、通常の<input />フィールドとは機能が異なります。

于 2012-05-06T00:53:35.697 に答える