【问题标题】:How can i sent an array with JS and AJAX如何使用 JS 和 AJAX 发送数组
【发布时间】:2016-10-18 10:07:00
【问题描述】:

我有多个输入字段,用户可以在其中填写问题的答案,我使用 JavaScript 将用户输入放入一个数组中。

当我在谷歌浏览器中查看控制台日志时,我看到数组将被正确处理,之后我想将带有 AJAX 的数组发送到另一个 php 页面,以便我可以将数据保存到我的数据库中。

当我检查我的数据库时,post result = "Array" :(

谁能帮帮我???

////// JavaScript 和 AJAX 代码:

if (isConfirm) {
    checkAnswers();
    $('input[id="answer"]').each(function() {
        allAnswers.push($(this).val());
        allAnswers.toString(); 
    });
    console.log(allAnswers);
    $.ajax({
        type: 'post',
        url: 'actions/save_questions.php',
        data: { 'answers': allAnswers }
    });
}

/////// PHP 代码:

<?php

$user_answer = $_POST['answers'];
$date = date('d-m-Y h:i:s');

$arr = array($user_answer);

$query = "INSERT INTO made_questions (lesson_id, user_answer, datum) VALUES ('1', '$arr', '$date')";
mysqli_query($conn,$query) or die (mysqli_error($conn));

?>

输出到我的数据库是:

id:27

课程编号:1

user_answer: 数组

日期:16-06-2016 08:12:32

控制台日志输出:

[“horse”、“nocleu”、“Geel”、“这是我的狗”、“Guten tag”、“Sun”、“Aap”、“Honger”、“knol”、“Cat”]

谁能帮助我???

非常感谢!

【问题讨论】:

  • 一种选择是序列化你的数组stackoverflow.com/a/1256006/4178487
  • $foo = array(); echo $foo 将输出文字词Array。您不能在字符串上下文中使用数组,其中包括将该数组填充到 sql 查询字符串中,并且 mysql 无论如何也不做数组。您需要规范化您的数据结构并将每个数组组件插入到子表中。
  • allAnswers = allAnswers.join();代替allAnswers.toString();
  • 同意,@MarcB OP 将使用逗号分隔的值列表放入数据库的列中。根据用例,很可能应该将其规范化为子表
  • @mhodges,你说得对,我现在正在编辑我的评论 :)

标签: javascript php jquery arrays ajax


【解决方案1】:

.toString().join() 不要修改原始变量。你需要说:

allAnswers = allAnswers.toString();

data: {'answers': allAnswers.toString()}

另外

如果您希望将值“,” 分开,而不仅仅是 .toString() 返回的“,”,您可以说:

allAnswers = allAnswers.join(", ");

data: {'answers': allAnswers.join(", ");

重要:

请务必注意,如果您以这种方式使用 .toString(),您的 .each() 循环将会中断。

坏了

$('input[id="answer"]').each(function(){
    allAnswers.push($(this).val());
    allAnswers = allAnswers.toString(); 
});

上面的代码将不起作用因为在第一次迭代之后,allAnswers 将是一个字符串,因此,调用.push() 会抛出异常,因为.push() 不是string 的函数.

已修复

$('input[id="answer"]').each(function(){
    allAnswers.push($(this).val());  
});
allAnswers = allAnswers.toString();

此代码通过将数组转换为字符串来解决问题您完成向数组附加值之后。

【讨论】:

  • 谢谢,data: {'answers': allAnswers.toString()} 为我做了 :)
【解决方案2】:

如果您想以字符串格式保存所有问题,可以使用json_encode

<?php

    $user_answer = $_POST['answers'];
    $date = date('d-m-Y h:i:s');

    $ques = json_encode($user_answer);

    $query = "INSERT INTO made_questions (lesson_id, user_answer, datum) VALUES ('1', '$ques', '$date')";
        mysqli_query($conn,$query) or die (mysqli_error($conn));

?>

警告:您的代码不安全!

【讨论】:

  • 很高兴有人提到不安全的 SQL +1
【解决方案3】:

您应该在将数组连接到 sql 之前将其转换为字符串。

$arr = implode(",", $user_answer);

【讨论】:

  • 这并没有解决问题的根源,这是 OP 认为 .toString() 修改了原始变量。 OP 显然希望在 ajax 调用中传递一个字符串
  • 在 sql 中传递一个数组将输出一个字面量词数组。他的问题在于数据库中传递的数据。我认为他的 javascript 没有问题。
  • 您认为他的 javascript 没有问题是我发表评论的原因。是的,从语法上讲,他的 javascript 是正确的。从逻辑上讲,这没有意义。他正在调用 .toString() 而不将其分配给任何东西,然后将原始(未字符串化)数组传递给他的 AJAX 调用,这就是导致问题的原因。此外,如果将其转换为 .each() 内的字符串,则第二次迭代会导致错误,因为 .push() 不是字符串的函数。
  • 哦,是的,我想你是对的,我已经编辑了我的答案。该函数是服务器端,假设在 $_POST 中传递了一个数组,它可能与 javascript 中的 join 函数具有相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多