Angular 6和PHP:无法通过HttpParams将参数发送到PHP脚本

时间:2018-07-13 11:09:36

标签: php angular httpclient angular6 http-parameters

我有这个API函数:

public function login($conn, $user){
    $login = "SELECT username FROM login WHERE username=:user";
    $execLogin = $this->conn->prepare($login);
    $execLogin->bindValue(":user", $user);
    $execLogin->execute();
    $res = $execLogin->rowCount();

    try{
        return $res;
    }
    catch(PDOException $e)
    {
        return $e->getMessage();
    }
}

这是单击登录按钮时的php脚本:

<button id="btn-login"  (click)="login()" [disabled]="!loginGroup.valid" class="btn btn-success">Login </button>

登录功能的脚本将运行:

<?php

require_once('../api.php');

//Getting username and password from Angular

$user = $_POST['user'];

$newApi = new api();
$conn = $newApi->connection();
$res = $newApi->login($conn, $user);

?>

这是打字稿中使用的方法。在API服务中:

login(username, password)
  {
    let headerOptions = new HttpHeaders();
    headerOptions.append('Access-Control-Allow-Origin', '*');
    headerOptions.append('Access-Control-Request-Headers', '*');
    headerOptions.append('Content-Type', 'application/json');
    headerOptions.append('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');


    this.credentials = {user: username, pass: password};
    const httpParams = new HttpParams();
    httpParams.set('user', username);
    httpParams.set('pass', password);
    //console.log("hi "+ this.credentials);
    return this.http.post('http://dev.local/scripts/login.php', {username, password},  {
      observe: 'response',
      responseType: 'text',
      headers: headerOptions

    }).pipe(map(
        res=>{

          console.log(res)
        },
        err=>
          console.log(err)
      ))
  }

然后单击按钮:

login(){
    let user = this.loginGroup.get('username').value;
    let pass = this.loginGroup.get('password').value;
    this.auth.login(user, pass).subscribe(
      (data)=>{

        console.log(data)
      },
      (error)=>{
        console.log(error)
      }
    )
  }

问题是我总是在控制台的“网络”选项卡上看到以下错误:

call to undefined variable user at line 7

看来用户不是通过打字稿方法发送到PHP脚本的。

编辑

enter image description here

2 个答案:

答案 0 :(得分:0)

如果您使用HttpParams,请注意该类是不可变的(Documentation

所以您需要这样做

const httpParams = new HttpParams().set('user', username).set('pass', password);

编辑:您的PHP脚本需要使用表单编码值,因此您需要执行以下操作

let headerOptions = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');

return this.http.post('http://dev.local/scripts/login.php',
    httpParams.toString(), {
  observe: 'response',
  responseType: 'text',
  headers: headerOptions

}
);

方法2

如果要以json形式发送数据,则需要修改PHP脚本以解析请求的正文

$jsonInput = file_get_contents('php://input');
$jsonObject = json_decode($jsonInput, true); 
$user = $jsonObject->user;

您需要指定正确的参数名称角边

return this.http.post('http://dev.local/scripts/login.php',
    {user: username, password: password},
    ...

另外,请注意,您的Access-Control标头在角度上没有用,应在响应OPTIONS请求时将其设置为服务器端

答案 1 :(得分:0)

首先,打开浏览器的开发人员工具,并检查网络呼叫以查看发送的内容。

然后,您正在实例化HttpParams,但是您没有使用它,因此您没有发送它。

根据David的建议,您需要以表单编码模式进行通信,因此需要将其设置为HttpHeader:

let headerOptions = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');

尝试一下:

return this.http.post('http://dev.local/scripts/login.php', 
          {'user': username, 'pass': password}
          { headers: headerOptions }
      )