Accessing Your XAMPP Database from a Flutter App on Ubuntu

Developing Flutter applications that interact with a local XAMPP database on Ubuntu can sometimes present connectivity challenges. This article provides a step-by-step guide to successfully connect your Flutter app to your XAMPP database.

Prerequisites

  • XAMPP installed and running on your Ubuntu machine.
  • A Flutter project set up and ready to go.
  • Basic understanding of PHP and MySQL.

Step 1: Identify Your Ubuntu Machine’s IP Address

First, determine the IP address that your Flutter app will use to communicate with the XAMPP server. Open a terminal and use the following command:

ip a

Look for the IP address associated with your network interface (e.g., eth0 or wlan0). It’s usually listed under inet. Note this IP address, as you’ll need it in your Flutter code.

Step 2: Configure MySQL to Listen on the Correct IP Address

By default, MySQL might be configured to only listen on localhost. To allow connections from your Flutter app (which runs in an emulator or on a physical device), you need to configure MySQL to listen on all interfaces or the specific IP address of your Ubuntu machine. Here’s how:

  1. Open the MySQL configuration file. This is usually located at /opt/lampp/etc/my.cnf or /etc/mysql/mysql.conf.d/mysqld.cnf. The exact location may vary depending on your XAMPP installation and MySQL version. Use sudo nano /path/to/my.cnf to edit it.
  2. Locate the bind-address directive.
  3. Change the bind-address value to 0.0.0.0 to listen on all interfaces, or to the specific IP address you found in Step 1 (e.g., 192.168.1.100).
    bind-address = 0.0.0.0

    OR

    bind-address = 192.168.1.100
  4. Save the file and restart the MySQL server using the XAMPP control panel or by running:
    sudo /opt/lampp/lampp restartmysql

Step 3: Create a PHP API for Data Access

Directly connecting your Flutter app to the MySQL database is generally not recommended for security reasons. A better practice is to create a PHP API that acts as an intermediary between your Flutter app and the database. This PHP API will handle authentication, data validation, and database interactions.

Here’s a basic example of a PHP script (e.g., api.php) that fetches data from a table named “users”:

<?php
header('Content-Type: application/json');

$servername = "localhost"; // Or the IP address of your Ubuntu machine
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM users";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    $rows = array();
    while($r = mysqli_fetch_assoc($result)) {
        $rows[] = $r;
    }
    print json_encode($rows);
} else {
    echo "0 results";
}
$conn->close();
?>

Place this api.php file in your XAMPP htdocs directory (usually /opt/lampp/htdocs/). Remember to replace your_username, your_password, and your_database with your actual database credentials.

Step 4: Access the API from Your Flutter App

Now, in your Flutter app, use the http package to make requests to your PHP API. Add the http package to your pubspec.yaml file:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.0 

Then, in your Dart code, use the following code to fetch data from the API:

import 'package:http/http.dart' as http;
import 'dart:convert';

Future<void> fetchData() async {
  final ipAddress = '192.168.1.100'; // Replace with your Ubuntu machine's IP
  final url = Uri.parse('http://$ipAddress/api.php');

  try {
    final response = await http.get(url);

    if (response.statusCode == 200) {
      final jsonData = jsonDecode(response.body);
      print(jsonData); // Process your data here
    } else {
      print('Request failed with status: ${response.statusCode}.');
    }
  } catch (e) {
    print('Error: $e');
  }
}

Replace 192.168.1.100 with the IP address of your Ubuntu machine.

Common Errors and Solutions

  • “Connection refused” error: This usually means that MySQL isn’t listening on the correct IP address or that the XAMPP server isn’t running. Double-check Steps 1 and 2. Make sure the XAMPP services are running, specifically Apache and MySQL.
  • “Access denied” error: This means the MySQL user you’re using in your PHP script doesn’t have the necessary permissions to access the database. You might need to grant privileges to the user using the MySQL command-line client.
  • Firewall issues: Your Ubuntu firewall might be blocking connections to the MySQL port (3306) or the Apache port (80). Configure your firewall to allow incoming connections on these ports if necessary. Use sudo ufw allow 3306 and sudo ufw allow 80 to allow these connections through the firewall.
  • CORS (Cross-Origin Resource Sharing) errors: If you’re accessing the API from a different domain or port, you might encounter CORS issues. You’ll need to configure your PHP server (Apache) to allow cross-origin requests by adding the necessary headers. In your PHP script you can also add :
    header("Access-Control-Allow-Origin: *");

    to resolve this issue.

Conclusion

By following these steps, you should be able to successfully access your XAMPP database from your Flutter app on Ubuntu. Remember to prioritize security by using a PHP API to handle database interactions and carefully managing user permissions and firewall settings.