【问题标题】:Spot the error - Mixing: php data objects (fetch object), json, and jquery.post()发现错误 - 混合:php 数据对象(获取对象)、json 和 jquery.post()
【发布时间】:2011-04-04 18:12:02
【问题描述】:

谁能比我更有经验,在这里发现问题。 我无法调试它,由于使用了 jquery.post(),我的 var_dumps 似乎没有任何效果,所以我相信。

我什么也没显示。我期待收到一个充满 json 编码值的 li 系列。

HTML:

<div id='data'></div>
<form action="">
  <input id="nomeInput" type="text" name="nomeInput" value="" autocomplete="false"/>
</form>
<ul id="listaDominios" style="display: none;">
</ul>

js:

$(document).ready(function(){
  $('#nomeInput').keypress(function(){
     $.post("testeBasico_1.php", {nomeInput : $('#nomeInput').val()}, function(resposta) {
        for (var x = 0, tamanhoDados = resposta.nomeDominio.length; x < tamanhoDados; x++){
           $('#listaDominios').show();
           $('#listaDominios').append('<li>'+resposta.nomeDominio[x]+'</li>');
        }

      }, "json");

  });//end of keypress;

});//end of document ready;

PHP

public function listaDominios(DominioVo $dominioVo)
{
  try
  {
     $stmt = $this->_dbh->prepare("SELECT d.nomeDominio FROM dominio d WHERE d.nomeDominio LIKE ?");
     $stmt->bindValue(1,'%' . 'a' . '%', PDO::PARAM_STR);
     $stmt->execute();

     $resultado = $stmt->fetchAll(PDO::FETCH_OBJ);

       return $resultado;
    }
    catch (PDOException $ex)
    {
      echo "Erro: " . $ex->getMessage();
    }
}

如果这个位置很难捕捉,我该如何发现它。这是我的第一次 ajax 体验,所以我对调试部分不太满意。 :s

怀疑:(更新) 我相信问题出在我试图迭代返回的 json 的方式上。 这是json_encoded的回显格式:

[{"nomeDominio":"aaaa.ka"},{"nomeDominio":"agentesdeexecucao.ka"}]

提前非常感谢, 内存

【问题讨论】:

  • 先直接调用PHP脚本,看看有没有输出。
  • 我可以访问:“testeBasico_1.php”和var_dump从数据库返回的值,以及对应的json。都出现了。
  • @MEM 好的,那么下一步就是输出resposta.nomeDominio.length 例如使用alert()console.log查看数据是否通过
  • 我已经更新了我的问题,我相信我有这个问题。
  • alert('长度测试:'+resposta.nomeDominio.length);我没有收到警报窗口。 :( 如果我在同一个地方做 alert('hi'); ,我确实得到了窗口。我不应该收到一个有东西的窗口,或者是空的,或者为空,但是,仍然是一个窗口吗?:s

标签: jquery json pdo


【解决方案1】:

由于对象的基础是一个数组,您需要在根级别对其进行迭代,因此您的 for 循环应如下所示:

$('#listaDominios').toggle(resposta.length > 0);
for (var x = 0; x < resposta.length; x++){
  $('#listaDominios').append('<li>'+resposta[x].nomeDominio+'</li>');
}

或者$.each()路由:

$('#listaDominios').toggle(resposta.length > 0);
$.each(resposta, function() {
  $('<li />', { text: this.nomeDominio }).appendTo('#listaDominios');
});

重要的是resposta.nomeDominio 不是任何东西,因为响应的根是一个数组,但是resposta.length 会得到长度,所以使用它。此外,由于数组位于根目录并且其中的每个对象都有一个nomeDominio 属性,因此您希望resposta[x].nomeDominio 转到当前索引(以获取对象),然后调用.nomeDominio 以获取该属性。或者,使用$.each() 路由,其中​​this 引用当前对象,无论哪种方式都可以。

【讨论】:

  • @Nick Craver:尽管您的解释很好,但我仍然有疑问,希望您或其他任何人都可以解决。为什么 $('#listaDominios').toggle(resposta.length > 0); ? +resposta[x].nomeDominio+ - 为什么是 resposta[x] ?我的意思是,我知道 X 将是 1、2 3 等等……对吗?但是,您怎么知道:“[{"nomeDominio":"aaaa.ka"},{"nomeDominio":"agentesdeexecucao.ka"}]" 这将是访问每个不同的“nomeDominio”密钥的方式?提前致谢,MEM
  • @MEM - 我正在使用.toggle(),因为它是基于是否有任何元素的快速.show().hide()。你也使用resposta[x],因为resposta是返回的对象,它是一个数组......这就是你访问数组的方式:)
  • 关于第二个问题:是不是因为,自然将数组作为数字键索引?我认为每个键/值解析的键都是“nomeDominio”,并且没有与它们关联的数字......
  • @Nick Craver:所以,如果我们有这个 json 字符串: [{"nomeDominio":"aaaa.ka"},{"nomeDominio":"agentesdeexecucao.ka"}] 我们有 1 个 ARRAY (由 [] 指出)包含由 {} 指出的 2 个 OBJECTS,所以我们正在做的是迭代一个对象数组。而且,该数组的每个对象都是该数组的一个元素,因此,为了访问它们,我们使用数字引用。准确吗?
  • @MEM - 正确,一旦您通过 array[index] 获得该对象,您就可以从中获得一个属性。
猜你喜欢
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多