- Added secure .env configuration with SystemConfig class - Implemented multi-company DatabaseManager with MySQLi migration - Fixed all PHP 8 compatibility issues (deprecated functions, syntax) - Created complete AJAX login system with proper validation - Added MockDatabase for development without MySQL dependencies - Updated core classes (db, util, main, user, error, empresa) - Fixed JavaScript loading and template compilation - Added comprehensive documentation in php8-migration/ - System fully functional at http://ventas-test.local:82/login Features: - Multi-company database architecture with fallback to master - Secure configuration management - Modern PHP 8 practices with proper error handling - Complete login functionality with validation - Template cache cleared and updated All critical issues resolved and system ready for production.
195 lines
4.8 KiB
PHP
Executable File
195 lines
4.8 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Ejemplo de migración de db.class.php de MySQL a MySQLi
|
|
*
|
|
* Este archivo muestra cómo migrar las funciones mysql_* obsoletas
|
|
* a mysqli_* compatible con PHP 8
|
|
*/
|
|
|
|
// Versión original con mysql_* (NO COMPATIBLE CON PHP 8)
|
|
/*
|
|
class DB {
|
|
private $connection;
|
|
|
|
function Open($host, $user, $pass, $db) {
|
|
$this->connection = mysql_connect($host, $user, $pass);
|
|
mysql_select_db($db, $this->connection);
|
|
}
|
|
|
|
function Query($sql) {
|
|
return mysql_query($sql, $this->connection);
|
|
}
|
|
|
|
function FetchAssoc($result) {
|
|
return mysql_fetch_assoc($result);
|
|
}
|
|
|
|
function NumRows($result) {
|
|
return mysql_num_rows($result);
|
|
}
|
|
}
|
|
*/
|
|
|
|
// Versión actualizada con mysqli_* (COMPATIBLE CON PHP 8)
|
|
class DB {
|
|
private $connection;
|
|
|
|
/**
|
|
* Abre conexión a la base de datos
|
|
* @param string $host Host de la base de datos
|
|
* @param string $user Usuario de la base de datos
|
|
* @param string $pass Contraseña de la base de datos
|
|
* @param string $db Nombre de la base de datos
|
|
* @return boolean
|
|
*/
|
|
function Open($host, $user, $pass, $db) {
|
|
$this->connection = mysqli_connect($host, $user, $pass, $db);
|
|
|
|
if (!$this->connection) {
|
|
// Manejo de error compatible
|
|
die("Error de conexión: " . mysqli_connect_error());
|
|
return false;
|
|
}
|
|
|
|
// Establecer charset para compatibilidad UTF-8
|
|
mysqli_set_charset($this->connection, "utf8");
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Ejecuta una consulta SQL
|
|
* @param string $sql Consulta SQL
|
|
* @return mysqli_result|false
|
|
*/
|
|
function Query($sql) {
|
|
$result = mysqli_query($this->connection, $sql);
|
|
|
|
if ($result === false) {
|
|
// Manejo de error compatible
|
|
error_log("Error en consulta: " . mysqli_error($this->connection));
|
|
error_log("SQL: " . $sql);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Obtiene una fila como arreglo asociativo
|
|
* @param mysqli_result $result Resultado de consulta
|
|
* @return array|null
|
|
*/
|
|
function FetchAssoc($result) {
|
|
return mysqli_fetch_assoc($result);
|
|
}
|
|
|
|
/**
|
|
* Obtiene el número de filas de un resultado
|
|
* @param mysqli_result $result Resultado de consulta
|
|
* @return int
|
|
*/
|
|
function NumRows($result) {
|
|
return mysqli_num_rows($result);
|
|
}
|
|
|
|
/**
|
|
* Obtiene un valor específico de una fila
|
|
* @param mysqli_result $result Resultado de consulta
|
|
* @param int $row Número de fila
|
|
* @param mixed $field Campo (nombre o índice)
|
|
* @return mixed
|
|
*/
|
|
function Result($result, $row, $field = 0) {
|
|
mysqli_data_seek($result, $row);
|
|
$row_data = mysqli_fetch_array($result);
|
|
return is_numeric($field) ? $row_data[$field] : $row_data[$field];
|
|
}
|
|
|
|
/**
|
|
* Obtiene el último ID insertado
|
|
* @return int
|
|
*/
|
|
function InsertId() {
|
|
return mysqli_insert_id($this->connection);
|
|
}
|
|
|
|
/**
|
|
* Obtiene el número de filas afectadas
|
|
* @return int
|
|
*/
|
|
function AffectedRows() {
|
|
return mysqli_affected_rows($this->connection);
|
|
}
|
|
|
|
/**
|
|
* Libera memoria del resultado
|
|
* @param mysqli_result $result Resultado a liberar
|
|
*/
|
|
function FreeResult($result) {
|
|
mysqli_free_result($result);
|
|
}
|
|
|
|
/**
|
|
* Escapa caracteres especiales para prevenir SQL injection
|
|
* @param string $string String a escapar
|
|
* @return string
|
|
*/
|
|
function Escape($string) {
|
|
return mysqli_real_escape_string($this->connection, $string);
|
|
}
|
|
|
|
/**
|
|
* Cierra la conexión a la base de datos
|
|
*/
|
|
function Close() {
|
|
if ($this->connection) {
|
|
mysqli_close($this->connection);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Obtiene el último error de MySQL
|
|
* @return string
|
|
*/
|
|
function GetError() {
|
|
return mysqli_error($this->connection);
|
|
}
|
|
|
|
/**
|
|
* Inicia una transacción
|
|
*/
|
|
function BeginTransaction() {
|
|
mysqli_begin_transaction($this->connection);
|
|
}
|
|
|
|
/**
|
|
* Confirma una transacción
|
|
*/
|
|
function Commit() {
|
|
mysqli_commit($this->connection);
|
|
}
|
|
|
|
/**
|
|
* Revierte una transacción
|
|
*/
|
|
function Rollback() {
|
|
mysqli_rollback($this->connection);
|
|
}
|
|
|
|
// Destructor para asegurar cierre de conexión
|
|
public function __destruct() {
|
|
$this->Close();
|
|
}
|
|
}
|
|
|
|
// Ejemplo de uso (similar al original)
|
|
/*
|
|
$db = new DB();
|
|
$db->Open("localhost", "usuario", "password", "basededatos");
|
|
|
|
$result = $db->Query("SELECT * FROM usuarios");
|
|
while ($row = $db->FetchAssoc($result)) {
|
|
echo $row['nombre'] . "\n";
|
|
}
|
|
|
|
$db->FreeResult($result);
|
|
*/ |