我有两个名为startDate和endDate的输入文本框,以及一个提交按钮。我在 PHP 中完成了代码的后端,以便它从两个文本框中获取输入(日期),并在单击提交按钮后输出 D3 可以呈现的 JSON 文件。
问题是,我得到"未捕获的类型错误:无法读取未定义的属性'长度'",但是当我手动输入 startDate 和 endDate 的值(声明值而不是它是用户输入)时,它工作得很好。我猜在回调期间没有正确传递 sDate 和 eDate 的值,这就是它返回 NULL 的原因。我不知道如何解决它。
在这里分享我的代码。
.HTML:
<body>
<form id="user" action="#" method="post">
<table>
<tr>
<td>Start Date:</td>
<td><input id="start_date" type="text" name="startDate" value="" size="30" /> </td>
</tr>
<tr>
<td>End Date:</td>
<td> <input id="end_date" type="text" name="endDate" value="" size="30" /></td>
</tr>
</table>
<div id="submit_button">
<input type="reset" value="Clear" />
<input id="submitButton" type="submit" value="Submit" />
</div>
</form>
<div id="contents" style="width:500px; height:500px;"></div>
<!-- data should appear once Submit button is clicked -->
<script>
$(document).ready(function(){
$('#submitButton').click (function(e){
e.preventDefault();
renderTable();
});
});
</script>
<!-- D3 -->
<script>
function renderTable(){
d3.json("data.php", function(error, data) {
var c_data = d3.select("#contents").append("svg")
.attr("width", 500)
.attr("height", 500)
var bars = c_data.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("width", function(d){return d.value * 30})
.attr("height", 50)
.attr("y", function(d, i){return i * 80})
})
}
</script>
</body>
.PHP:
<?php
$db = new PDO($hostname, $username,$password);
//$startDate = '2014-11-21'; --> works when this is used
//$endDate = '2014-11-23'; --> works when this is used
if(isset($_POST['startDate']))
{ $startDate = $_POST['startDate'];};
if(isset($_POST['endDate']))
{ $endDate = $_POST['endDate'];};
$statement = $db->prepare(*SQL statement edited out*);
$statement->execute(array($startDate, $endDate));
$jsonData=$statement->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($jsonData);
?>
附加信息:
我得到这个是为了数据.php元素:
注意:未定义的索引:/Applications/XAMPP/xamppfiles/htdocs/myProject/data中的startDate.php注意:未定义的索引:结束日期在/Applications/XAMPP/xamppfiles/htdocs/myProject/data.php[]
的工作原理是通过 POST 或 GET 将输入值发送到服务器。(因此他们的方法属性)。
您正在尝试访问 php 代码中的 POST 变量,但实际上并没有发布表单。将变量放在 url 中可能更容易,如下所示:
d3.json("data.php?startDate=" + startDateValue + "&endDate=" + endDateValue, funct.....
POST 和 GET 之间的众多区别之一是 GET 通过 url 发送值,因此 php 代码的唯一区别是更改对 $startDate = $_GET['startDate'];
的访问
编辑:由于我意识到我基本上重复了Lars Kotthoff所说的内容,因此这是一个使用POST而不是GET的有趣解决方案,使用xhr.send(method[, data][, callback])
你,@LarsKotthoff和@IgnacioAmpuero!我没有完全使用你建议的方法,但它确实帮助我了解我错过了什么。
对于遇到相同问题的任何人来说,这就是我所做的:
使用 AJAX 请求来填充我的查询。
var jsonData = $.ajax({
type: 'POST',
url: 'data.php',
dataType: 'json',
data: $('#user').serialize(),
async: false
}).responseText;
将结果分配给数据。
var data = JSON.parse(jsonData_status);
然后用它来生成我的图表。
var canvas = d3.select("body").append("svg")
.attr("width", 500)
.attr("height", 500);
var bars = canvas.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("width", function(d){return d.value * 30})
.attr("height", 50)
.attr("y", function(d, i){return i * 80});