---
title: "Queries directas con Db:: — insert, update, delete"
section: database
slug: raw-queries
description: "Metodos de Db:: en PrestaShop para queries directas: executeS, getRow, getValue, insert, update, delete, execute y manejo de errores."
keywords: "prestashop Db:: executeS getRow getValue insert update delete execute query directa SQL"
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/database/raw-queries"
---

# Queries directas con Db:: — insert, update, delete

> Metodos de Db:: en PrestaShop para queries directas: executeS, getRow, getValue, insert, update, delete, execute y manejo de errores.

La clase `Db` de PrestaShop proporciona acceso directo a la base de datos con metodos de conveniencia que se encargan de la conexion, los prefijos de tabla y el manejo basico de errores.

## Metodos de lectura

*executeS(), getRow(), getValue() — metodos de lectura*

```php
<?php

$db = Db::getInstance();

// ── executeS() — multiples filas ──
// Retorna array de arrays o false
$products = $db->executeS(
    'SELECT id_product, reference FROM `' . _DB_PREFIX_ . 'product` WHERE active = 1 LIMIT 10'
);
// $products = [['id_product'=>1, 'reference'=>'REF001'], ...]

// Siempre usar el null-coalescing para evitar false:
$products = $db->executeS('...') ?: [];

// ── getRow() — una sola fila ──
// Retorna array asociativo o false
$order = $db->getRow(
    'SELECT * FROM `' . _DB_PREFIX_ . 'orders` WHERE id_order = ' . (int) $idOrder
);
if ($order) {
    echo $order['reference'];
}

// ── getValue() — un solo valor ──
// Retorna el valor del primer campo de la primera fila, o false
$count = (int) $db->getValue(
    'SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'product` WHERE active = 1'
);

$name = (string) $db->getValue(
    'SELECT name FROM `' . _DB_PREFIX_ . 'manufacturer` WHERE id_manufacturer = ' . (int) $idManufacturer
);

// ── numRows() — numero de filas del ultimo executeS ──
$db->executeS('SELECT * FROM `' . _DB_PREFIX_ . 'product`');
$count = $db->numRows();
```

## Metodos de escritura

*insert(), update(), delete(), execute() — escritura*

```php
<?php

$db = Db::getInstance();

// ── insert() ──
// Parametros: tabla (sin prefijo), datos, null_values, use_cache, on_duplicate_update
$result = $db->insert(
    'mymodule_data',  // Sin prefijo _DB_PREFIX_
    [
        'id_order'   => (int) $idOrder,
        'id_customer'=> (int) $idCustomer,
        'data'       => pSQL(json_encode($data)),
        'date_add'   => date('Y-m-d H:i:s'),
    ]
);
$insertId = $db->Insert_ID(); // ID del registro insertado

// ── insert() con ON DUPLICATE KEY UPDATE ──
$db->insert(
    'mymodule_data',
    ['id_order' => $idOrder, 'status' => 'processed'],
    false,  // null_values
    true,   // use_cache
    Db::ON_DUPLICATE_KEY  // on_duplicate_update
);

// ── update() ──
// Parametros: tabla, datos, where, limit, null_values, use_cache
$result = $db->update(
    'mymodule_data',
    ['status' => pSQL('completed'), 'updated_at' => date('Y-m-d H:i:s')],
    'id_order = ' . (int) $idOrder,
    1  // Limite de filas actualizadas (0 = sin limite)
);

// ── delete() ──
// Parametros: tabla, where, limit, use_cache
$result = $db->delete(
    'mymodule_data',
    'id_order = ' . (int) $idOrder
);

// ── execute() — para queries que no son SELECT ──
// Usado para: TRUNCATE, ALTER, CREATE, REPLACE, etc.
$result = $db->execute(
    'REPLACE INTO `' . _DB_PREFIX_ . 'mymodule_data`
    (`id_order`, `status`) VALUES (' . (int) $idOrder . ', \'done\')'
);
$result = $db->execute('TRUNCATE TABLE `' . _DB_PREFIX_ . 'mymodule_cache`');

// ── Numero de filas afectadas ──
$affected = $db->Affected_Rows();
```

## Transacciones

*Transacciones con Db::getInstance()*

```php
<?php

$db = Db::getInstance();

try {
    // Iniciar transaccion
    $db->execute('BEGIN');
    // o: $db->execute('START TRANSACTION');

    // Multiples operaciones que deben ser atomicas
    $db->insert('mymodule_orders', [
        'id_order'   => $idOrder,
        'status'     => 'processing',
        'date_add'   => date('Y-m-d H:i:s'),
    ]);

    $db->update(
        'mymodule_stock',
        ['quantity' => 'quantity - 1'],
        'id_product = ' . (int) $idProduct
    );

    // Verificar que el stock no quedó negativo
    $stock = (int) $db->getValue(
        'SELECT quantity FROM `' . _DB_PREFIX_ . 'mymodule_stock`
        WHERE id_product = ' . (int) $idProduct
    );

    if ($stock < 0) {
        throw new \RuntimeException('Stock insuficiente');
    }

    // Confirmar transaccion
    $db->execute('COMMIT');

} catch (\Exception $e) {
    // Revertir en caso de error
    $db->execute('ROLLBACK');
    throw $e;
}
```

## Instancias maestro y esclavo

*Diferenciar instancias de lectura y escritura*

```php
<?php

// ── Instancia por defecto (maestro) — para lecturas y escrituras ──
$dbMaster = Db::getInstance();

// ── Instancia esclavo (replica) — SOLO para lecturas ──
// Si no hay servidor esclavo configurado, devuelve el maestro
$dbSlave = Db::getInstance(_PS_USE_SQL_SLAVE_);

// ── Buena practica: usar esclavo para lecturas frecuentes ──
$products = $dbSlave->executeS(
    'SELECT id_product, reference FROM `' . _DB_PREFIX_ . 'product` WHERE active = 1'
);

// ── Solo usar maestro para escrituras ──
$dbMaster->insert('mymodule_log', ['message' => pSQL($msg)]);
```

## Manejo de errores

*Manejo de errores de DB*

```php
<?php

// ── Verificar ultimo error ──
$db = Db::getInstance();
$result = $db->execute('...');

if (!$result) {
    $errorMsg = $db->getMsgError();
    $errorNum  = $db->getNumberError();
    PrestaShopLogger::addLog(
        'DB Error ' . $errorNum . ': ' . $errorMsg,
        3, null, 'MyModule'
    );
}

// ── En modo dev — mostrar errores SQL ──
if (_PS_MODE_DEV_) {
    // PS muestra automaticamente los errores SQL en modo debug
    // Activar: php.ini display_errors=On o en config/config.inc.php
    define('_PS_DEBUG_SQL_', true);
}

// ── executeS() con die_on_error=true (por defecto) ──
// Si hay un error SQL, PS lanza una excepcion en modo dev
// y devuelve false en modo produccion
try {
    $result = $db->executeS('SELECT * FROM tabla_inexistente', true, true);
} catch (\PrestaShopDatabaseException $e) {
    // Solo en modo dev
    echo $e->getMessage();
}
```


---

*Fuente: [https://ayudaprestashop.es/database/raw-queries](https://ayudaprestashop.es/database/raw-queries). Version Markdown generada automaticamente para consumo por LLMs.*
