现在我的问题的解决方案似乎非常基础。虽然我理解php运行服务器端,但我不知道即使include包含在ajax回调函数中,php也会在页面载入器上运行。虽然我可以通过在javascript值属性中返回php来显示查询结果,但是如果我没有包含对php脚本的引用,那么我会得到未终止的字符串错误。我现在意识到的是(我认为)include引起了php在ajax被解雇之前运行,这就是php为什么会在一个未定义的索引中发出嘘声。硬编码一个ID到PHP会运行良好,因为它不需要从Ajax的任何东西来运行查询。在回调中删除include会导致一个未定义的文字错误,因为没有任何可以引用的内容,php破坏导致解析器看到.value =“这个字面上没有终止。通过删除php include并通过JSON返回查询结果,一切正常无论如何,宝贵和有用的经验教训...无法将JavaScript变量传递给PHP
该应用程序是拉日志数据,作出修改和保存为一个新的或更新的日志文件ajax向php脚本发送一个ID以获取旧信息并填充每行单元格第二个单元格(act-col)根据第一个单元格中的选择动态加载(reg-col )为了让用户不仅可以看到旧信息,而且还可以进行更改,第二次Ajax调用以获得正确的选项,任何已经存在的清空并且加载新的选项。这也确保了选择框的定义,因为最初,直到有东西放在注册表单元格中,动作列单元格基本上是一个空框。之后,剩下的单元格将加载旧信息,创建一个新行并循环显示所有信息。将循环底部的add row函数添加会导致额外的行被添加,但是当循环完成时,我发现使用javascript删除它实际上会触发所有数学函数,就像用户从头开始创建日志一样。可能不是最好的解决方案,但可以防止从其他表格中提取数据以在初始按钮单击时填充这些字段。
现在,我明白了更好,我可以清楚地看到所有的建议指向我。哦,好吧......不是第一次,也不是最后一个后遗症让我感到羞耻(而且羞辱)了我。这里是最后的工作:
这里的JavaScript/jQuery的:
$(function(){
$.ajax({
type:'POST',
url: 'phpScripts/lastSession.php',
dataType: 'json',
data: {'id': pt_id},
cache:false,
success:function(data){
for(var j=0; j<data.length; j++){
var reg=data[j].region;
$(".reg-col:eq("+j+")").val(reg);
if ((reg)==="knee/hip"){ $(function(){ $.ajax({
url: 'phpScripts/getKneeHip.php',
dataType: 'json',
cache:false,
async:false,
success: function (json) {
$(".act-col:eq("+j+")").empty().end();
$.each(json, function(i, value) {
$('<option>').text(value).attr('value', value).appendTo($(".act-col:eq("+j+")"));
});
}
});
});
}//end if
else if ((reg)=="shoulder"){ $(function() { $.ajax({
url: 'phpScripts/getShoulder.php',
dataType: 'json',
cache:false,
async:false,
success: function (json) {
$(".act-col:eq("+j+")").empty().end()
$.each(json, function(i, value) {
$('<option>').text(value).attr('value', value).appendTo($(".act-col:eq("+j+")"));
})
}
});
});
}//end if
$(".act-col:eq("+j+")").val(data[j].activity);
$(".reps-col:eq("+j+")").val(data[j].reps);
$(".weight-col:eq("+j+")").val(data[j].weights);
$(".prps-col:eq("+j+")").val(data[j].purposes);
$(".time-col:eq("+j+")").val(data[j].time);
$(".type-col:eq("+j+")").val(data[j].type);
addRow('dataTable');
}
document.getElementsByName("chk[]")[j].checked=true;
document.getElementById('deleteBtn').click();
这里的PHP:
$ID = $_POST['id'];
$return = array();
$query = mysql_query("SELECT * FROM history WHERE patient_id = '$ID' AND date_of_service IN (SELECT MAX(date_of_service) FROM history WHERE patient_id = $ID)");
while ($row = mysql_fetch_array($query,MYSQL_ASSOC)) {
array_push($return,array('region'=>$row['region'],'activity'=>$row['exercise'], 'reps'=>$row['reps'], 'weights'=>$row['weight'], 'purposes'=>$row['purpose'], 'time'=>$row['time'], 'type'=>$row['type']));
}
header('Content-type: application/json');
echo(json_encode($return));
不需要''$ ID = @ $ _ POST ['id'];'不符合简单性和防止未定义的索引错误的兴趣 - 这只是懒惰和跛脚。做正确的事情 - 所有你需要的只是'isset()'和三元运算符(或者一个函数,如果需要更频繁地执行这个操作) –
加上webnet。@是一个抑制器,这是一个昂贵的方法isset($ _ POST [ id'])在条件将是理想的方式来包装... ps,因为有人会吼你,切换到PDO或mysqli –
关于“isset”...我离开它,所以代码将因为没有任何东西被传入,所以isset将被返回false,并且所有的都会停止,因为它会抛出一个错误,如果我选择一个默认值,它将返回默认值,这不是懒惰的问题,而是尝试发现问题,我意识到一个是抑制器,我把它放在那里,所以通知不会停止脚本。 – ploebach