Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Estas en el tema de Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida en el foro de PHP en Foros del Web. Buena tarde! La idea es la siguiente. Quiero realizar una consulta y hacer tal o cual acción en caso de éxito o fracaso, eso es ...
  #1 (permalink)  
Antiguo 22/04/2014, 19:31
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Buena tarde!


La idea es la siguiente. Quiero realizar una consulta y hacer tal o cual acción en caso de éxito o fracaso, eso es todo. Lo intento así:
Código PHP:
$query "SELECT nombre from mi_tabla WHERE nombre='$nombre'";
$datos mysql_query($query) or die(mysql_error());
$x     mysql_result($datos0"nombre");

if(
$x == true)
{
    echo 
'Existen datos en la BD';
}
else
{
    echo 
'No existen datos en la BD';

Este script funciona haya o no inf en la BD. Pero si resulta que no hay ni un solo registro en la BD, salta el siguiente error, debido a que, claro está, no hay ninguna fila: Warning: mysql_result(): Unable to jump to row 0 on MySQL result index 6 in....

La pregunta:
Si el error salta porque el mysql_result no pudo guardar datos dentro de $x, ¿cómo hacer para que, en caso de que mysql_result no encuentre datos dentro de la BD, evitar que se imprima en pantalla ese horrible warning?

Saludos!




PD. Entiendo que PHP está configurado para quejarse mandando warnings, notices y otras cosas en caso de encontrar fallos en los scripts, y que uno puede elegir desactivar tales quejas en pantalla mediante error_reporting(0). No deseo desactivar las advertencias. Más bien, quiero saber cómo hacer para que no salten esos errores en caso que las advertencias estén activadas.

Última edición por berkeleyPunk; 22/04/2014 a las 19:45
  #2 (permalink)  
Antiguo 22/04/2014, 21:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

PHP es OFF TOPIC en MySQL.

Movido al foro de PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/04/2014, 21:57
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Mejor usa mysql_fetch_array()
__________________
Salu2!
  #4 (permalink)  
Antiguo 22/04/2014, 22:11
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

La variable $x nunca será igual a true, pues, como dice en el manual, devuelve:

Cita:
Iniciado por Manual Oficial de PHP
El contenido de una celda de un conjunto de resultados de MySQL en caso de éxito, o FALSE en caso de fallo.
Yo lo haría así:

Código PHP:
Ver original
  1. $query = "SELECT nombre from mi_tabla WHERE nombre='$nombre'";
  2. $datos = mysql_query($query) or die(mysql_error());
  3.  
  4. if (mysql_num_rows($datos)){
  5.     $x = mysql_result($datos, 0, "nombre");
  6.     echo 'Existen datos en la BD';
  7. }
  8. else
  9.     echo 'No existen datos en la BD';

Con la función mysql_num_rows, obtienes la cantidad de registros devueltos por la consulta, entonces, si hay datos, recién puedes asignar algo a $x para que no aparezca la alerta y muestras el mensaje en el que le indicas al usuario que se encontraron datos, caso contrario, muestras el otro mensaje.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 23/04/2014, 06:05
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Gracias por responder, Italico76. De hecho, cuando recién abrí este post, horas antes había descubierto el mysql_result() y lo decidí probar en vez de mysql_fetch_array(). De cualquier forma, si usara éste, me encontraría con el mismo problema, ¿no?

Por otro lado, el maestro Alexis88 con su respuesta, me hace preguntar lo siguiente:

Dice:
Cita:
Iniciado por Alexis88 Ver Mensaje
La variable $x nunca será igual a true
1. Comentas que en caso de fallo, la variable $x no devuelve true. Pero si devuelve false, es porque la variable es booleana, ¿no?, y si lo es, entonces en caso de éxito contendría true, ¿no?, ¿o cómo?

2. Acerca de tu código: La query busca un nombre específico, digamos Homero. Ahora, si la función mysql_num_rows es exitosa se debe a que existe una cantidad positiva de registros que contienen el nombre Homero. Una vez asegurado esto, guardamos en $x el resultado de mysql_result. Con lo que se evita el warning.

Qué fácil! (Sí, fácil cuando ya sabes y tienes alguna experiencia haciéndolo, cuando no, es bastante difícil.)

Última edición por berkeleyPunk; 23/04/2014 a las 06:11
  #6 (permalink)  
Antiguo 23/04/2014, 09:11
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Como te ha dicho Alexis88 esta bastante bien explicado y el comienzo de su post responde a tu primera pregunta (punto 1).

El resultado de mysql_result será FALSE en caso de que la consulta falle al ejecutarse. Pero en caso de se ejecute correctamente, lo que devuelve son los datos de salida devueltos por la consulta. Por lo tanto $x no es un boleano (solo TRUE o FALSE) es una variable de valores, que en caso de no recuperar ningun valor sera FALSE.

Sobre el punto 2, creo que estas confirmando lo que te han dicho, no? porque es tal y como has descrito. En caso de que mysql_num_rows no tubiera valor sería porque no se ha devuelto ninguna fila en la consulta y por lo tanto no se ejecutará mysql_result (ya que no tiene sentido, hacemos la comprobación de hecho para ver si es necesario ejecutarlo o no).

Un saludo.
  #7 (permalink)  
Antiguo 23/04/2014, 09:53
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Que pena pero @Alexis88 y @kikeking1 deben releer sobre uso de operadores en PHP, en particular para comparaciones:

Código PHP:
<?php

$var 
"un tipo distinto a boolean";

if (
$var)
   echo 
"Es TRUE!\n<br/>";

   
if (
$var==True)
   echo 
"Es TRUE!\n<br/>";   
   
if (
$var===True)
   echo 
"Es TRUE!";      
else   
   echo 
"Es FALSE porque estoy usando el operador '===' para comparar tambien tipos";

El resultado sera... TRUE...TRUE... FALSE

Mas ejemplos:

Código PHP:
if (== 3.00000)
   echo 
"Es TRUE!\n<br/>";
# imprime TRUE   
   
if (3=== 3.00000)
   echo 
"Es TRUE!\n<p/>";      
else   
   echo 
"Es FALSE porque estoy usando el operador '===' para comparar tambien tipos\n<p/>";
# imprime FALSE 
Código PHP:
if (NULL == FALSE)
   echo 
"Es TRUE!\n<br/>";
# imprime TRUE   
   
   
if (NULL === FALSE)
   echo 
"Es TRUE!\n<p/>";
else   
   echo 
"Es FALSE porque estoy usando el operador '===' para comparar tambien tipos\n<p/>";   
# imprime FALSE 
---
Le dejo el enlace al manual:

http://www.php.net/manual/es/languag...comparison.php
__________________
Salu2!

Última edición por Italico76; 23/04/2014 a las 10:05
  #8 (permalink)  
Antiguo 23/04/2014, 10:28
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Estimado Italico76, creo que no entendiste mi explicación, la cual nuestro amigo kikeking1 ha entendido y explicado nuevamente con total claridad. Pero por si las dudas, ahí va de nuevo.

La función mysql_result, devuelve el contenido de una celda  la que se haya indicado  en caso de que la consulta haya sido exitosa, caso contrario, devuelve el valor booleano false. Creo que en este punto nuestro amigo berkeleyPunk y tú me interpretaron mal puesto que a $x se le asigna lo devuelto por mysql_result, no es que se trate de una variable booleana y menos de que la condición esté mal elaborada.

Cuando dije:

Cita:
Iniciado por Alexis88 Ver Mensaje
La variable $x nunca será igual a true
Fue porque dicha variable nunca tomará ese valor, por lo explicado líneas arriba.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 23/04/2014 a las 11:23
  #9 (permalink)  
Antiguo 23/04/2014, 11:06
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

La falla original esta que mysql_result() devuelve un arreglo ..... y sino se sabe con certeza si esta vacio o cuantos elementos tiene no se puede intentar acceder a posicion alguna:

Código PHP:
Ver original
  1. $x = $arreglo[0];  # $arreglo sera FALSE ? NULL ? no se sabe a priori

Entonces

Código PHP:
Ver original
  1. if (!empty($arreglo))   # que tambien chequea no sea FALSE
  2.    $x = $arreglo[0]


En general... porque $arreglo seria lo que devuelve esa funcion
__________________
Salu2!
  #10 (permalink)  
Antiguo 23/04/2014, 11:14
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Precisamente por eso es que le sugerí la forma de comprobación de existencia de resultados que detallo en mi primera respuesta, pues así se evitaría intentar obtener el conjunto de resultados de una operación que probablemente no haya devuelto resultado alguno.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #11 (permalink)  
Antiguo 23/04/2014, 11:24
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Cita:
Iniciado por Alexis88 Ver Mensaje
Precisamente por eso es que le sugerí la forma de comprobación de existencia de resultados que detallo en mi primera respuesta, pues así se evitaría intentar obtener el conjunto de resultados de una operación que probablemente no haya devuelto resultado alguno.
Lo que creó la confusion fue decir: "la variable $x nunca será igual a true" lo que es muy coloquial porque SI PUEDE SER IGUAL (==) a ""TRUE"" lo que no puede ser es IDENTICA (===) a TRUE

Como dice el manual... se es el operador de "identidad" y no para comparar "igualdad"


Tambien podria haber servido en este caso particular comparar identidad con FALSE

Código PHP:
Ver original
  1. if ($arreglo === False)
  2.     # no hay resultados
  3. else
  4.     # accedo al indice [0]

Igualmente aconsejaria el uso de is_empty() ya que otras funciones en vez de devolver False podrian devolver NULL, asi que is_empty() generaliza esos casos
__________________
Salu2!
  #12 (permalink)  
Antiguo 23/04/2014, 11:29
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Sí, me di cuenta de que debí tener más cuidado en la explicación. Y bueno, de estas experiencias se aprende.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #13 (permalink)  
Antiguo 24/04/2014, 05:04
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Me quedo con esto:

Cita:
Iniciado por Italico76 Ver Mensaje
Lo que creó la confusion fue decir: "la variable $x nunca será igual a true" lo que es muy coloquial porque SI PUEDE SER IGUAL (==) a ""TRUE"" lo que no puede ser es IDENTICA (===) a TRUE ...

¿Por qué? Por dos cosas: 1, porque evidencia con claridad que kikeking1 no tiene razón para afirmar:
Cita:
Iniciado por kikeking1 Ver Mensaje
Como te ha dicho Alexis88 esta bastante bien explicado y el comienzo de su post responde a tu primera pregunta (punto 1)...
y 2, porque muestra que mi duda sobre el tipo de $x no es una duda irracional o torpe, sino bastante natural ante las circunstancias dadas.

Bueno, pues seguimos aprendiendo.

Saludos!
  #14 (permalink)  
Antiguo 24/04/2014, 11:30
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Ejecutar tal o cual acción en caso de una CONSULTA exitosa o fallida

Yo creo que kikeking1 entendió sin necesidad de que de detalles, de que sea más específico, o como decimos por acá, de que se lo explique con cucharita.

Lo bueno es que ya quedó todo aclarado.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:11.