Tuve el mismo problema, así que adapté esta respuesta 1251063 a la declaración preparada de php:
if(!($stmt = $this->conn->prepare("INSERT INTO mytable (myfield) VALUES (IFNULL(?,DEFAULT(myfield)))"))){
throw new Exception("Prepare failed: (" . $this->conn->errno . ") " . $this->conn->error);
}
if(!($stmt->bind_param("s",$myfield))) { //$myfield is a variable that can be null, if so the default value for such field will be inserted
throw new Exception("Bind_param failed: (" . $this->conn->errno . ") " . $this->conn->error);
}
if(!$stmt->execute()) {
throw new Exception("Execute failed: (" . $stmt->errno . ") " . $stmt->error);
}