entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Buenas, estoy atorado en una tontería aparentemente estoy empezando con Php y MySQL. Y voy desarrollando una rutina para extraer los datos con una consulta SQL que genera una sumatoria en 2 campos totgenfac (total facturado) y totgencob (total cobrado) y posteriormente realizo una resta para saber lo que queda por cobrar. La rutina me funciona perfectamente pero cuando lo convierto en Función DEJA DE FUNCIONAR. He buscando en la documentación pero no logro conseguir la razón ¿Será que las instrucciones; mysql_select_db, mysql_query, mysql_fetch_assoc no trabajan dentro de las funciones?. Gracias.

Trabaja correctamente pero quisiera hacer una función

Función que no trabaja correctamente

ESTO FUNCIONA PERFECTAMENTE

<?php
require_once('../Connections/cn.php');
mysql_select_db($database_cn, $cn);
$query_Recordset1 = "SELECT
                        IF (tpdcxc='FAC',SUM(documcxc.totgencxc),IF (tpdcxc='N/C',SUM(documcxc.totgencxc*-1),IF (tpdcxc='N/D',SUM(documcxc.totgencxc),sum(0)))) as totgenfac,
                        IF (tpdcxc='FAC',SUM(documcxc.totcobcxc),IF (tpdcxc='N/C',SUM(documcxc.totcobcxc*-1),IF (tpdcxc='N/D',SUM(documcxc.totcobcxc),sum(0)))) as totgencob
                        FROM
                        documcxc
                        WHERE
                        documcxc.tpdcxc IN ('FAC', 'N/C', 'N/D') and estcxc IN ('0', '1')";
$Recordset1 = mysql_query($query_Recordset1, $cn) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totPendxCobrar = number_format (($row_Recordset1['totgenfac'] - $row_Recordset1['totgencob']), 2 , "." , "," );
$pocTotPendxCobrar = number_format (((($row_Recordset1['totgenfac'] - $row_Recordset1['totgencob']) * 100) / $row_Recordset1['totgenfac']), 2 , "." , "," );
mysql_free_result($Recordset1);
?>

ESTO NO FUNCIONA PARA NADA

<?php
require_once('../Connections/cn.php');

function CobradoVsFacturado(){
mysql_select_db($database_cn, $cn);
$query_Recordset1 = "SELECT
                        IF (tpdcxc='FAC',SUM(documcxc.totgencxc),IF (tpdcxc='N/C',SUM(documcxc.totgencxc*-1),IF (tpdcxc='N/D',SUM(documcxc.totgencxc),sum(0)))) as totgenfac,
                        IF (tpdcxc='FAC',SUM(documcxc.totcobcxc),IF (tpdcxc='N/C',SUM(documcxc.totcobcxc*-1),IF (tpdcxc='N/D',SUM(documcxc.totcobcxc),sum(0)))) as totgencob
                        FROM
                        documcxc
                        WHERE
                        documcxc.tpdcxc IN ('FAC', 'N/C', 'N/D') and estcxc IN ('0', '1')";
$Recordset1 = mysql_query($query_Recordset1, $cn) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totPendxCobrar = number_format (($row_Recordset1['totgenfac'] - $row_Recordset1['totgencob']), 2 , "." , "," );
mysql_free_result($Recordset1);
return $totPendxCobrar; //AL INVOCAR LA FUNCIÓN NO RETORNA NINGÚN VALOR
}
?>

Estructura de la tabla en MySQL

-- ----------------------------
-- Table structure for documcxc
-- ----------------------------
DROP TABLE IF EXISTS `documcxc`;
CREATE TABLE `documcxc` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tpdcxc` varchar(5) NOT NULL DEFAULT '',
  `docxc` varchar(20) NOT NULL DEFAULT '',
  `ncontcxc` varchar(20) NOT NULL DEFAULT '',
  `seq_nodocxc` varchar(20) NOT NULL DEFAULT '',
  `aplicadoacxc` varchar(20) NOT NULL DEFAULT '',
  `codclicxc` varchar(50) NOT NULL DEFAULT '',
  `id_cliente` int(20) NOT NULL,
  `nomclicxc` varchar(255) NOT NULL DEFAULT '',
  `femiscxc` date NOT NULL,
  `ffincxc` date NOT NULL,
  `fultpagcxc` date NOT NULL,
  `totnetocxc` double(20,7) NOT NULL,
  `totimpcxc` double(20,7) NOT NULL,
  `totgencxc` double(20,7) NOT NULL,
  `totcobcxc` double(20,7) NOT NULL,
  `estcxc` char(1) NOT NULL DEFAULT '',
  `codsopocxc` varchar(50) NOT NULL DEFAULT '',
  `id_soportista` int(20) NOT NULL,
  `codretcxc` varchar(20) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;

1voto

Leonardo-Tadei comentado

Poné acá las función que te da problemas, así viendo el código podremos ayudarte...

También sería útil la estructura de las tablas.

0voto

hectoridalgo comentado

Buenas amigo Leonardo-Tadei las 2 imágenes anexas al post corresponden al código que me está dando problemas. Igualmente atendiendo a tu sugerencia coloque el código y las tablas en MySQL. No me había percatado que esta la opción de colocar el código con el editor, mea culpa. Gracias por la atención.

0voto

Leonardo-Tadei comentado

Al menos yo, nunca vi ninguna imagen... posiblemente haya que estar logueado a algo que yo no tengo para verlas...

1 Respuesta

3votos

Leonardo-Tadei Puntos227320

Hola @hectoridalgo,

vamos por partes:

  • Estás usando una función anónima, es decir, que no tiene nombre, y salvo que estés con PHP 7, no funcionará jamás. Deberías declarar la función con algún nombre, por ejemplo:

    function calcula(){
    ...
  • Estás usando las viejas funciones mysql* en vez de las más nuevas mysqli* o las PDO: esto no funciona en PHP 6 o superior y aunque funcione, no es recomendado.

  • La línea mysql_select_db($database_cn, $cn); no puede funcionar, porque $database_cn, $cn no están declaradas dentro de la función, es decir, no existen. Si vas a usar una función, tenés que pasártelas como parámetros:

    function calcula($database_cn, $cn){
    ...
  • No aparece el código en que invocás a la función. Con estos cambios debería ser algo como:
$resultado - calcula($database_cn, $cn);
  • Deberías tener PHP configurado en modo developer cambiando el PHP.INI y relanzando Apache, de manera tal de ver estos errores en la pantalla del navegador. Si no podés hacer esto, podés ver los log de error en el archivo de mensajes de error de Apache. Todos estos errores aparecen como tales.

Saludos cordiales!

PD: pasate a las PDO...

0voto

hectoridalgo comentado

Gracias, por la respuesta estoy usando PHP Versión 5.5.30. No uso las funciones orientadas a objeto ya que estoy aprendiendo Php y aun no se programar orientado a objeto.

También probé la siguiente forma de la función, ciertamente no coloque en ningún momento para pasar los parámetros de la conexión a la base de datos, pensé que incluyéndolos en un require dentro de la función podría funcionar pero no lo hace.

function CobradoVsFacturado(){
require_once('../Connections/cn.php');
mysql_select_db($database_cn, $cn);
$query_Recordset1 = "SELECT
                        IF (tpdcxc='FAC',SUM(documcxc.totgencxc),IF (tpdcxc='N/C',SUM(documcxc.totgencxc*-1),IF (tpdcxc='N/D',SUM(documcxc.totgencxc),sum(0)))) as totgenfac,
                        IF (tpdcxc='FAC',SUM(documcxc.totcobcxc),IF (tpdcxc='N/C',SUM(documcxc.totcobcxc*-1),IF (tpdcxc='N/D',SUM(documcxc.totcobcxc),sum(0)))) as totgencob
                        FROM
                        documcxc
                        WHERE
                        documcxc.tpdcxc IN ('FAC', 'N/C', 'N/D') and estcxc IN ('0', '1')";
$Recordset1 = mysql_query($query_Recordset1, $cn) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totPendxCobrar = number_format (($row_Recordset1['totgenfac'] - $row_Recordset1['totgencob']), 2 , "." , "," );
mysql_free_result($Recordset1);
return $totPendxCobrar; //AL INVOCAR LA FUNCIÓN NO RETORNA NINGÚN VALOR
}

Con respecto a lo del modo developer de Php no lo tenía activado gracias por el consejo.

0voto

Leonardo-Tadei comentado

Sin ver el código de cn.php no te lo puedo afirmar, pero lo más probable es que al ponerlo en un require_once() al estar el script ya incluído en otra parte, no se vuelva a incluir, ya que esto es justamenet lo que hace requiere_once() : preservar de incluir dos veces el mismo código.

La forma correcta de hacer esto es pasar como parámetro la base de datos y el handler a la conexión, tal y como te indico más arriba.

Entiendo lo que decís sobre aprender y usar POO, pero las mysqli_* tienen un mecanismo d euso orientado a funciones, así que podrías pasarte a ellas sin cambiar de paradigma.

Saludos cordiales

0voto

hectoridalgo comentado

Nuevamente gracias ya estoy leyendo sobre mysqli para implementarlo en el proyecto y sustituir el anterior ya que efectivamente al activar el debug me alerta que está deprecado.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta