He visto muchos proyectos que utilizan Slim Framework para crear APIs sencillas en PHP, y muchos emplean una función para conectarse a la Base de Datos como la siguiente:
function connect_db() { $server = 'localhost'; $user = 'user'; $pass = 'pass'; $database = 'slim_db'; $connection = new mysqli($server, $user, $pass, $database); return $connection; }Todo bien para algo sencillo pero ¿qué pasa si el proyecto es algo grande o necesita ser escalable?, es cuando debemos modificar un poco el código, como el objetivo es hacer la aplicación lo mas escalable posible entonces vamos a utilizar PDO.
Primero modificamos src/settings.php:
// Database settings 'db' => [ 'host' => 'localhost', 'dbname' => 'mysql-db', 'user' => 'mysql-user', 'pass' => 'mysql-pass' ],Ahora vamos con src/dependencies.php:
// PDO database library $container['db'] = function ($c) { $settings = $c->get('settings')['db']; $pdo = new PDO("mysql:host=" . $settings['host'] . ";dbname=" . $settings['dbname'], $settings['user'], $settings['pass']); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); return $pdo; };Ya solo nos resta definir las rutas, para consultar usuarios por ejemplo:
$app->get('/test/[{id}]', function ($request, $response, $args) { $stmt = $this->db->prepare("SELECT * FROM usuarios WHERE id=:id"); $stmt->bindParam("id", $args['id']); $stmt->execute(); $data = $stmt->fetchObject(); return $this->response->withJson($data); });IMPORTANTE: si vamos a trabajar con caracteres especiales (tildes / acentos) entonces debemos iniciar la conexión de la siguiente manera:
$pdo = new PDO("mysql:host=" . $settings['host'] . ";dbname=" . $settings['dbname'], $settings['user'], $settings['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));Este atributo no puede ser definido una vez se realiza la conexión, por lo que es necesario enviarlo como parámetro en el constructor, mas información: PHP PDO MySQL
Recibe notificaciones por correo