尝试练习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>
如果我只是做'echo 'test'
;在process.php文件中,它有效;否则为未定义的索引。
我做错了什么?
答案 0 :(得分: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
是用于检查是否设置了数组索引的错误函数。那是什么产生了未定义的索引&#34;警告。请改用isset
或array_key_exists
:
if (!isset($_POST['message'])) {
// or
if (!array_key_exists('message', $_POST)) {
empty
函数只检查变量是否包含一个计算为空的值,例如空字符串,空数组,NULL等。它不检查是否设置了变量。
此外,您不需要通过填充value属性来设置textarea的值。那不会奏效。您可以通过将值放在open和close标记之间来设置值,如下所示:
<textarea class="msg">My message</textarea>
然后通过请求值
来获取文本(在jQuery中)var my_message = $('textarea.msg').val()
答案 1 :(得分: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的答案。
答案 2 :(得分:2)
由于您没有使用默认行为,您必须自己传递表单字段的名称和值,以便PHP接收其中任何一个:
// ...
$.post(meth, $(this).serialize(), function(data) {
// ...
您还可以考虑使用array_key_exists
来避免undefined
错误:
if (array_key_exists('message', $_POST)) {
# ...
}
答案 3 :(得分:0)
尝试将文本区域的值放在<textarea></textarea>
标记之间,如下所示:
<textarea type="text" name="message" class="msg">blah</textarea>
Textarea的功能与典型的<input />
字段不同。