elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Mysql, Php, pdo y goto.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mysql, Php, pdo y goto.  (Leído 4,107 veces)
#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Mysql, Php, pdo y goto.
« en: 29 Diciembre 2013, 02:01 am »

Buenas, hasta hace unos días usaba mysql la sintaxis que está obsoleta para PHP. No obstante al leer la documentación que php.net ofrece informaba de que en un futuro, sería eliminado de Php. Y que quedaban como alternativa a ésta, dos opciones. o Mysqli o PDO. Dado que según lo que he leido, y he entendido, Mysqli sólo sirve para bases de datos Mysql, y si en algún momento, decidia cambiar de base de datos, me tocaría cambiar todo el script, cosa que con PDO no.

Finalmente decidí aprender (o hacer intento de aprender) PDO.  Así pues, intenté traducir los scripts que ya tenía, a PDO como buenamente pude.

Total, al grano... yo tenía este script.

Código
  1.  
  2. $con=mysql_connect($host,$user,$pw)or die("Problems with servers. ");  
  3. // Conecta con mysql
  4.  
  5. mysql_select_db($db,$con)or die ("Problems with Data Base");  
  6. // Conecta con la base de datos.
  7.  
  8. $sel=mysql_query("SELECT USER FROM registro",$con);
  9. // Seleciona la columna user.
  10.  
  11. $sesion=mysql_fetch_array($sel);
  12. // Lo almacena en un array.
  13.  
  14. $user = $_POST['user']; // Se almacena en la variable '$user' lo escrito en el formulario anterior.
  15. $userB = $sesion['USER']; // Se almacena en la variabe '$userB' toda la columna user.
  16.  
  17. do { // Ciclo do while
  18.  
  19. $DATO = $sesion['USER']; // Recorre el array
  20.  
  21. }
  22.  
  23. while($sesion= mysql_fetch_array($sel) or $dato === $user); // Hasta que no retorne falso o $dato sea igual a $user no se rompe el ciclo.
  24.  
  25.  
  26. if($user === $DATO){ // Comprueba si la variable user TIENE un valor IGUAL y es del mismo tipo de variable que alguna de las filas de la columna USER.
  27. echo "El usuario ya existe"; // Si la comprobacion retorna True imprime por pantalla que el Usuario existe.
  28.  
  29. }else{
  30.  
  31. // Código si no se cumple la condición bla bla bla...
  32.  
  33. }
  34.  

No obstante, en PDO me atasque, pues no sabía como comparar para saber si el usuario ya existia. Intenté con do while, pero no dejaba argumentando que estaba tratando con arrays y no con strings.

Asi pues la solución más simple, era poner un if en el foreach que fuese recorriendo uno a uno todos los arrays y los comparase. Y una vez los comparase dependiendo del resultado hacer un salto (con salto me refiero a un goto) o seguir con el código.

Código
  1. <?php
  2.  
  3.  
  4. try {
  5.    $con = new PDO('mysql:host=localhost;dbname=pruebas', "root", "XXXXXXX");
  6.    foreach($con->query('SELECT * from pruebas') as $fila) {
  7.  
  8.  
  9. if($fila['USER'] == "Aitor"){
  10.  
  11. goto SALTAR;
  12. }
  13.  
  14.  
  15.    }
  16.  
  17.  
  18.  
  19.  $con->query ("INSERT INTO pruebas (ID,USER)
  20. VALUES ('','Aitor')");
  21.  
  22.  
  23.    $gbd = null;
  24. } catch (PDOException $e) {
  25.    print "¡Error!: " . $e->getMessage() . "<br/>";
  26.    die();
  27. }
  28.  
  29. SALTAR:
  30. echo "Ya existe el usuario";
  31. ?>
  32.  
  33.  

Como podéis ver no es la misma tabla ni base de datos, pero el funcionamiento es el mismo.

No obstante, a lo que quiero llegar, es que seguramente hay una forma más 'fácil' o corta, de comprobar si el usuario que se va a registrar ya esta en la base de datos. Y no tenga que usar el goto para saltarme el codigo en caso de que la comprobación sea correcta.

Un saludo y gracias.


En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Mysql, Php, pdo y goto.
« Respuesta #1 en: 29 Diciembre 2013, 14:42 pm »

hay estas obteniendo tooodos los registros de la tabla lo que no es conveniente... existen clausulas en mysql para hacer una busqueda minuciosa y mas exacta.

Código
  1. SELECT *                                              //Seleccionar todo
  2. FROM tabla_usuarios                                   //de tabla_usuarios
  3. WHERE nombre = 'Aitor';                               //donde el nombre sea igual a ...
  4.  



En línea

#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: Mysql, Php, pdo y goto.
« Respuesta #2 en: 29 Diciembre 2013, 15:14 pm »

hay estas obteniendo tooodos los registros de la tabla lo que no es conveniente... existen clausulas en mysql para hacer una busqueda minuciosa y mas exacta.

Código
  1. SELECT *                                              //Seleccionar todo
  2. FROM tabla_usuarios                                   //de tabla_usuarios
  3. WHERE nombre = 'Aitor';                               //donde el nombre sea igual a ...
  4.  



Código
  1.  
  2. $usuario = $_POST['user'];
  3.  
  4. try {
  5.    $con = new PDO('mysql:host=localhost;dbname=pruebas', "root", "XXXXXXXXXX");
  6.  
  7. $prueba = $con->query("SELECT * from pruebas WHERE USER = '$usuario'");
  8.   if ($prueba == true){
  9.  
  10. echo "El nombre de usuario ya existe.";
  11.  
  12. }else{
  13.  
  14. $con->query ("INSERT INTO pruebas (ID,USER) VALUES ('','$usuario')");
  15.  
  16. echo "Cuenta creada";
  17.  
  18.    $gbd = null;
  19. }
  20.  
  21. // Más código bla bla bla.
  22.  

Se supone que cuando la consulta que realizo, encuentra datos ('Select * from pruebas where user = "$usuario"');

debería retornar falso, cuando no se encuentra y true cuando se encuentra, pero por alguna razón, indepentientemente de si el usuario está en la base de datos, entra en el if. es decir, siempre retorna true, aunque no lleve ningún valor...

¿A qué se debe? ¿Qué hago mal?
En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Mysql, Php, pdo y goto.
« Respuesta #3 en: 29 Diciembre 2013, 15:41 pm »

En esos casos tenes que saber que valor tiene $prubea, en este es un objeto y siempre va a ser valido.

Código
  1. $usuario = $_POST['user'];
  2.  
  3. try {
  4.    $con = new PDO('mysql:host=localhost;dbname=pruebas', "root", "XXXXXXXXXX");
  5.  
  6.    $prueba = $con->query("SELECT * from pruebas WHERE USER = '$usuario'")->fetchColumn(); // Solo necesitas saber si existe o no, fetchColumn retornara algo si exite en caso contrario no
  7.    if ($prueba){  // Con eso es suficiente
  8.  
  9.        echo "El nombre de usuario ya existe.";
  10.  
  11.    }else{
  12.  
  13. $con->query("INSERT INTO pruebas (ID,USER) VALUES ('','$usuario')");
  14.        echo "Cuenta creada";
  15.  
  16.        $gbd = null;
  17.    }
  18. } catch (PDOException $e) {   // Si utilizar try debes utilizar catch en este caso se usa para saber si realizo la conexion a la base de datos
  19.        echo 'No se pudo conectar: ' . $e->getMessage();
  20. }
  21.  
  22. // Más código bla bla bla.
  23.  

fetchColumn()
http://es.php.net/manual/en/pdostatement.fetchcolumn.php
« Última modificación: 29 Diciembre 2013, 15:47 pm por EFEX » En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: Mysql, Php, pdo y goto.
« Respuesta #4 en: 29 Diciembre 2013, 16:45 pm »

Como nota final, si utilizas PDO o MySQLi utiliza sentencias preparadas.
http://at1.php.net/manual/es/pdo.prepared-statements.php

Saludos
En línea

#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: Mysql, Php, pdo y goto.
« Respuesta #5 en: 29 Diciembre 2013, 17:17 pm »

En esos casos tenes que saber que valor tiene $prubea, en este es un objeto y siempre va a ser valido.

Código
  1. $usuario = $_POST['user'];
  2.  
  3. try {
  4.    $con = new PDO('mysql:host=localhost;dbname=pruebas', "root", "XXXXXXXXXX");
  5.  
  6.    $prueba = $con->query("SELECT * from pruebas WHERE USER = '$usuario'")->fetchColumn(); // Solo necesitas saber si existe o no, fetchColumn retornara algo si exite en caso contrario no
  7.    if ($prueba){  // Con eso es suficiente
  8.  
  9.        echo "El nombre de usuario ya existe.";
  10.  
  11.    }else{
  12.  
  13. $con->query("INSERT INTO pruebas (ID,USER) VALUES ('','$usuario')");
  14.        echo "Cuenta creada";
  15.  
  16.        $gbd = null;
  17.    }
  18. } catch (PDOException $e) {   // Si utilizar try debes utilizar catch en este caso se usa para saber si realizo la conexion a la base de datos
  19.        echo 'No se pudo conectar: ' . $e->getMessage();
  20. }
  21.  
  22. // Más código bla bla bla.
  23.  

fetchColumn()
http://es.php.net/manual/en/pdostatement.fetchcolumn.php

Gracias, funciona a la perfeción, aunque sigo sin entender, porque al no encontrar un resultado, no retorna false, como con fetchColumn().

A proposito, según el manual de PDO fetchColumn()  Devuelve una única columna de la siguiente fila de un conjunto de resultados. No comprendo muy bien, pues he estado haciendo pruebas, y siempre devuelve datos de la primera columna, me explico.

Ejemplo de la base de daatos;

Código
  1.  
  2. // Nombre de la base de datos, pruebas, nombre de tabla pruebas01
  3.  
  4.  
  5. NOMBRE |  USER | EMAIL                           | CP
  6. _______________________________________
  7. Aitor       | mr9    | ejemplo@example.es   |40401
  8. _______________________________________
  9. Shiro      | shr3   | fuego@fuego.es           |78787
  10.  
  11. [table][td][/td][/table]
  12.  
Código
  1. $prueba = $con->query("SELECT * from pruebas01 WHERE user ='mr9'")->fetchColumn();
  2.  
  3. echo $prueba;
  4.  

Devuelve Aitor.

Código
  1. $prueba = $con->query("SELECT * from pruebas01 WHERE user ='shr3'")->fetchColumn();
  2.  
  3. echo $prueba;
  4.  

Devuelve shiro.

Código
  1. $prueba = $con->query("SELECT * from pruebas01 WHERE email ='ejemplo@example.es'")->fetchColumn();
  2.  
  3. echo $prueba;
  4.  

Devuelve Aitor.

Como podéis ver siempre devuelve de la columna Name, y según
http://es1.php.net/manual/es/pdostatement.fetchcolumn.php

No debería ser así, o al menos así lo entiendo.

Como nota final, si utilizas PDO o MySQLi utiliza sentencias preparadas.
http://at1.php.net/manual/es/pdo.prepared-statements.php

Saludos

Lo estoy echando un vistazo, gracias por el detalle.

Y de nuevo, gracias a los dos.

Un saludo.
« Última modificación: 29 Diciembre 2013, 22:08 pm por #Aitor » En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Mysql, Php, pdo y goto.
« Respuesta #6 en: 30 Diciembre 2013, 01:38 am »

PDO fetchColumn():  Devuelve una única columna, de la siguiente fila de un conjunto de resultados, siempre retorna una sola columna y es la primera columna(NOMBRE).

Código
  1. $prueba = $con->query("SELECT * from pruebas WHERE USER = '$usuario'")->fetchColumn(1); // Puede aceptar un parametro para mostrar otra columna...
  2.  

Si ques obtener la fila completa podes utilizar fetch()
http://www.php.net/manual/es/pdostatement.fetch.php

Si queres obtener mas de una fila podes utilizar fetchall()
http://www.php.net/manual/es/pdostatement.fetchall.php

Creo que asi es... sino corrijanme vengo muy insolado por el sol.  ;D
En línea

#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: Mysql, Php, pdo y goto.
« Respuesta #7 en: 30 Diciembre 2013, 10:57 am »

PDO fetchColumn():  Devuelve una única columna, de la siguiente fila de un conjunto de resultados, siempre retorna una sola columna y es la primera columna(NOMBRE).

Código
  1. $prueba = $con->query("SELECT * from pruebas WHERE USER = '$usuario'")->fetchColumn(1); // Puede aceptar un parametro para mostrar otra columna...
  2.  

Si ques obtener la fila completa podes utilizar fetch()
http://www.php.net/manual/es/pdostatement.fetch.php

Si queres obtener mas de una fila podes utilizar fetchall()
http://www.php.net/manual/es/pdostatement.fetchall.php

Creo que asi es... sino corrijanme vengo muy insolado por el sol.  ;D

Perfecto, esta mañana al levantar me preguntaba si podría aceptar parámetros

Muchas gracias por la ayuda a todos. ;P
En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
el-brujo
ehn
***
Desconectado Desconectado

Mensajes: 21.641


La libertad no se suplica, se conquista


Ver Perfil WWW
Re: Mysql, Php, pdo y goto.
« Respuesta #8 en: 31 Diciembre 2013, 20:25 pm »

estoy preparando una entrada en el blog sobre las diferencias entre mysql y mysqli (libmysql  y mysqlnd) xD

En realidad para conectar PHP con MySQL hay tres opciones, no dos.

  • ext/mysql (not recommended) (libmysql)
  • ext/mysqli (mysqlnd)
  • PDO_MySQL

Deberías usar Mysqli (mysql improved, mejorado) pero el problema es que muchos CMS aún usan mysql y muchos ejemplos de código se basan en mysql.
En línea

:ohk<any>


Desconectado Desconectado

Mensajes: 1.744


Yo lo que quiero que me salga bien es la vida.


Ver Perfil WWW
Re: Mysql, Php, pdo y goto.
« Respuesta #9 en: 1 Enero 2014, 18:35 pm »

estoy preparando una entrada en el blog sobre las diferencias entre mysql y mysqli (libmysql  y mysqlnd) xD

En realidad para conectar PHP con MySQL hay tres opciones, no dos.

  • ext/mysql (not recommended) (libmysql)
  • ext/mysqli (mysqlnd)
  • PDO_MySQL

Deberías usar Mysqli (mysql improved, mejorado) pero el problema es que muchos CMS aún usan mysql y muchos ejemplos de código se basan en mysql.


Yo también recomiendo el uso del MySQLi y a pesar de que muchos CMS usan el mysql, pronto se actualizaran obligados por que mysql quedo obsoleto.
En línea

Y es que a veces pienso que si no estuviera loco no podría salir adelante.
Lo que no se es capaz de dar, en realidad no se posee, uno es poseído por ello.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
On Error GoTo NEXT
Programación Visual Basic
Scratz 3 3,304 Último mensaje 23 Agosto 2007, 05:12 am
por ActiveSheet
On error goto loquesea
Programación Visual Basic
papanoel_devacaciones 4 2,124 Último mensaje 17 Septiembre 2007, 05:29 am
por Deeo Raiser
Goto en javascript?
Scripting
Leber 0 5,535 Último mensaje 9 Octubre 2007, 17:03 pm
por Leber
For mas rapido que goto en bucles
Scripting
kraszic 0 2,194 Último mensaje 29 Diciembre 2008, 00:04 am
por kraszic
¿Por qué GoTo es malo?
Programación Visual Basic
martin_poipon 4 4,214 Último mensaje 12 Junio 2011, 20:37 pm
por martin_poipon
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines