【发布时间】:2014-09-30 14:31:48
【问题描述】:
我有一些 jQuery/HTML,我在其中接受单个用户输入(文本)并希望将其传递给 PHP,以存储以供以后在会话变量中使用。我查看了很多关于此类操作的页面,发现最接近我认为我需要的答案是 Set Session variable using javascript 。以下代码大致基于此,但似乎 ajax 什么也没做。我一直有console.logs,并且在通过ajax语句的每个可能路径(完成,失败和总是),但没有出现。控制台日志显示:
(文档).ready
从输入中获取新列表名称
列表A1
通行证名称:ListA1
:
对象 {listNamePOST: "ListA1"}
passName 函数结束
从 passName() 返回
即将回显 $_SESSION['listName']:
结束
错过了 6. 成功或 6. 失败和 7. 总是。和行 console.log();甚至不显示空行。
请问我哪里出错了?
这里是test.php
<?php session_start(); ?>
<form method="post" name="newlistform">
<label for="list_name">Input:</label>
<input style="position: relative; " name="list_name" type="text" required />
<span class="button" id="makeIt">Go</span>
</form>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script>
/* ƒ: Pass listName out to SESSION variable */
function passName ( listName ) {
console.log('4. passName: ', listName);
var params = {listNamePOST: listName};
console.log("5. :");
console.log(params);
jQuery.ajax({
url: "storesession.php",
type: "POST",
data: params,
dataType : "json",
success: function(data, textStatus, xhr) {
console.log("6. success");
console.log(data);
},
error: function(xhr, textStatus, errorThrown) {
console.log("6. fail");
}
});
console.log('8. passName function end');
}
$(document).ready(function () {
console.log('1. (document).ready');
$( '#makeIt.button' ).click(function () {
console.log('2. Take new list name from input');
var listName = $( 'input[name=list_name]' ).val();
console.log('3.', listName);
passName ( listName );
console.log('9. returned from passName()');
console.log("10. about to echo $_SESSION['listName'] :");
console.log(<?php echo $_SESSION['listName'] ?>);
console.log('12. end');
});
})
</script>
这里是 storesession.php
<?php
$_SESSION['listName'] = $_POST['listNamePOST'];
?>
(我稍后会清理用户输入。)
编辑:刚刚删除了每个控制台日志行末尾的“test.php”。我无意中复制了它们。
第二次编辑:供参考 - 此代码是一个更大的 php 文件的摘录,其中包括另一个 $.ajax 调用,用于从 MySQL 数据库中获取一些数据,这是有效的。
第三次修改:将“done:”改回“success:”,“fail:”改回“error:”并删除“always:”。这现在增加了 6. success 作为最后一行,所以@FrancescoMM 和@Kevin 把我说对了,虽然我不明白为什么当我最初有它时它不起作用。
作为'6。成功'出现在日志的末尾,我将尝试 async: false 并报告:- 好的,这解决了顺序问题,但是日志语句 10. 和 12. 之间的控制台日志语句仍然没有出现。没有“未定义”,甚至没有空行。
所以问题现在简化为将 listName 放入会话变量中。
第 4 次编辑:现已解决。当我将 session_start 语句从 test.php 移动到 storesession.php 并发现它不起作用时,我将其移回,但不是作为第一个语句。因为我找到了http://www.yourhowto.net/how-to-check-and-create-php-session-variables/,所以将语句移到了最开始,现在用户数据正在传递给会话变量,并在 10. 到 12 之间的日志末尾正确显示。
【问题讨论】:
-
你试过
success:function() {console.log("6. success");},吗? (而不是完成?) -
@FrancescoMM - 谢谢。是的,我从成功开始:错误:然后发现它不起作用(并且将被弃用)所以切换了。我刚刚重试成功,确认结果是一样的。
-
success: fn和error: fn不会折旧。.success(fn)和.error(fn)是。巨大差距。done: fn和fail: fn什么都不做。 -
@Kevin,谢谢你让我明白这一点。也许我误解了这一点:api.jquery.com/jquery.ajax 但它说“弃用通知:jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调自 jQuery 1.8 起已弃用。要为最终删除准备您的代码,请改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。'' 无论如何,正如我所说,我首先使用了成功:和错误:但它没有'不起作用,然后重试,它仍然不起作用。我的问题一定出在其他地方。
-
@FrancescoMM,Kevin,请看我的第三次编辑。