fix(core): altas rellenan fechas que faltan y el error de insert/update trae el mensaje de MySQL
This commit is contained in:
@@ -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')) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user