Saludos, en este tutorial aprenderás a integrar tu aplicación de Visual Basic 6 con un API PHP que desarrollaremos para listar clientes de manera dinámica, lo que pretendo con este tutorial es cómo puede enviar datos desde vb6 a un servidor remoto con PHP y guardar datos en una base de dato MySQL y que el mismo PHP retorne datos, esto puede ser utilizar para tener datos público accesibles desde un dispositivo móvil desde cualquier parte del mudo claro esta si el PHP se encuentra en un dominio publico.
1) SQL de ejemplo (crear BD, tabla y datos)
Lo primero es crear una base de datos en MySQL con el nombre de demo_vb6 y una tabla llamada clientes que usaremos como ejemplo:
-- Crea base de datos (opcional si ya tienes una)
CREATE DATABASE demo_vb6 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE demo_vb6;
-- Tabla clientes
CREATE TABLE clientes (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
nit VARCHAR(20) NOT NULL,
telefono VARCHAR(30),
direccion VARCHAR(150),
email VARCHAR(150),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Datos de prueba
INSERT INTO clientes (nombre, nit, telefono, direccion, email)
VALUES
('Juan Pérez', '123456789', '3001234567', 'Calle 1 #2-3', 'juan@example.com'),
('Ana Gómez', '987654321', '3019876543', 'Carrera 4 #5-6', 'ana@example.com');
2) PHP (con PDO) — Conexión + endpoint CRUD
Estructura de carpetas (en tu hosting/XAMPP/Hostinger),
/api_crud_vb6
├─ config.php
├─ db.php
├─ helpers.php
└─ clientes.php
Archivo config.php
Basado en la estructura anterior el primero archivo que vamos a crear es config.php que se debe crear dentro de la carpeta api_crud_vb6, si vas a trabajar en local con XAMPP crear una carpeta en esta ruta C:\xampp\htdocs\ dentro creamos la carpeta api_crud_vb6.
Este archivo lo utilizo para centralizar host, usuario, clave y nombre de BD para no repetirlos en el código. Si subo a producción, cambio solo aquí los datos de conexión.
<?php
return [
'db' => [
'host' => 'localhost',
'name' => 'demo_vb6',
'user' => 'root', // Cambia según tu hosting
'pass' => '', // Cambia según tu hosting
'charset' => 'utf8mb4',
],
];
Archivo es “db.php”
que es para conectarse a la base de datos mysql desde PHP :
<?php
function db(): mysqli
{
$cfg = require __DIR__ . '/config.php'; //importa el archivo para poder obtener los datos de conexión
$mysqli = new mysqli(
$cfg['db']['host'],
$cfg['db']['user'],
$cfg['db']['pass'],
$cfg['db']['name']
);
if ($mysqli->connect_errno) { //se verifica si existe un error al conectar y si hay error devuelve un mensaje
http_response_code(500);
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'error' => true,
'message' => 'Error de conexión: ' . $mysqli->connect_error
]);
exit;
}
$mysqli->set_charset($cfg['db']['charset']);
return $mysqli; //si no hay error devuelve la conexión
}
- “db() devuelve un objeto mysqli listo para usar. Si hay error de conexión, respondo JSON con 500 (error del servidor) y corto la ejecución.”
“set_charset(‘utf8’) evita problemas con acentos y ñ.”
¿Qué es un “helper” en programación?
📌 Definición sencilla:
Un helper es un archivo o función que contiene código de ayuda para realizar tareas comunes, repetitivas o que no son la lógica principal del programa.
No es obligatorio, pero se usa para organizar mejor el código y no repetir las mismas líneas en varios lugares.
Ejemplo fuera de PHP
Imagínate que en tu casa tienes una escalera.
-
Si cada vez que quieres subir al techo tuvieras que construir una escalera desde cero, perderías tiempo.
-
Mejor usas la misma escalera que ya está hecha.
En programación, un helper es esa “escalera”:
-
Una función o archivo que creaste una vez para resolver algo común.
-
Luego lo llamas todas las veces que lo necesites.
Archivo helpers.php
<?php
function json_response(array $arr, int $code = 200): void {
http_response_code($code);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit;
}
function required($value, $name) {
if (!isset($value) || trim($value) === '') {
json_response(['error' => true, 'message' => "$name es obligatorio"], 400);
}
}
🔹 json_response
-
Sirve para enviar siempre la respuesta en formato JSON y con el código HTTP correcto.
-
Lo usamos muchas veces en el CRUD (para errores y datos correctos).
-
Si no tuviéramos esta función, tendríamos que repetir esas 3–4 líneas de
http_response_code + header + json_encodecada vez que quisiéramos responder.
🔹 required
-
Verifica si un campo obligatorio está vacío.
-
Si falta, responde error inmediatamente.
-
Evita escribir 4–5 líneas de validación en cada parte del código.
Archivo clientes.php
Un solo endpoint que lee action y ejecuta list | get | create | update | delete.
¿Qué es un endpoint?
Un endpoint es el punto final de una dirección (URL) donde una aplicación puede acceder a un recurso o ejecutar una acción de otra aplicación.
En términos sencillos: es la dirección web a la que enviamos una solicitud para obtener o enviar datos.
Ejemplo en local:
Archivo en tu servidor local:
C:\xampp\htdocs\api_crud_vb\clientes.php
Para acceder desde el navegador, la ruta sería:
http://127.0.0.1/api_crud_vb/clientes.php
En este caso, el endpoint sería:
/api_crud_vb/clientes.php
o directamente clientes.php si hablamos solo del archivo.
En una API real, el endpoint muchas veces no es un archivo físico, sino una ruta definida que devuelve datos, por ejemplo:
<?php
require __DIR__ . '/db.php';
require __DIR__ . '/helpers.php';
$action = $_REQUEST['action'] ?? 'list';
$mysqli = db();
try {
switch ($action) {
// ---------------- LIST ----------------
case 'list': {
$sql = "SELECT id, nombre, nit, telefono, direccion, email, created_at
FROM clientes
ORDER BY id DESC";
$res = $mysqli->query($sql);
if (!$res) {
json_response(['error' => true, 'message' => $mysqli->error], 500);
}
$data = [];
while ($row = $res->fetch_assoc()) {
$data[] = $row;
}
json_response(['error' => false, 'data' => $data]);
}
// ---------------- GET -----------------
case 'get': {
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
if ($id <= 0) json_response(['error' => true, 'message' => 'id es obligatorio'], 400);
$stmt = $mysqli->prepare("SELECT id, nombre, nit, telefono, direccion, email, created_at FROM clientes WHERE id = ?");
if (!$stmt) json_response(['error' => true, 'message' => $mysqli->error], 500);
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$stmt->close();
if (!$row) json_response(['error' => true, 'message' => 'No encontrado'], 404);
json_response(['error' => false, 'data' => $row]);
}
// ---------------- CREATE --------------
case 'create': {
$nombre = $_POST['nombre'] ?? '';
$nit = $_POST['nit'] ?? '';
$telefono = $_POST['telefono'] ?? '';
$direccion = $_POST['direccion'] ?? '';
$email = $_POST['email'] ?? '';
required($nombre, 'nombre');
required($nit, 'nit');
$stmt = $mysqli->prepare("
INSERT INTO clientes (nombre, nit, telefono, direccion, email)
VALUES (?, ?, ?, ?, ?)
");
if (!$stmt) json_response(['error' => true, 'message' => $mysqli->error], 500);
$stmt->bind_param('sssss', $nombre, $nit, $telefono, $direccion, $email);
$ok = $stmt->execute();
$newId = $stmt->insert_id;
$err = $stmt->error;
$stmt->close();
if (!$ok) json_response(['error' => true, 'message' => $err ?: 'No se pudo crear'], 500);
json_response(['error' => false, 'message' => 'Cliente creado', 'data' => ['id' => (int)$newId]]);
}
// ---------------- UPDATE --------------
case 'update': {
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
$nombre = $_POST['nombre'] ?? '';
$nit = $_POST['nit'] ?? '';
$telefono = $_POST['telefono'] ?? '';
$direccion = $_POST['direccion'] ?? '';
$email = $_POST['email'] ?? '';
if ($id <= 0) json_response(['error' => true, 'message' => 'id es obligatorio'], 400);
required($nombre, 'nombre');
required($nit, 'nit');
$stmt = $mysqli->prepare("
UPDATE clientes
SET nombre = ?, nit = ?, telefono = ?, direccion = ?, email = ?
WHERE id = ?
");
if (!$stmt) json_response(['error' => true, 'message' => $mysqli->error], 500);
$stmt->bind_param('sssssi', $nombre, $nit, $telefono, $direccion, $email, $id);
$ok = $stmt->execute();
$err = $stmt->error;
$stmt->close();
if (!$ok) json_response(['error' => true, 'message' => $err ?: 'No se pudo actualizar'], 500);
json_response(['error' => false, 'message' => 'Cliente actualizado', 'data' => ['id' => $id]]);
}
// ---------------- DELETE --------------
case 'delete': {
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
if ($id <= 0) json_response(['error' => true, 'message' => 'id es obligatorio'], 400);
$stmt = $mysqli->prepare("DELETE FROM clientes WHERE id = ?");
if (!$stmt) json_response(['error' => true, 'message' => $mysqli->error], 500);
$stmt->bind_param('i', $id);
$ok = $stmt->execute();
$err = $stmt->error;
$stmt->close();
if (!$ok) json_response(['error' => true, 'message' => $err ?: 'No se pudo eliminar'], 500);
json_response(['error' => false, 'message' => 'Cliente eliminado', 'data' => ['id' => $id]]);
}
default:
json_response(['error' => true, 'message' => 'Acción inválida'], 400);
}
} catch (Throwable $e) {
json_response(['error' => true, 'message' => $e->getMessage()], 500);
}
Explicación por partes:
-
$action: lee qué operación quiere el cliente (list,get,create,update,delete). -
Conexión:
db()entrega unmysqliya conectado y con charset configurado. -
list: consulta directa con$mysqli->query(no hay parámetros). Devuelve array de filas. -
get: usaprepare + bind_param('i', $id)para evitar inyección. -
create/update/delete: siempre con prepared statements. -
Errores: si algo falla, envío JSON con
error: truey el mensaje; uso códigos HTTP adecuados (400 para faltantes, 404 si no existe, 500 para errores del servidor).
Pruebas rápidas (navegador/Postman):
Listar:
/api/clientes.php?action=listObtener:
/api/clientes.php?action=get&id=1Crear (POST form):
/api/clientes.php?action=create(campos: nombre, nit, telefono, direccion, email)Actualizar (POST form):
/api/clientes.php?action=update(id + mismos campos)Eliminar (POST form):
/api/clientes.php?action=delete(id)
Código Visual Basic 6
Esto es todo el código por el lado de PHP, esta seria nuestra API para la la conexión con la base de datos. Ahora continuamos con la parte de VB6.
El formulario debe verse asi:

