Hola a todos, mi problema es el siguiente:
Tengo un controlador con varias acciones dentro, y tengo un archivo en la carpeta controllers en donde hay varias funciones que se conectan a la base de datos. Todas las vistas del controlador utilizan un plantilla en donde se llama a una funcion del archivo de funciones que se encarga de construir un menu. Pero cuando dentro de alguna accion del controlador intento llamar a otra funcion del archivo de funciones y esta acción interactue por medio de algun modelo con la base de datos, me sale el siguiente error:
Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'
@'localhost' (using password: NO) in C:\AppServ\www\kerp\forms\db\adapters\mysql.php on line 127
Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\AppServ\www\kerp\forms\db\adapters\mysql.php on line 127
KumbiaDBException: Access denied for user 'ODBC'
@'localhost' (using password: NO) al ejecutar 'SELECT COUNT(*) FROM unidadesmedidas WHERE 1 and umedida_bloqueado = 'N' and umedida_act = 'S' '
Error Code: 1045
En el archivo C:\AppServ\www\kerp\forms\db\adapters\mysql.php en la línea: 135
#0 C:\AppServ\www\kerp\forms\db\main.php(169): db->query('SELECT COUNT(*)...')
#1 C:\AppServ\www\kerp\forms\db\active_record.php(742): dbBase->fetch_one('SELECT COUNT(*)...')
#2 C:\AppServ\www\kerp\controllers\unidadesmedidas_controller.php(66): ActiveRecord->count('1 and umedida_b...')
#3 [internal function]: UnidadesmedidasController->sql('')
#4 C:\AppServ\www\kerp\kumbia.php(201): call_user_func_array(Array, Array)
#5 C:\AppServ\www\kerp\public\index.php(76): Kumbia::main()
#6 {main}
Session Dump
string(152) "a:3:{s:14:"ss_ultimo_menu";i:18467;s:22:"ss_umedida_condiciones";s:52:"1 and umedida_bloqueado = 'N' and umedida_act = 'S' ";s:10:"ss_empl_id";s:1:"1";}
La funcion trabaja perfecto, puesto que en otras acciones del controlador la llamo y no me genera errores, siempre y cuando dentro de esa acción no utilice nada que tenga que ver con la base de datos.
Ayudenme por favor....
Comentarios
<?php
class UnidadesmedidasController extends ApplicationController {
public $template = "plantilla_intranet";
public $modulo_codigo = "209010";
public function before_filter($controlador, $accion, $id) {
if (Session::get('ss_empl_id') == 0) {
Flash::error('Para poder acceder a Unidades de Medidas, debe primero iniciar una sesión.');
$this->route_to("controller: intranet", "action: login");
}
}
function index () {
$permisos = explode("|",f_chk_permisos(Session::get('ss_empl_id'),$this->modulo_codigo),1000);
if ($permisos[0] == "XX") {
Flash::error("ERROR: " . $permisos[1]);
$this->add = "N";
$this->go = "N";
}
else {
$this->add = $permisos[1];
$this->go = $permisos[0];
}
}
function presql() {
$permisos = explode("|",f_chk_permisos(Session::get('ss_empl_id'),$this->modulo_codigo),1000);
if ($permisos[0] == "XX") {
$this->route_to("action: index");
}
else {
$this->add = $permisos[1];
$this->go = $permisos[0];
}
}
function sql() {
$permisos = explode("|",f_chk_permisos(Session::get('ss_empl_id'),$this->modulo_codigo),1000);
$this->add = $permisos[1];
$this->upd = $permisos[2];
$this->del = $permisos[3];
$this->go = $permisos[0];
$condiciones = "1 ";
$condiciones .= ($this->request("id") != "")? "and id " . f_pre_sql("N",$this->request("id")) . " " : "";
$condiciones .= ($this->request("umedida_abreviatura") != "")? "and upper(umedida_abreviatura) " . f_pre_sql("T",strtoupper($this->request("umedida_abreviatura"))) . " " : "";
$condiciones .= ($this->request("umedida_nombre") != "")? "and upper(umedida_nombre) " . f_pre_sql("T",strtoupper($this->request("umedida_nombre"))) . " " : "";
$condiciones .= ($this->request("umedida_bloqueado") != "NULO")? "and umedida_bloqueado = '" . $this->request("umedida_bloqueado") . "' " : "";
$condiciones .= ($this->request("umedida_act") != "NULO")? "and umedida_act = '" . $this->request("umedida_act") . "' " : "";
$this->consulta = $condiciones;
$this->paginado = "0," . $this->request("paginas");
$this->ordenamiento = "id asc";
$this->pagina_nro_reg = $this->request("paginas");
$this->pagina_ult = floor($this->Unidadesmedidas->count($condiciones) / $this->pagina_nro_reg);
$this->pagina_n = 0;
Session::set_data('ss_umedida_condiciones',$condiciones);
}
function sqlgo ($pagina_nro_reg = null, $pagina_ult = null, $pagina_n = null, $orderby = null, $az = null, $reorder = "N") {
$this->set_response('view');
$this->paginado = $pagina_n * $pagina_nro_reg . ", " . $pagina_nro_reg;
$this->pagina_n = $pagina_n;
$this->ordenamiento = $orderby . " " . $az;
$this->orderby = $orderby;
$this->az = $az;
}
function not_found () {
Flash::warning("La acción solicitada no esta definida.");
return $this->route_to('action: index');
}
}
?>
Archivo que contiene las funciones:
<?php
function conexion_kerp () {
$db_gnv = new db("localhost","root","paraque","kerp");
$db_gnv = db::raw_connect();
return $db_gnv;
}
function menu ($usuario,$aleatorio) {
if (Session::get('ss_ultimo_menu') != 0) {
$file_to_del = 'public/temp/menus/menu_' . $usuario . '_' . Session::get('ss_ultimo_menu') . '.xml';
unlink($file_to_del);
}
Session::set_data('ss_ultimo_menu',$aleatorio);
// CONEXION A LA BASE DE DATOS Y EXTRACCION DE LA INFORMACION DEL MENU DE LAS TABLAS DEL SISTEMA
$query_opciones_menu = "SELECT DISTINCT empl_nombres, empl_apellidos, modul_codigo, length(modul_codigo ) /2 AS nivel, modul_nodohoja, modul_nombre, modul_php, modul_visible, modul_destino
FROM modulos, perfiles, perfilesmodulos, empleados
WHERE empleados.perfiles_id = perfiles.id
AND perfiles.id = perfilesmodulos.perfiles_id
AND locate(modul_codigo,modulos_codigo,1) = 1
AND empleados.id = $usuario
AND modul_visible = 'S'
ORDER BY 3";
$db = conexion_kerp();
$db->query($query_opciones_menu);
$row_opciones_menu = $db->fetch_array();
$nombre_empleado = $row_opciones_menu . " " . $row_opciones_menu;
$archivo_menu = "public/temp/menus/menu_" . Session::get('ss_empl_id') . "_" . Session::get('ss_ultimo_menu') . ".xml";
$xml_menu = fopen($archivo_menu,"w");
$cadena_xml_menu = "<?xml version='1.0' ?>
";
fwrite($xml_menu,$cadena_xml_menu);
$cadena_xml_menu = '<menu maxItems="12" name=" " mixedImages="yes">
';
fwrite($xml_menu,$cadena_xml_menu);
$cadena_xml_menu = '<MenuItem name="MENU" id="0" width="30px" withoutImages="yes">
';
fwrite($xml_menu,$cadena_xml_menu);
$nivel_ant = $row_opciones_menu;
do {
$nivel_act = $row_opciones_menu;
if ($nivel_act < $nivel_ant) {
$cierres = $nivel_ant - $nivel_act;
for ($i = 1; $i <= $cierres; $i++) {
$cadena_xml_menu = '</MenuItem>
';
fwrite($xml_menu,$cadena_xml_menu);
}
}
if ($row_opciones_menu == "A") {
$cadena_xml_menu = '<MenuItem name="' . $row_opciones_menu . '" id="' . $row_opciones_menu . '" width="30px" withoutImages="yes">
';
fwrite($xml_menu,$cadena_xml_menu);
}
else {
$cadena_xml_menu = '<MenuItem name="' . $row_opciones_menu . '" href="/kerp/' . $row_opciones_menu . '" target="' . $row_opciones_menu . '" id="' . $row_opciones_menu . '"/>
';
fwrite($xml_menu,$cadena_xml_menu);
}
$nivel_ant = $nivel_act;
} while ($row_opciones_menu = $db->fetch_array());
$cierres = $nivel_ant - 1;
for ($i = 1; $i <= $cierres; $i++) {
$cadena_xml_menu = '</MenuItem>
';
fwrite($xml_menu,$cadena_xml_menu);
}
$cadena_xml_menu = '</MenuItem>
';
fwrite($xml_menu,$cadena_xml_menu);
$cadena_xml_menu = '<MenuItem name="CERRAR SESION -> ' . $nombre_empleado . '" href="/kerp/intranet/logout" target="_self" id="logout"/>
';
fwrite($xml_menu,$cadena_xml_menu);
$cadena_xml_menu = '</menu>
';
fwrite($xml_menu,$cadena_xml_menu);
fclose($xml_menu);
$db->close();
}
function f_pre_sql ($tipo_dato,$campo) {
$campo = trim($campo);
switch ($tipo_dato) {
case "N" :
$tmp = explode(" ",$campo,1000);
if ($tmp[1] != "") {
$pre_sql = $campo . " ";
}
else {
$tmp = explode(",",$campo,1000);
if ($tmp[1] != "") {
$pre_sql = "in (" . $campo . ") ";
}
else {
$tmp = explode("-",$campo,1000);
if ($tmp[1] != "") {
$pre_sql = "between " . $tmp[0] . " and " . $tmp[1] . " ";
}
else {
$pre_sql = "= " . $campo . " ";
}
}
}
break;
case "T" :
$pre_sql = "like '%" . $campo . "%' ";
break;
case "F" :
$tmp = explode(" ",$campo,1000);
if ($tmp[1] != "") {
$pre_sql = $tmp[0] . "'" . $tmp[1] . " 00:00:00' ";
}
else {
$tmp = explode(",",$campo,1000);
if ($tmp[1] != "") {
$pre_sql = "in (" . $campo . ") ";
}
else {
$tmp = explode("-",$campo,1000);
if ($tmp[1] != "" && strlen($campo) > 10) {
$pre_sql = "between '" . $tmp[0] . "-" . $tmp[1] . "-" . $tmp[2] . " 00:00:00' and '" . $tmp[3] . "-" . $tmp[4] . "-" . $tmp[5] . " 23:59:59'";
}
else {
$pre_sql = "between '" . $campo . " 00:00:00' and '" . $campo . " 23:59:59'";
}
}
}
break;
}
return $pre_sql;
}
function f_chk_permisos ($usuario, $modulo) {
$sql_permisos = "SELECT *
FROM empleados, perfiles, modulos, perfilesmodulos
WHERE empleados.perfiles_id = perfiles.id
AND perfiles.id = perfilesmodulos.perfiles_id
AND modulos.modul_codigo = perfilesmodulos.modulos_codigo
AND empleados.id = " . $usuario . "
AND modulos.modul_codigo = '" . $modulo . "'";
$db = conexion_kerp();
$db->query($sql_permisos);
$sw = 0;
$i = 0;
$msg = "";
while ($row_permisos = $db->fetch_array()) {
$i++;
if ($row_permisos == 'S') {
$sw = 1;
$msg .= "El usuario se encuentra bloqueado. ";
}
if ($row_permisos == 'N') {
$sw = 1;
$msg .= "El usuario se encuentra inactivo en el sistema. ";
}
if ($row_permisos == 'S') {
$sw = 1;
$msg .= "El perfil del usuario se encuentra bloqueado. ";
}
if ($row_permisos == 'N') {
$sw = 1;
$msg .= "El perfil del usuario se encuentra inactivo. ";
}
if ($row_permisos == 'S') {
$sw = 1;
$msg .= "El modulo se encuentra bloqueado. ";
}
if ($row_permisos == 'N') {
$sw = 1;
$msg .= "El modulo se encuentra inactivo. ";
}
if ($sw == 0) {
$msg = "OK|" . $row_permisos . "|" . $row_permisos . "|" . $row_permisos . "|" . $row_permisos;
}
}
if ($sw == 1) {
$msg = "XX|" . $msg;
}
if ($i == 0) {
$sw = 1;
$msg = "XX|El usuario no tiene permisos para acceder al modulo.";
}
$db->close();
return $msg;
}
?>
Bueno, como puedes ver en el controlador, en las acciones "index" y "presql" estoy llamando a una función llamada f_chk_permisos que se encuentra en el archivo de funciones. En ambos casos, funciona a las mil maravillas, pero cuando intento llamar esa misma función desde la accion "sql" me sale el error que indique inicialmente. Ademas de esto, el controlador utiliza una plantilla en donde se llama a la función "menu" del archivo de funciones.
Que puede ser... te agradezco tu colaboración.
Cree una tabla en la base de datos llamada funciones y cree su respectivo modelo, dentro de este, coloque todas las funciones que acceden a la base de datos y listo.