我在 jQuery 中创建了一个脚本,它 1. 自动从用户在页面上动态创建的元素中获取特定值 2. 将这些值准备为查询格式以供 mysql 插入 3. 格式化为要发送的 JSON 格式通过 ajax 到 php 脚本,我们将在其中操作这些 JSON 对象并将这些值插入到 mysql 数据库中。
这是我似乎无法弄清楚的——
当我使用测试值在 javascript 中手动设置具有预期 JSON 格式的变量字符串时,这些值通过 ajax 成功发送 php 脚本,并且这些值成功插入到数据库中。
但是,当我尝试使用页面上动态内容中的值动态构造字符串变量时,php 脚本会引发错误:
'试图获得非对象的属性'
在使用 '$theArray->questions' 语法的 php 脚本中的 'foreach' 循环中引发错误。
这很奇怪,因为当我在 jquery 中使用两种方法(手动设置 JSON 并动态构造 JSON)时,我得到完全相同的输出。此外,当我手动设置时,我可以使用 $.parseJSON 函数但是当我使用这个函数使用动态方法时会破坏脚本,所以当我动态尝试时,我必须注释掉这个函数。
根据我分配值的方式(手动和动态使用变量),我怀疑这些变量的背景中正在发生一些奇怪的事情。这是相关的代码:
JAVASCRIPT (JQUERY)
//Manually create JSON string to send to php to insert values into mysql db
//var questionsquestion = '{"questions":[{"question":"test16","type":"radio", "html":"<input>"},{"question":"test2","type":"checkbox", "html":"<input>"},{"question":"test3","type":"checkbox", "html":"<input>"}]}';
//questionsquestion = $.parseJSON(questionsquestion);
//set arrays
var questionstype = [];
var questionshtml = [];
var questionsquestion = [];
//Store all 'questions', 'question types', and 'html' for each fieldset into 3 separate arrays
for(var i=1;i<=formpreviewid;i++)
{
questionsquestion.push($("#formelement_"+i + " legend").text());
questionstype.push($("#formelement_"+i).attr("class"));
questionshtml.push($("#formelement_"+i)[0].outerHTML);
};
//format values for each fieldset into values format for mysql
var questionsvalues = [];
var index = 0;
for(var i=1;i<=formpreviewid;i++)
{
questionsvalues.push('{"question":"'+questionsquestion[index]+'","type":"'+questionstype[index]+'","html":"'+questionshtml[index]+'"}');
index++;
};
//dynamically format mysql values into JSON format
var questionsvaluesjson = '{"questions":['+questionsvalues+']}';
//questionsvaluesjson = $.parseJSON(questionsvaluesjson);
var jsonArray = JSON.stringify(questionsvaluesjson);
$.ajax({
type: 'POST',
url: '/project/templates/yoo_nano2/php/saveform.php',
data: {'formpreviewhtml': formpreviewhtml, 'jsonArray': jsonArray},
beforeSend:function(){
// this is where we append a loading image
$("#formpreview").append('<div style="z-index:3000;" id="divoverlaycontainer"><div id="loaderoverlay"><div class="center" id="loader"><img src="/project/templates/yoo_nano2/images/loader.gif"></div></div></div>');
}, success:function(data){
alert(data + "Saved form successfully.");
//$('#viewresults').empty();
$('#divoverlaycontainer').remove();
// successful request; do something with the data
//$('#viewresults').html(data);
}, error:function(){
// failed request; give feedback to user
alert("Save was unsuccessful. Please try again.");
$('#divoverlaycontainer').remove();
}
});
});
});
PHP
<?php
//create object/array from json data
$theArray = json_decode($_POST['jsonArray']);
//connect to database
require_once('connect.php');
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
//set query to drop table
$query = "DROP TABLE registrationquestions;";
//execute the query
$mysqli->query($query);
//set query to create table
$query = "CREATE TABLE registrationquestions(
id INT NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (id) ,
question TEXT,
type CHAR(255) ,
html TEXT)";
//execute the query
$mysqli->query($query);
//insert new questions
$insert = "";
foreach ($theArray->questions as $data)
{
$insert .= '("' . $data->question . '", "' . $data->type . '", "' . $data->html . '")';
}
$insert = str_replace(")(","),(",$insert);
$query = "INSERT INTO registrationquestions (question, type, html) VALUES " . $insert;
$mysqli->query($query);
?>