[SOLVED] Error in CALC element: JSON encode error! Inf and NaN cannot be JSON encoded

kaito

Member
Hi to everyone !!

I have a calc element that makes some sql queries to obtain data and uses that data to make calculation to return a value.

Code used in calc element:

PHP:
//busco el valor raw (que es la id de la respuesta) que selecciono con el radiobutton
$idrespuesta=(int)'{afab_votacioncursotipo01___hamantenidocontactovisual_raw}';

//hago la consulta a la bbdd de qué valor tiene la respuesta con ese id, ver sintaxis en https://docs.joomla.org/Selecting_data_using_JDatabase
$db = JFactory::getDbo();
$query = $db
  ->getQuery(true)
  ->select('respuestavalor')
  ->from($db->quoteName('afab_opcionesrespuestas'))
  ->where($db->quoteName('id')." = ". $db->quote($idrespuesta));
$db->setQuery($query);
$respuestavalor = $db->loadResult();
$respuestavalor = (float) $respuestavalor;

//hago la consulta a la bbdd para saber qué peso tiene esa pregunta dentro del bloque, para ello primero debo obtener que id_preguntas es
$db = JFactory::getDbo();
$query = $db
  ->getQuery(true)
  ->select('id_preguntas')
  ->from($db->quoteName('afab_opcionesrespuestas'))
  ->where($db->quoteName('id')." = ". $db->quote($idrespuesta));
$db->setQuery($query);
$idpreguntas = $db->loadResult();

//hago la consulta a la bbdd para saber qué peso tiene esa pregunta dentro del bloque, para ello conociendo el idpreguntas ahora busco el peso
$db = JFactory::getDbo();
$query = $db
  ->getQuery(true)
  ->select('preguntapeso')
  ->from($db->quoteName('afab_preguntas'))
  ->where($db->quoteName('id')." = ". $db->quote($idpreguntas));
$db->setQuery($query);
$preguntapeso = $db->loadResult();


//CALCULO VALOR RESPUESTA EN BASE 10

//conociendo el idpregunta, de cara a calcular el valor en base 10 de la respuesta, voy a consultar el valor de respuesta mínimo que tiene
$db = JFactory::getDbo();
$query = $db
  ->getQuery(true)
  ->select('MIN('.$db->quoteName('respuestavalor').')')
  ->from($db->quoteName('afab_opcionesrespuestas'))
  ->where($db->quoteName('id_preguntas')." = ". $db->quote($idpreguntas));
$db->setQuery($query);
$respuestavalormin = $db->loadResult();
$respuestavalormin = (float) $respuestavalormin;

//conociendo el idpregunta, de cara a calcular el valor en base 10 de la respuesta, voy a consultar el valor de respuesta máximo que tiene
$db = JFactory::getDbo();
$query = $db
  ->getQuery(true)
  ->select('MAX('.$db->quoteName('respuestavalor').')')
  ->from($db->quoteName('afab_opcionesrespuestas'))
  ->where($db->quoteName('id_preguntas')." = ". $db->quote($idpreguntas));
$db->setQuery($query);
$respuestavalormax = $db->loadResult();
$respuestavalormax = (float) $respuestavalormax;

//Calculo el recorrido que hay entre el valor mínimo y el valor máximo
$recorridocompleto = $respuestavalormax - $respuestavalormin;

//calculo el recorrido de nuestra respuesta, diferenciando el caso de que el valor respuesta sea positivo o negativo

if ($respuestavalor > 0) {
  $recorridorespuesta = abs($respuestavalormin) + $respuestavalor;
}
else {
  $recorridorespuesta = abs($respuestavalormin) - abs($respuestavalor);
}

//regla de 3 para sacar el valor de la respuesta en base 10
$respuestavalor10 = ($recorridorespuesta*10)/$recorridocompleto;


//hago la consulta a la bbdd para saber qué peso tiene ese bloque, para ello debo primero saber a que id_bloques pertenece la idpreguntas.  10.01.2021: NO LO VOY  A UTILIZAR, el peso del bloque lo pondré a pelo en plotalot
//$db = JFactory::getDbo();
//$query = $db
//  ->getQuery(true)
//  ->select('id_bloques')
//  ->from($db->quoteName('afab_preguntas'))
//  ->where($db->quoteName('id')." = ". $db->quote($idpreguntas));
//$db->setQuery($query);
//$idbloques = $db->loadResult();

//hago la consulta a la bbdd para saber qué peso tiene ese bloque, para ello conociendo el id_bloques ahora busco el bloquepeso. 10.01.2021: NO LO VOY  A UTILIZAR, el peso del bloque lo pondré a pelo en plotalot
//$db = JFactory::getDbo();
//$query = $db
//  ->getQuery(true)
//  ->select('bloquepeso')
//  ->from($db->quoteName('afab_contenidotipocursos'))
//  ->where($db->quoteName('id_tipocursos')." =  1")
//  ->where($db->quoteName('id_bloques')." = ". $db->quote($idbloques));
//$db->setQuery($query);
//$bloquepeso = $db->loadResult();

//hago la fórmula para hallar el valor ponderado (por peso pregunta dentro del bloque) de la respuesta NOTA: el peso del bloque en el curso lo introduciré desde plotalot
$puntosrespuestaponderada = $preguntapeso * $respuestavalor10;

return $puntosrespuestaponderada;

When I run the web, it gives me an error:

JSON encode error! Inf and NaN cannot be JSON encoded

Using var_dump to check every variable used, I have focused that the problem is in line 73 when I try to make this division:

$respuestavalor10 = ($recorridorespuesta*10)/$recorridocompleto;

Both variables, $recorridorespuesta and $recorridocompleto are floats, verified using return var_dump(is_float($recorridorespuesta)), both return bool(true). So, I am trying to divide 2 floats but I can´t because error appears.

If I delete the division as:

$respuestavalor10 = $recorridorespuesta*10;

No error is reported (but obviously $respuestavalor10 is not valid for me without the division).

I looked for in the forum and I just found some post similar https://fabrikar.com/forums/index.p...ror-inf-and-nan-cannot-be-json-encoded.51560/ but with no clue about the solution.

Please, any suggestion will be welcome.
 
Hi troester:

Tested that $recorridocompleto is 0 from database query.

I changed "Calc on load" from Yes to No and then it works !!. I do not really know why on load, $recorridocompleto didn´t get the value from the query (different than zero), besides query extraction is previous to division...

Well, never mind, it is solved :)

Thanks again troester for your help !!!
 
We are in need of some funding.
More details.

Thank you.

Members online

Back
Top