400 Bad request when sending data through ethernet - ESP32

I am getting "400 Bad Request" when sending data to mySQL database using php
Here is my code:

#include <EthernetENC.h>
#include <SPI.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  //0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED //0x8C,0xAA,0xB5,0xA2,0x14,0xB0
  0x8C, 0xAA, 0xB5, 0xA2, 0x14, 0xB0
IPAddress ip(116, 75, 59, 24);
IPAddress myDns(192, 168, 0, 1);
char serv[] = "http://understaffed-partie.000webhostapp.com";
String tagID = "123ABC";
String RTCtime2 = "2020-12-27 11:58:32";
String GateNO = "gate2";

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
//EthernetServer server(80);
EthernetClient client;
unsigned long beginMicros, endMicros;
unsigned long byteCount = 0;
bool printWebData = true;  // set to false for better speed measurement

void setup() {
  // You can use Ethernet.init(pin) to configure the CS pin
  //Ethernet.init(10);  // Most Arduino shields
  //Ethernet.init(5);   // MKR ETH shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
  Ethernet.init(5);  // ESP32 with Adafruit Featherwing Ethernet

  // Open serial communications and wait for port to open:
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // Check for Ethernet hardware present
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1); // do nothing, no point running without Ethernet hardware
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  DHCP assigned IP ");
  // give the Ethernet shield a second to initialize:
  Serial.print("connecting to ");
  if (client.connect(serv, 80)) {
    Serial.print("connected to ");
    // Make a HTTP request:
    client.println(String("GET http://understaffed-partie.000webhostapp.com/connect.php?") +
                   ("tagID=") + tagID + ("&RTCtimestamp=") + RTCtime2 + ("&GateNO=") + GateNO +
                   ("&i=1") +
                   " HTTP/1.1\r\n" +
                   "Host: " + serv + "\r\n" +
                   "Connection: close\r\n\r\n");
    Serial.println(String("GET http://understaffed-partie.000webhostapp.com/connect.php?") +
                   ("tagID=") + tagID + ("&RTCtimestamp=") + RTCtime2 + ("&GateNO=") + GateNO +
                   ("&i=1") +
                   " HTTP/1.1\r\n" +
                   "Host: " + serv + "\r\n" +
                   "Connection: Keep-Alive\r\n\r\n");
    //client.println("Connection: close");
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  int len = client.available();
  if (len > 0) {
    byte buffer[80];
    if (len > 80) len = 80;
    client.read(buffer, len);
    if (printWebData) {
      Serial.write(buffer, len); // show in the serial monitor (slows some boards)
    byteCount = byteCount + len;

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    endMicros = micros();
    Serial.print("Received ");
    Serial.print(" bytes in ");
    float seconds = (float)(endMicros - beginMicros) / 1000000.0;
    Serial.print(seconds, 4);
    float rate = (float)byteCount / seconds / 1000.0;
    Serial.print(", rate = ");
    Serial.print(" kbytes/second");

    // do nothing forevermore:
    while (true) {

I have attached the screenshot of the output below.
Here are the things that I tried:

  1. I used "http" instead of "https"
  2. Wherever I needed to add space I added "%20". Also tried sending the string without "%20"
    Any other suggestion ?

Have you tried sending a completed HTTP request by pasting the string as printed out in your serial monitor directly into a browser page? And try a shortened version of updating just one parameter, does it work, yes, add another parameter, till it don't work then you know the problem area.

In other words break it down into small bits, get the small bit to work, add in another bit.

Hii Idahowalker, Yes I have tried that and it works.. the data is updated in my database as expected when I browse the same link (which is printed on serial monitor)

So the entire http string works when directly entered into a browser page. I'd look to see if the ESP32 is actually going to the web site. Can the ESP32 ping your web site.

I tried to ping the same url using wifi.h library with ESP32 and it works.. but it is not working when I use Ethernet. I am using ENC28J60 ethernet module and EthernetENC library

So if you use WiFi, does the HTTP request work?


Points to the Ethernet thingy being the issue.