Java, C/C++, Python, C#, LISP, AutoLisp, AutoCAD e VBA
PHP, Python, C#, JavaScript, Laravel, Google Ads e SEO

Você está aqui: Cards de Engenharia Civil - Construção Civil
Card 1 de 28
Fases de uma obra

A Planta de Localização (escala usual 1:200) identifica a posição da obra no terreno. Serve para implantar o projeto.

Filtrar Cards
Use esta opção para filtrar os cards pelos tópicos que mais lhe interessam.
Termos:
Aviso Importante: Nos esforçamos muito para que o conteúdo dos cards e dos testes e conhecimento seja o mais correto possível. No entanto, entendemos que erros podem ocorrer. Caso isso aconteça, pedimos desculpas e estamos à disposição para as devidas correções. Além disso, o conteúdo aqui apresentado é fruto de conhecimento nosso e de pesquisas na internet e livros. Caso você encontre algum conteúdo que não deveria estar aqui, por favor, nos comunique pelos e-mails exibidos nas opções de contato.
Link para compartilhar na Internet ou com seus amigos:

Java ::: Desafios e Lista de Exercícios Resolvidos ::: Laços de Repetição

Exercícios Resolvidos de Java - Ler a idade e o peso de 10 pessoas e mostrar a quantidade de pessoas com mais de 80 quilos e a média das idades

Quantidade de visualizações: 2382 vezes
Pergunta/Tarefa:

Escreva um programa Java que receba a idade (como int) e o peso (como double) de 10 pessoas. Em seguida calcule e mostre:

1) A quantidade de pessoas com mais de 80 quilos;
2) A média das idades das pessoas.

Sua saída deve ser parecida com:

Informe a idade da 1.a pessoa: 95
Informe o peso da 1.a pessoa: 83

Informe a idade da 2.a pessoa: 45
Informe o peso da 2.a pessoa: 115

Informe a idade da 3.a pessoa: 83
Informe o peso da 3.a pessoa: 76

Informe a idade da 4.a pessoa: 19
Informe o peso da 4.a pessoa: 79

Informe a idade da 5.a pessoa: 40
Informe o peso da 5.a pessoa: 93

Quantidade de pessoas com mais de 80 quilos: 3
Média das idades das pessoas: 56.4
Resposta/Solução:

Veja a resolução comentada deste exercício usando Java:

package estudos;

import java.util.Scanner;

public class Estudos {
  public static void main(String[] args) {
    // para ler a entrada do usuário
    Scanner entrada = new Scanner(System.in);
    
    int quant_acima_80_kg = 0; // quantidade de pessoas acima de 80 quilos
    int soma_idades = 0; // soma das idades para depois obter a média
    
    // vamos ler os dados das 5 pessoas
    for(int i = 0; i < 5; i++){
      System.out.print("Informe a idade da " + (i + 1) + ".a pessoa: ");
      int idade = Integer.parseInt(entrada.nextLine());
      System.out.print("Informe o peso da " + (i + 1) + ".a pessoa: ");
      double peso = Double.parseDouble(entrada.nextLine());
      
      // vamos somar mais esta idade
      soma_idades = soma_idades + idade;
      
      // esta pessoa possui mais de 80 quilos?
      if(peso > 80){
        // aumenta o contador de pessoas acima de 80 quilos
        quant_acima_80_kg++;  
      }
      
      // adiciona uma quebra de linha
      System.out.println();
    }
    
    // e agora mostramos o resultado
    System.out.println("Quantidade de pessoas com mais de 80 quilos: " + 
      quant_acima_80_kg);
    System.out.println("Média das idades das pessoas: " + (soma_idades / 5.0));
  }
}



C# ::: LINQ ::: LINQ to Objects

Como retornar o último elemento de um array de strings em C# usando a função Last() do LINQ

Quantidade de visualizações: 1453 vezes
Nesta dica mostrarei um exemplo bem simples do uso do método Last() do LINQ (Language-Integrated Query) do C# para retornar o último elemento de um vetor de strings.

É claro que este método funciona com qualquer coleção, mas um exemplo simples nos ajudará a entender melhor o seu funcionamento. Em outras dicas eu aprofundo o uso deste método.

Vamos ao código então. Veja:

using System;
using System.Linq;

namespace Estudos {
  class Principal {
    static void Main(string[] args) {
      // vamos construir um vetor de strings
      string[] linguagens = {"Java", "Python", "PHP", "Ruby"};
      
      // vamos obter o último elemento do vetor
      string ultimo = linguagens.Last();

      // vamos mostrar o resultado
      Console.WriteLine("A última linguagem é: {0}", ultimo);

      Console.WriteLine("\nPressione uma tecla para sair...");
      Console.ReadKey();
    }
  }
}

Ao executar este código C# nós teremos o seguinte resultado:

A última linguagem é: Ruby

Fique atento ao fato de que o método Last() pode atirar uma exceção do tipo InvalidOperation se o array ou coleção estiver vazia ou não incluir nenhum elemento que se encaixe nas condições testadas.

Veja o resultado ao chamarmos este método em um vetor vazio:

System.InvalidOperationException
HResult=0x80131509
Message=Sequence contains no elements
Source=System.Linq
StackTrace:
at System.Linq.ThrowHelper.ThrowNoElementsException()
at System.Linq.Enumerable.Last[TSource](IEnumerable`1 source)
at Estudos.Principal.Main(String[] args) in C:\estudos_c#\Estudos\Principal.cs:line 11


Java ::: Coleções (Collections) ::: Stack

Java Collections - Como adicionar novos elementos a uma Stack Java

Quantidade de visualizações: 9452 vezes
Elementos são adicionados a uma pilha (um objeto da classe Stack) por meio do método push(). Veja sua assinatura:

public E push(E item)
Veja que este método nos permite adicionar o elemento E no topo da pilha e ao mesmo tempo obter uma referência ao elemento adicionado. É claro que raramente esta referência é útil, mas é bom saber exatamente a operação fornecida pelo método.

Veja um trecho de código no qual adicionamos três elementos à pilha:

package arquivodecodigos;

import java.util.*;
 
public class Estudos{ 
  public static void main(String args[]){ 
    // Cria uma Stack de String
    Stack<String> pilha = new Stack<>();
    System.out.println("Tamanho da pilha antes: " +
      pilha.size());
    
    // adiciona três elementos na pilha
    pilha.push("Cuiabá");
    pilha.push("Goiânia");
    pilha.push("Belo Horizonte");
    
    System.out.println("Tamanho da pilha agora: " +
      pilha.size());
  } 
}

Ao executarmos este código Java nós teremos o seguinte resultado:

Tamanho da pilha antes: 0
Tamanho da pilha agora: 3


Python ::: Python para Engenharia ::: Engenharia Civil - Concreto, Concreto Armado e Concretos Especiais

Cálculo de estribos em vigas de concreto armado usando Python - Verificação da compressão diagonal do concreto

Quantidade de visualizações: 588 vezes
No dimensionamento de vigas de concreto armado à força cortante, ou seja, aos esforços de cisalhamento, nós adotamos, de acordo com recomendações da ABNT NBR 6118 (Projeto de estruturas de concreto armado), o modelo de treliça clássica de Ritter-Mörsh, na qual é suposto que uma carga aplicada num ponto qualquer de uma viga de concreto armado, chegue até os apoios percorrendo o caminho de uma treliça. Recordemos ainda que na treliça clássica de Ritter-Mörsh o ângulo de inclinação das bielas comprimidas é igual à 45°.

Neste modelo de treliça, a compressão do banzo superior é resistida pelo concreto, enquanto a tração do banzo inferior é resistida pelo aço. As diagonais comprimidas também são resistidas pelo concreto, cabendo ao aço (estribos) o papel de reforçar as diagonais tracionadas. Notem que usei "reforçar", pois o concreto oferece também uma parcela de resistência à tração nestas diagonais.

Sendo assim, um dos primeiros passos no cálculo e detalhamento das armaduras transversais, ou seja, a armadura de cisalhamento de uma viga de concreto armado, é a verificação da compressão diagonal do concreto. Neste passo nós verificamos se as bielas comprimidas resistem ao esforço cortante solicitante de projeto VSd.

A verificação da compressão diagonal do concreto no Modelo I (no qual o ângulo &#945;, que é o ângulo entre os estribos e o eixo longitudinal da viga, pode ser considerado entre 45º e 90º) pode ser realizada por meio da seguinte fórmula:

\[V_\text{Rd2} = 0,27 \cdot \alpha_\text{v2} \cdot f_\text{cd} \cdot b_w \cdot d \]
Onde:

fcd é a resistência de cálculo do concreto, em kN/cm2;

bw é a largura da viga, em centímetros;

d é a altura útil da viga em centímetros;

Já o &#945;v2 pode ser calculado pela seguinte fórmula:

\[\alpha_\text{v2} = 1 - \frac{f_\text{ck}}{250}\]
Onde:

fck é a resistência característica do concreto, em Mpa.

Veja agora o código Python :

# método principal
def main():
  # vamos pedir para o usuário informar a altura da viga
  altura = float(input("Informe a altura h da viga em cm: "))
   
  # vamos pedir para o usuário informar a largura da viga
  largura = float(input("Informe a largura bw da viga em cm: "))

  # vamos calcular a altura útil da viga
  # aqui eu usei 0.9 mas alguns engenheiros usam 0.95
  altura_util = 0.9 * altura
  
  # vamos pedir para o usuário informar o FCK do concreto
  fck = float(input("Informe o FCK do concreto em Mpa: "))

  # vamos ler o coeficiente de minoração do concreto
  yc = float(input("Informe o coeficiente de minoração yc: "))   

  # vamos solicitar o esforço cortante solicitante VSk
  VSk = float(input("Informe o esforço cortante solicitante em kN: ")) 

  # vamos ler o coeficiente de majoração das cargas
  yf = float(input("Informe o coeficiente de majoração yf: "))

  # vamos calcular o esforço cortante solicitante de cálculo VSd
  VSd = yf * VSk

  # agora vamos calcular o fcd do concreto
  fcd = fck / yc

  # vamos calcular o alfa v2
  av2 = 1 - (fck / 250)

  # finalmente vamos calcular o VRd2 no Modelo de Cálculo I
  VRd2 = 0.27 * av2 * (fcd / 10) * largura * altura_util 

  # vamos mostrar os resultados
  print("\n------ RESULTADOS -----------------------------")
  print("O fcd do concreto é: {0} Mpa".format(round(fcd, 4)))
  print("O valor de av2 é: {0}".format(round(av2, 4)))
  print("O valor de VRd2 é: {0} kN".format(round(VRd2, 4)))
  print("O valor de VSd é: {0} kN".format(round(VSd, 4)))

  # vamos testar se as bielas de compressão não serão esmagadas
  if (VSd <= VRd2):
    print("VSd <= VRd2: As bielas de compressão RESISTEM")
  else:
    print("VSd > VRd2: As bielas de compressão NÃO RESISTEM")

if __name__ == "__main__":
  main()

Ao executar este código Python nós teremos o seguinte resultado:

Informe a altura h da viga em cm: 40
Informe a largura bw da viga em cm: 20
Informe o FCK do concreto em Mpa: 25
Informe o coeficiente de minoração yc: 1.4
Informe o esforço cortante solicitante em kN: 75
Informe o coeficiente de majoração yf: 1.4

------ RESULTADOS -----------------------------
O fcd do concreto é: 17.8571 Mpa
O valor de av2 é: 0.9
O valor de VRd2 é: 312.4286 kN
O valor de VSd é: 105.0 kN
VSd <= VRd2: As bielas de compressão RESISTEM


Angular ::: Artigos e Tutorias ::: CRUD - CREATE, READ, UPDATE, DELETE

Tutorial Angular para iniciantes: Como criar uma aplicação que grava novos alunos em uma base de dados MySQL usando PHP como back-end - Versão Angular CLI

Quantidade de visualizações: 6903 vezes
Neste pequeno tutorial mostrarei como é possível usar o framework Angular para desenvolver um front-end que permite cadastrar alunos no banco de dados MySQL usando a linguagem PHP como back-end. É claro que você poderá trocar o PHP por Node.js ou qualquer linguagem do lado do servidor. O importante aqui é entender o processo de desenvolvimento.

Então, se você ainda não o fez, verifique se o Angular CLI está devidamente instalado e funcionando na sua máquina. Isso pode ser feito abrindo-se uma nova janela de terminal e disparando o comando:

c:\estudos_web>ng --version

Sua máquina deverá retornar algo parecido com:

Angular CLI: 11.2.1
Node: 14.15.4
OS: win32 x64

Obteve resultado semelhante? Então podemos prosseguir. Comece disparando o comando abaixo para criar uma nova aplicação Angular usando o Angular CLI:

c:\docs_osmar>cd c:\estudos_angular
c:\estudos_angular>ng new escola

Veja que pedi para o comando ng do Angular CLI criar um novo projeto com o nome escola (você pode escolher o nome que desejar). Aguarde alguns minutos até que o processo seja finalizado.

Criando a entidade Aluno, ou a classe Aluno, ou melhor ainda, o model Aluno

Como nossa aplicação vai gravar alunos na base de dados, nada melhor do que começar criando nossa entidade ou model Aluno. Vá até a pasta "C:\estudos_angular\escola\src\app" e crie um arquivo chamado aluno.ts com o seguinte conteúdo:

export class Aluno{
  id: number = 0;
  matricula: number;
  nome: string;
  curso: string;
  
  constructor(matricula: number, nome: string,
    curso: string, id?: number) {
    this.matricula = matricula;
    this.nome = nome;
    this.curso = curso;
  }
}

Veja que nosso model Aluno possui os atributos matricula, nome, curso e id (que é opcional na classe, pois será gerado automaticamente pela tabela no banco de dados MySQL.

O passo seguinte é criar o serviço que nos permitirá a comunicação com o servidor remoto, a saber: a página PHP que gravará os dados na base MySQL.

Criando o serviço aluno.service para a comunicação com o servidor remoto

Para criar o serviço que nos permitirá gravar os alunos na base de dados MySQL, abra uma janela de terminal (ou use a que você já tem aberta) e dispare o seguinte comando:

c:\escola>ng generate service cadastros/aluno --flat
CREATE src/app/cadastros/aluno.service.spec.ts (352 bytes)
CREATE src/app/cadastros/aluno.service.ts (134 bytes)

Note que este comando deve ser disparado dentro da pasta da sua aplicação. Agora, temos um arquivo aluno.service.ts dentro da pasta cadastros no diretório C:\estudos_angular\escola\src\app (o seu deve ser diferente, não se esqueça).

Assim, abra o arquivo aluno.service.ts e vamos modificá-lo para o seguinte código:

import {Injectable} from '@angular/core';

// precisamos do serviço HTTP para fazer a requisição AJAX
import {HttpClient, HttpErrorResponse, HttpParams} from '@angular/common/http';

// precisamos também do Observable, do map e catchError
import {Observable, throwError} from 'rxjs';
import {map, catchError} from 'rxjs/operators';

// precisamos também da classe Aluno
import {Aluno} from '../aluno';

@Injectable({
  providedIn: 'root'
})
export class AlunoService {
  // url base do endereço do serviço remoto
  baseUrl = 'http://localhost/servicos';
  // vetor de alunos já gravados
  alunos: Aluno[] = [];
  
  // vamos fazer uma injeção de dependência aqui
  constructor(private http: HttpClient){}

  // método que permite fazer uma requisição HTTP e gravar
  // o novo aluno
  cadastrar(aluno: Aluno): Observable<Aluno[]> {
    const dados = {
      nome: aluno.nome, matricula: aluno.matricula, 
      curso: aluno.curso,
    };

    return this.http.post(`${this.baseUrl}/gravar_aluno.php`, {dados: aluno})
      .pipe(map((res) => {
        // adiciona o novo aluno no vetor de alunos
        this.alunos.push(res['dados']);
        // e o retorna para o chamador deste método
        return this.alunos;
      }),
      
      catchError(this.tratarErro));
  }

  private tratarErro(error: HttpErrorResponse) {
    // vamos mostrar o erro no console
    console.log(error);

    // e vamos matar a aplicação aqui, pois não há mais nada
    // a fazer
    return throwError('Houve um erro: ' + error);
  }
}

Há algumas importações importantes neste serviço: Injectable do '@angular/core', HttpClient, HttpErrorResponse e HttpParams do '@angular/common/http', Observable e throwError do 'rxjs', map e catchError do 'rxjs/operators' e, mais importante, a classe Aluno de '../aluno'. Em outras dicas em nosso site você aprenderá melhor sobre cada um desses imports.

No construtor da classe AlunoService nós fazemos uma injeção de dependência (DI) para um objeto HttpClient, que será usado para fazer uma requisição POST. Esta requisição ocorre no método cadastrar(), que recebe um objeto da classe Aluno e o fornece como JSON na requisição POST. Assim que o novo aluno é cadastrado na base de dados MySQL, este método retorna o novo aluno (como JSON) e nós o adicionamos a um vetor de alunos, que será exibido na tela de cadastro para indicar os alunos já cadastrados.

Antes de prosseguirmos, que diacho é esse erro "implicitly has an 'any' type"?

Se você tentar executar a aplicação agora, de imediato já notará duas mensagens de erro (ou pelo menos uma delas):

Error: src/app/app.component.ts:24:18 - error TS7006: Parameter 'f' implicitly has an 'any' type.
24 cadastrarAluno(f) {

Error: src/app/cadastros/aluno.service.ts:36:26 - error TS7053: Element implicitly has an 'any' type because expression of type '"dados"' can't be used to index type 'Object'.
Property 'dados' does not exist on type 'Object'.
36 this.alunos.push(res['dados']);

Se elas aparecem na sua versão do Angular, basta adicionar a linha

"noImplicitAny": false

no arquivo tsconfig.json na raiz da aplicação e o problema será resolvido.

Já estamos bem adiantados. Hora de escrever o código do app.component.ts

O Angular CLI já criou um arquivo app.component.ts. Abra-o e altere o seu código para a versão abaixo:

import {Component} from '@angular/core';

// importamos a classe Aluno
import {Aluno} from './aluno';
// importamos o serviço AlunoService
import {AlunoService} from './cadastros/aluno.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  alunos: Aluno[] = [];
  // criamos uma nova instância da classe Aluno
  aluno = new Aluno(0, '', '', 0);
  erro = '';
  sucesso = '';

  // fazemos uma injeção de dependência aqui
  constructor(private alunoService: AlunoService) {}

  // aqui temos o método que permitirá cadastrar um novo aluno
  cadastrarAluno(f) {
    this.alunoService.cadastrar(this.aluno)
      .subscribe(
        (res: Aluno[]) => {
          // recebemos a lista atualizada de alunos
          this.alunos = res;

          // enviamos um ok para o formulário
          this.sucesso = 'Aluno cadastrado com sucesso.';

          // finalmente resetamos o formulário
          f.reset();
        },
        (err) => this.erro = err
      );
  }
}


Neste arquivo temos uns imports importantes: Component do '@angular/core', Aluno de './aluno' e AlunoService de './cadastros/aluno.service'. Em seguida, dentro da anotação @Component nós temos as definições para o selector, o templateUrl e o styleUrls. Finalmente, na classe AppComponent, nós temos as declaramos de um vetor de Aluno[], um objeto da classe Aluno e algumas variáveis auxiliares.

No construtor dessa classe nós fazemos uma injeção de dependência (DI) para um objeto da classe AlunoService. Então temos o método cadastrarAluno(), que recebe o formulário HTML e o repassa para o método cadastrar() do aluno.service. Como retorno desse método nós obtemos a lista atualizada dos alunos já cadastrados nessa sessão (atenção: não estamos obtendo os alunos cadastrados anteriomente na base de dados MySQL. Isso será visto em outra parte do tutorial).

Já temos o app.component.ts, vamos complementar o app.component.html

Com o app.component.ts devidamente ajustado, vamos nos concentrar agora no app.component.html, que contém o formulário que nos permitirá cadastrar os alunos. Veja o código completo para ele:

<h3>Cadastrar Novo Aluno</h3>

<form #f="ngForm" name="cadastrarForm">
<table width="200" border="0" cellspacing="3" cellpadding="3">
    <tr>
      <td>Matrícula:</td>
      <td><input type="text" name="matricula" [(ngModel)]="aluno.matricula"></td>
    </tr>
    <tr>
      <td>Nome:</td>
      <td><input type="text" name="nome" [(ngModel)]="aluno.nome"></td>
    </tr>
    <tr>
      <td>Curso:</td>
      <td><input type="text" name="curso" [(ngModel)]="aluno.curso"></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><button (click)="cadastrarAluno(f)">Gravar</button></td>
    </tr>
  </table>
</form>

<div *ngIf="erro" class="alert alert-danger">{{erro}}</div>
<div *ngIf="sucesso" class="alert alert-success">{{sucesso}}</div>

<ul *ngFor="let aluno of alunos; let i = index;">
    <li>{{i + 1}}; {{aluno.matricula}}; {{aluno.nome}}; {{aluno.curso}}</li>
</ul>

Veja que fiz um código HTML bem simples, sem firulas. Depois que você entender todos os elementos, então você poderá formatar e deixar mais bonito. O importante é observar como usamos ngModel para ligar os campos do formulário aos atributos da classe Aluno. Coloquei também dois ngIf para mostrar as mensagens de sucesso e de erro, e, finalmente, um ngFor para percorrer e exibir os alunos já cadastrados durante essa sessão.

Vamos lá? Já podemos executar o exemplo. A partir da pasta raiz da aplicação, dispare o comando abaixo:

c:\estudos_angular\escola>ng serve --open

Depois de alguns segundos teremos o seguinte resultado:



Obteve o mesmo resultado? Que maravilha! Mas não podemos cadastrar alunos ainda, pois a parte do back-end ainda não foi desenvolvida. Mas isso é coisa simples.

Criando a tabela no banco de dados MySQL

Nosso front-end já está completo e rodando. Chegou a hora de nos concentrarmos no back-end. Inicialmente vamos criar a tabela na base de dados MySQL. Veja sua estrutura e o código SQL DDL para a sua criação:

CREATE TABLE `alunos` (
  `id` int(11) NOT NULL,
  `matricula` int(11) NOT NULL,
  `nome` varchar(100) NOT NULL,
  `curso` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Marque o campo id como chave primária e auto-incremento. Agora vamos ao código PHP, que mantive muito simples também, sem validações, o que deixo por sua conta.

A página PHP que recebe os alunos e os gravam na tabela MySQL

Segue abaixo o código completo para a página gravar_aluno.php, colocada no diretório "C:\xampp\htdocs\servicos" (fique atento ao endereço onde você vai colocá-la, seja na sua máquina local ou em um servidor remoto):

<?php
  // não deixe quebra de linha nos headers abaixo
  header('Access-Control-Allow-Origin: *');
  header('Access-Control-Allow-Methods: POST, GET, 
    PUT, DELETE, OPTIONS');
  header('Access-Control-Allow-Headers: Origin, 
    X-Requested-With, Content-Type, Accept');
  header("Content-Type: application/json; charset=utf-8");

  // vamos obter os dados vindo do formulário
  // atenção: em um código real temos que validar
  $dados = file_get_contents("php://input");
  
  // a requisição foi post?
  if(isset($dados) && !empty($dados)){
    $request = json_decode($dados);
    $nome = $request->dados->nome;
    $matricula = $request->dados->matricula;
    $curso = $request->dados->curso;

    // vamos efetuar a conexão com o banco
    $con = new mysqli("localhost", "root",
      "osmar1234", "estudos");
   
    // conexão efetuada com sucesso?
    if($con->connect_errno){
      echo "Não foi possível efetuar a conexão: " . 
        $mysqli->connect_error;
      exit(); // vamos sair daqui 
    }   
  
    // comando sql
    $query = "INSERT INTO alunos(id, matricula, nome, 
      curso) VALUES (null, '$matricula', '$nome', '$curso')";

    // vamos disparar o comando sql
    if(mysqli_query($con, $query)){
      http_response_code(201);
      $aluno = [
        'matricula' => $matricula,
        'nome' => $nome,
        'curso' => $curso,
        'id' => mysqli_insert_id($con)
      ];
  
      // vamos retornar o aluno recém cadastrado
      echo json_encode(['dados'=>$aluno]);
    }
    else{
      http_response_code(422);
    }
  }
?>

Se você observar atentamente o nosso exemplo, verá que a aplicação Angular está rodando em http://localhost:4200 enquanto a página PHP estará rodando em http://localhost/servicos/gravar_aluno.php, ou seja, mesmo servidor mas portas diferentes. Dessa forma, a requisição AJAX feita a partir da aplicação Angular vai falhar, com a seguinte mensagem de erro:

Access to XMLHttpRequest at 'http://localhost/servicos/gravar_aluno.php' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Por essa razão, a página PHP contém os headers que liberam o acesso cross-site (de servidor diferente):

// não deixe quebra de linha nos headers abaixo
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');
header("Content-Type: application/json; charset=utf-8");

Um outro detalhe interessante é o uso da função PHP file_get_contents("php://input") para receber o JSON enviado pela aplicação Angular. Programadores PHP vão achar isso uma "gambiarra", mas, atualmente, essa é a única forma de recebermos uma requisição POST usando JSON no PHP.

O restante do código é fácil de entender: criamos a conexão com o banco de dados, gravamos o aluno e retornamos um novo JSON contendo o novo aluno inserido. Note o uso de mysqli_insert_id() para obter o id do registro recém-inserido com o propósito de devolvermos o novo aluno com esse atributo já preenchido.

E agora o resultado final. Veja a imagem abaixo:



Conseguiu executar o exemplo também? Em outra dicas de Angular você encontra as demais partes do tutorial, a saber: listar, editar e excluir os alunos. Até lá e bons estudos.


Veja mais Dicas e truques de Angular

Dicas e truques de outras linguagens

E-Books em PDF

E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby


E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser. Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book Apenas R$ 32,90

Planilha Web - Planilhas e Calculadoras online para estudantes e profissionais de Engenharia Civil, Engenharia Elétrica e Engenharia Mecânica.


© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 66 usuários muito felizes estudando em nosso site.