fix(core): altas rellenan fechas que faltan y el error de insert/update trae el mensaje de MySQL

This commit is contained in:
Jordan Diaz
2026-09-23 07:59:03 +00:00
parent 8659715132
commit 14ddf1608e
2 changed files with 36 additions and 2 deletions
+30 -2
View File
@@ -102,7 +102,7 @@ class AcaiAPI
$result = $db->execute($sql, $params ? $params : null);
if ($result === false) {
self::error(['error' => "Error al insertar en `$table`"]);
self::error(['error' => "Error al insertar en `$table`" . self::dbErrorSuffix($db)]);
continue;
}
@@ -214,7 +214,7 @@ class AcaiAPI
$result = $db->execute($sql, $allParams ? $allParams : null);
if ($result === false) {
self::error(['error' => "Error al actualizar `$table`"]);
self::error(['error' => "Error al actualizar `$table`" . self::dbErrorSuffix($db)]);
continue;
}
$count++;
@@ -1438,6 +1438,20 @@ class AcaiAPI
$setParts[] = '`dragSortOrder` = ?';
$params[] = time();
}
// Campos `date` que NO vienen en el alta -> fecha actual, como el
// Admin clasico (save.php: "default date fields to current date").
// El bloque de campos de usuario, abajo, solo cubre la fecha que
// llega VACIA; si la clave falta, una columna `datetime NOT NULL`
// sin DEFAULT (cms_vacantes.fecha_publicacion) tumbaba el INSERT.
if (!$ignoreSchema && is_array($schema)) {
foreach ($schema as $field => $def) {
if (array_key_exists($field, $record)) continue;
if (!is_array($def) || ($def['type'] ?? '') !== 'date') continue;
$setParts[] = "`$field` = ?";
$params[] = $now;
}
}
}
// ── User-supplied fields ─────────────────────────────────────────
@@ -1640,6 +1654,20 @@ class AcaiAPI
// ERROR HANDLING
// ═══════════════════════════════════════════════════════════════════
/**
* ": <mensaje de MySQL>" del ultimo execute() fallido, o "" si no lo hay.
* Sin el, un alta que MySQL rechaza (p.ej. "Field 'x' doesn't have a
* default value") llegaba como "Error al insertar" a secas y el agente
* reintentaba a ciegas. isset(): una web con Db.php personalizado (sin
* lastError) sigue funcionando, solo que sin el detalle.
*/
private static function dbErrorSuffix($db)
{
return (is_object($db) && isset($db->lastError) && $db->lastError !== '')
? ': ' . $db->lastError
: '';
}
static function error(array $data = [])
{
if (class_exists('API') && class_exists('ApiError')) {
+6
View File
@@ -7,6 +7,10 @@ class Db {
private $link; // MySQLi Link
private static $instance = false; // Db Class Instance
/** Mensaje del ultimo execute() fallido (null si fue bien). AcaiAPI lo
* devuelve en su error para que el caller sepa POR QUE fallo. */
public $lastError = null;
/**
* @param host: DB Host
@@ -69,12 +73,14 @@ class Db {
* @return bool
*/
public function execute($sql, $params = null) {
$this->lastError = null;
if ($params) {
$stmt = $this->link->prepare($sql);
try {
$stmt->execute($params);
}
catch(Exception $e) {
$this->lastError = $e->getMessage();
return false;
}
}