У меня есть этот веб-модуль на PHP, мы только что перешли на PHP 7.2 из 5.3.Мы тоже начали использовать доктрину, и все работало правильно.Внезапно веб-модуль начал показывать случайные 500 ошибок.Даже на одних и тех же действиях.Я до сих пор не понял, почему, однако мне удавалось запускать его каждый раз, используя функцию lastInsertId доктрины.Каждый раз, когда она проходит мимо этой функции, она генерирует общую ошибку 500 (даже если я активирую ошибки на php.ini, я не получаю никаких подробностей об ошибке).
Ajax-вызов:
function listaCandidatos() {
$('#' + GLOBAL_ID).find('#candidates-button').click(function () {
var btn = this,
url = BASE_URL + 'actualizacion-candidatos.php',
numInv = $('#' + GLOBAL_ID).find('#num_inventario').val();
$(btn).attr('disabled', 'disabled');
$.post(url, {numInv: numInv}, function (response) {
if (response.success) {
enableScannerForm();
$('#' + GLOBAL_ID).find('#master_id').val(response.masterId);
$('#' + GLOBAL_ID).find('#last_master_id').val(response.masterId);
loadListScanner();
} else {
alert(response.message);
$(btn).removeAttr('disabled');
}
}, 'json');
});
}
PHP действие:
public function candidatos()
{
ILogger::info('ACTUALIZACION DE INVENTARIO OBTENER CANDIDATOS (INICIO)');
$result = array('success' => true, 'message' => '');
if (!Request::isAjax()) {
$result['success'] = false;
$result['message'] = 'No ajax request';
} else {
$pa_idpais = $_SESSION['pa_idpais'];
$estacion = $_SESSION['estacion'];
$modulo = $_SESSION['modulo'];
$login = $_SESSION['login'];
$mModel = new InventarioMaster();
$dModel = new InventarioDetalle();
$tModel = new InventarioDetalleTemp();
$hModel = new InventarioHistorial();
ILogger::info('EJECUCION DE QUERY OBTENER CANDIDATOS (INICIO)');
$candidates = $dModel->getCandidates();
ILogger::info('EJECUCION DE QUERY OBTENER CANDIDATOS (FIN)');
$result['masterId'] = 0;
if (count($candidates) > 0) {
IDBConnection::getInstance()->beginTransaction();
try {
$dataMaster = array(
'num_folio' => time(),
'id_courier' => 0,
'pa_idpais' => $pa_idpais,
'est_idestacion' => $estacion,
'mod_idmodulo' => $modulo,
'usu_login' => $login,
'inv_fecha_ingreso' => "CONVERT(datetime, DATEADD(hh, " . $_SESSION['pa_zona'] . ", GETUTCDATE()), 103)",
'inv_tipo' => 'ACT'
);
ILogger::info('EJECUCION DE QUERY REGISTRAR INVENTARIO_MASTER (INICIO)');
**$masterId = $mModel->register($dataMaster);**
ILogger::info('EJECUCION DE QUERY REGISTRAR INVENTARIO_MASTER (FIN)');
$tmpData = array(
'id_inv_master' => $masterId,
'id_inv_detalle' => '',
'gui_idguia' => '',
'pid' => null,
'inv_actual_checkpoint' => 'CC',
'temp_fecha_actual_registro' => "CONVERT(datetime, DATEADD(hh, " . $_SESSION['pa_zona'] . ", GETUTCDATE()), 103)",
'inv_status' => 'SE'
);
foreach ($candidates as $item) {
$tmpData['id_inv_detalle'] = $item['id_inv_detalle'];
$tmpData['gui_idguia'] = $item['gui_idguia'];
$tmpData['pid'] = $item['pid'];
if ($item['inv_checkpoint'] == 'SA') {
$tmpData['inv_actual_checkpoint'] = $item['inv_checkpoint'];
}
if ($item['det_tipo_ingreso'] == 'COU' && in_array($item['inv_status'], array('IN', 'AC'))) {
$tmpData['inv_actual_checkpoint'] = 'CC';
}
ILogger::info('EJECUCION DE QUERY REGISTRAR INVENTARIO_DETALLE_TEMP (INICIO)');
$tModel->register($tmpData);
ILogger::info('EJECUCION DE QUERY REGISTRAR INVENTARIO_DETALLE_TEMP (FIN)');
$dataHistory = array(
'id_inv_master' => $masterId,
'id_inv_detalle' => $item['id_inv_detalle'],
'his_checkpoint' => $item['inv_checkpoint'],
'his_checkpoint_candidato' => $item['inv_checkpoint'],
'his_fecha_registro' => $tmpData['temp_fecha_actual_registro'],
'his_comentario' => 'Sin escanear',
'usu_login' => $login,
'inv_status' => 'SE',
'his_evento' => 'ACT'
);
ILogger::info('EJECUCION DE QUERY REGISTRAR INVENTARIO_HISTORIAL (INICIO)');
$hModel->register($dataHistory);
ILogger::info('EJECUCION DE QUERY REGISTRAR INVENTARIO_HISTORIAL (FIN)');
}
IDBConnection::getInstance()->commitTransaction();
$result['masterId'] = $masterId;
$queueData = array(
'detalleIds' => '',
'lastGuia' => '',
'lastId' => '',
'lastMasterId' => $masterId,
'lastNumInv' => '0',
'lastRequestType' => '',
'lastRequestValue' => '',
'masterId' => $masterId,
'fromMasterId' => '',
'numInv' => '',
'numPiezas' => ''
);
ScannerData::setId('inventarios_scanner_actualizacion');
ScannerData::saveData($queueData);
} catch (Exception $ex) {
IDBConnection::getInstance()->rollbackTransaction();
$result['success'] = false;
$result['message'] = utf8_encode($ex->getMessage());
$result['masterId'] = null;
}
}
}
ILogger::info('ACTUALIZACION DE INVENTARIO OBTENER CANDIDATOS (FIN)');
echo json_encode($result);
return;
}
Ошибка возникает в функции регистра:
$masterId = $mModel->register($dataMaster);
Что это такое:
public function register($data = array())
{
$sql = "
INSERT INTO
inventario_master
(
num_folio,
id_courier,
pa_idpais,
est_idestacion,
mod_idmodulo,
usu_login,
inv_fecha_ingreso,
inv_tipo
)
VALUES
(
'" . $data['num_folio'] . "',
'" . $data['id_courier'] . "',
'" . $data['pa_idpais'] . "',
'" . $data['est_idestacion'] . "',
'" . $data['mod_idmodulo'] . "',
'" . $data['usu_login'] . "',
" . $data['inv_fecha_ingreso'] . ",
'" . $data['inv_tipo'] . "'
)
";
$this->db->executeQuery($sql);
return $this->db->lastInsertId();
}
Этот lastInsertId просто вызывает функцию доктрины с тем же именем.
Я попытался зафиксировать ошибку, но не смог,Функция register на самом деле происходит, и я получаю идентификатор с функцией, однако вызовы ajax каждый раз возвращают ошибку.Я попытался прочитать сообщение об ошибке из ajax, но оно пустое.Также это работает на моей локальной машине IIS.Вероятно, это связано с этой конфигурацией сервера, но я не уверен.
Сервер, который выдает ошибку, является Windows Server 2016 версии 1607 с IIS версии 10.0.14393.0, и мы используем Microsoft SQL Server 2016 для базы данных.
Заранее спасибо.