fetchall导致javascript中出现“无法读取属性”错误

eqzww0vc  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(188)

我有一个数据库,在users表中有“firstname”和“lastname”列。使用ajax,我想获取所有名字以s开头的用户,然后在列表中显示他们的名字和姓氏。所以它应该告诉我:
莎拉安德森
肖恩·韦斯特
这是我用来获取用户列表的:

public function searchName($searchName)
{
    $pdo = Db::connect();
    $stmt = $pdo->prepare("SELECT firstname, lastname FROM users WHERE firstname LIKE :searchName OR lastname LIKE :searchName");
    $stmt->execute(['searchName' => '%' . $searchName . '%']);
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $result;
}

这是我用来循环结果的js函数

function viewResults(result) {
   const results = document.getElementById("results");
   results.innerHTML = "";

   for (let i = 0; i < result.length; i++) {
          const li = document.createElement("li");
          li.innerHTML = result['i'];
          results.appendChild(li);
   }
}

当我运行这个时,它会显示正确数量的列表项,但是所有的列表项都是“未定义的”。我不能使用:

li.innerHTML = result['i']['firstname']['lastname'];

当我使用fetch()而不是fetchall()时,上面的方法可以很好地工作,唯一的问题是fetch()只返回一个用户。我猜问题是fetchall()在数组中返回一个数组?我尝试在sql查询中同时使用foreach和while,但都没有用。

13z8s7eq

13z8s7eq1#

问题如下:

li.innerHTML = result['i'];

另外,你也尝试过:

li.innerHTML = result['i']['firstname']['lastname'];

这个 result 对象是一个数组,因此它没有名为“i”的属性。你需要使用这个变量 i ,而不是字符串文字“i”。所以访问 result[i] .
第二,当你找回 firstname 属性,您将得到一个字符串。但是你想找个地方住 lastname 那根绳子的长度。那是行不通的。相反,你应该找回 lastname 分开,继续 result[i] .
最后,最好不要使用 innerHTML 指定纯文本时。 innerHTML 用于分配html编码的数据。使用 textContent 对于纯文本数据。
所以,这一行应该是:

li.textContent = result[i].firstname + " " + result[i].lastname;

当使用 for...of 循环分解:

function viewResults(result) {
   const results = document.getElementById("results");
   results.innerHTML = "";

   for (const { firstname, lastname } of result) {
       const li = document.createElement("li");
       li.textContent = firstname + " " + lastname;
       results.appendChild(li);
   }
}

相关问题