You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular应用中数据库数据无法显示问题求助

问题描述

我正在开发一个基于表单的Angular项目,表单数据已存入MySQL数据库。搜索功能需检索特定数据集,在独立视图中展示以支持更新或删除操作。搜索结果以链接形式呈现,点击后应用可路由至详情视图,但对应输入框为空。通过浏览器调试工具可见,XHR已返回正确数据集。

以下是相关代码片段:

detailview.html(节选)

<div *ngIf="patient"> 

    <h2> Meine Daten:</h2>

    <div>
        <label for="patientendaten-titel">Titel: </label>
        <input id="patientendaten-titel" [(ngModel)]="patient.titel" placeholder="titel">
    </div>

    <div>
        <label for="patientendaten-anrede">Anrede: </label>
        <input id="patientendaten-anrede" [(ngModel)]="patient.anrede" placeholder="anrede">
    </div>

    <div>
        <label for="patientendaten-vorname">Vorname: </label>
        <input id="patientendaten-vorname" [(ngModel)]="patient.vorname" placeholder="vorname">
    </div>

    <div>
        <label for="patientendaten-name">Nachname </label>
        <input id="patientendaten-name" [(ngModel)]="patient.name" placeholder="name">
    </div>
</div>

detailview.component.ts

patient: Patientendaten | undefined;
getPatient():void{ 
    const id = parseInt (this.route.snapshot.paramMap.get('id')!);
    this.formService.getPatientId(id).subscribe(patient=> this.patient = patient);
  }

form.service.ts

private formUrl2 = 'http://localhost/api/getId.php' 

public getPatientId (id: number): Observable<Patientendaten>{

    const url = `${this.formUrl2}/${id}`;
    return this.http.get<Patientendaten>(url);

  }

getId.php

<?php

// returns data of patient selected by Id as JSON

require 'connect_db.php';

$url= $_SERVER['REQUEST_URI'];
$id= basename($url);

$sql = "SELECT id, titel, anrede, vorname, name, strasse, hausnr, plz, ort, telefonnr, email 
    FROM personendaten
    WHERE id = '$id'";
$result = mysqli_query($con, $sql);

echo json_encode ($result->fetch_all(MYSQLI_ASSOC));

$con->close();

?>
问题原因

PHP接口返回的是包含单个对象的数组,但Angular组件期望接收的是单个Patientendaten对象。fetch_all(MYSQLI_ASSOC)方法会将查询结果转换成数组格式(即使只有一条记录),导致Angular中patient变量实际是数组,无法匹配模板中patient.titel这类属性访问,因此输入框无法渲染数据。

解决方案

1. 修正PHP接口返回格式

将PHP中的fetch_all(MYSQLI_ASSOC)替换为fetch_assoc(),该方法只返回单条记录的关联数组,符合单个对象的结构:

// 替换原echo语句
echo json_encode($result->fetch_assoc());

2. 修复SQL注入风险(关键优化)

原代码直接将URL中的ID拼入SQL语句,存在严重的SQL注入风险。改用预处理语句安全获取参数:

<?php
require 'connect_db.php';

// 从URL路径获取ID
$urlParts = parse_url($_SERVER['REQUEST_URI']);
$pathParts = explode('/', trim($urlParts['path'], '/'));
$id = end($pathParts);

// 使用预处理语句
$sql = "SELECT id, titel, anrede, vorname, name, strasse, hausnr, plz, ort, telefonnr, email 
        FROM personendaten
        WHERE id = ?";
$stmt = $con->prepare($sql);
$stmt->bind_param("i", $id); // "i"表示参数为整数类型
$stmt->execute();
$result = $stmt->get_result();

echo json_encode($result->fetch_assoc());

$stmt->close();
$con->close();
?>

3. 验证Angular接口定义

确保Patientendaten接口的属性与PHP返回的JSON字段完全一致(字段名大小写、拼写必须匹配),示例:

export interface Patientendaten {
  id: number;
  titel: string;
  anrede: string;
  vorname: string;
  name: string;
  // 其他对应字段...
}

4. 添加调试与错误处理(可选)

在Angular组件的subscribe中添加错误回调,便于排查问题:

getPatient():void{ 
    const id = parseInt (this.route.snapshot.paramMap.get('id')!);
    this.formService.getPatientId(id).subscribe({
      next: (patient) => this.patient = patient,
      error: (err) => console.error('加载患者数据失败:', err)
    });
  }

内容的提问来源于stack exchange,提问作者doodlebug

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:14:52