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

我看到您已经编辑了语法错误,因此您可以忽略此部分:

在我的脑海中,我看到两个语法错误,一个在 php 中:

<?php


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

?>

一个在 JS 中:

$('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是用于检查是否设置了数组索引的错误函数。这就是生成“未定义索引”警告的原因。使用issetorarray_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);
    });
});

要发送整个表单,请使用序列化,将添加它,但请参阅 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 回答