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); $result = $db->execute($sql, $params ? $params : null);
if ($result === false) { if ($result === false) {
self::error(['error' => "Error al insertar en `$table`"]); self::error(['error' => "Error al insertar en `$table`" . self::dbErrorSuffix($db)]);
continue; continue;
} }
@@ -214,7 +214,7 @@ class AcaiAPI
$result = $db->execute($sql, $allParams ? $allParams : null); $result = $db->execute($sql, $allParams ? $allParams : null);
if ($result === false) { if ($result === false) {
self::error(['error' => "Error al actualizar `$table`"]); self::error(['error' => "Error al actualizar `$table`" . self::dbErrorSuffix($db)]);
continue; continue;
} }
$count++; $count++;
@@ -1438,6 +1438,20 @@ class AcaiAPI
$setParts[] = '`dragSortOrder` = ?'; $setParts[] = '`dragSortOrder` = ?';
$params[] = time(); $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 ───────────────────────────────────────── // ── User-supplied fields ─────────────────────────────────────────
@@ -1640,6 +1654,20 @@ class AcaiAPI
// ERROR HANDLING // 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 = []) static function error(array $data = [])
{ {
if (class_exists('API') && class_exists('ApiError')) { if (class_exists('API') && class_exists('ApiError')) {
+6
View File
@@ -8,6 +8,10 @@ class Db {
private static $instance = false; // Db Class Instance 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 * @param host: DB Host
* @param user: DB user * @param user: DB user
@@ -69,12 +73,14 @@ class Db {
* @return bool * @return bool
*/ */
public function execute($sql, $params = null) { public function execute($sql, $params = null) {
$this->lastError = null;
if ($params) { if ($params) {
$stmt = $this->link->prepare($sql); $stmt = $this->link->prepare($sql);
try { try {
$stmt->execute($params); $stmt->execute($params);
} }
catch(Exception $e) { catch(Exception $e) {
$this->lastError = $e->getMessage();
return false; return false;
} }
} }