Mysql, Php, pdo y goto.

Iniciado por #Aitor, 29 Diciembre 2013, 02:01 AM

0 Miembros y 1 Visitante están viendo este tema.

#Aitor

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 (php) [Seleccionar]

$con=mysql_connect($host,$user,$pw)or die("Problems with servers. "); 
// Conecta con mysql

mysql_select_db($db,$con)or die ("Problems with Data Base"); 
// Conecta con la base de datos.

$sel=mysql_query("SELECT USER FROM registro",$con);
// Seleciona la columna user.

$sesion=mysql_fetch_array($sel);
// Lo almacena en un array.

$user = $_POST['user']; // Se almacena en la variable '$user' lo escrito en el formulario anterior.
$userB = $sesion['USER']; // Se almacena en la variabe '$userB' toda la columna user.

do { // Ciclo do while

$DATO = $sesion['USER']; // Recorre el array

}

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.


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.
echo "El usuario ya existe"; // Si la comprobacion retorna True imprime por pantalla que el Usuario existe.

}else{

// Código si no se cumple la condición bla bla bla...

}


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 (php) [Seleccionar]

<?php


try {
    
$con = new PDO('mysql:host=localhost;dbname=pruebas'"root""XXXXXXX");
    foreach(
$con->query('SELECT * from pruebas') as $fila) {
   

if($fila['USER'] == "Aitor"){

goto SALTAR;
}


    }



  
$con->query ("INSERT INTO pruebas (ID,USER) 
VALUES ('','Aitor')"
);


    
$gbd null;
} catch (
PDOException $e) {
    print 
"¡Error!: " $e->getMessage() . "<br/>";
    die();
}

SALTAR
echo "Ya existe el usuario";
?>




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.
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

EFEX

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 (sql) [Seleccionar]

SELECT *                                              //Seleccionar todo
FROM tabla_usuarios                                   //de tabla_usuarios
WHERE nombre = 'Aitor';                               //donde el nombre sea igual a ...


GITHUB 

#Aitor

Cita de: EFEX 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 (sql) [Seleccionar]

SELECT *                                              //Seleccionar todo
FROM tabla_usuarios                                   //de tabla_usuarios
WHERE nombre = 'Aitor';                               //donde el nombre sea igual a ...




Código (php) [Seleccionar]


$usuario = $_POST['user'];

try {
    $con = new PDO('mysql:host=localhost;dbname=pruebas', "root", "XXXXXXXXXX");

$prueba = $con->query("SELECT * from pruebas WHERE USER = '$usuario'");
    if ($prueba == true){

echo "El nombre de usuario ya existe.";

}else{
   
$con->query ("INSERT INTO pruebas (ID,USER) VALUES ('','$usuario')");

echo "Cuenta creada";

    $gbd = null;
}

// Más código bla bla bla.


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?
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

EFEX

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

Código (php) [Seleccionar]

$usuario = $_POST['user'];

try {
   $con = new PDO('mysql:host=localhost;dbname=pruebas', "root", "XXXXXXXXXX");

   $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
   if ($prueba){  // Con eso es suficiente

       echo "El nombre de usuario ya existe.";

   }else{
 
$con->query("INSERT INTO pruebas (ID,USER) VALUES ('','$usuario')");
       echo "Cuenta creada";

       $gbd = null;
   }
} 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
       echo 'No se pudo conectar: ' . $e->getMessage();
}

// Más código bla bla bla.


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

#!drvy

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

Saludos

#Aitor

#5
Cita de: EFEX 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 (php) [Seleccionar]

$usuario = $_POST['user'];

try {
   $con = new PDO('mysql:host=localhost;dbname=pruebas', "root", "XXXXXXXXXX");

   $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
   if ($prueba){  // Con eso es suficiente

       echo "El nombre de usuario ya existe.";

   }else{
 
$con->query("INSERT INTO pruebas (ID,USER) VALUES ('','$usuario')");
       echo "Cuenta creada";

       $gbd = null;
   }
} 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
       echo 'No se pudo conectar: ' . $e->getMessage();
}

// Más código bla bla bla.


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 (php) [Seleccionar]


// Nombre de la base de datos, pruebas, nombre de tabla pruebas01


NOMBRE |  USER | EMAIL                           | CP
_______________________________________
Aitor       | mr9    | ejemplo@example.es   |40401
_______________________________________
Shiro      | shr3   | fuego@fuego.es           |78787

[table][td][/td][/table]

Código (php) [Seleccionar]

$prueba = $con->query("SELECT * from pruebas01 WHERE user ='mr9'")->fetchColumn();

echo $prueba;


Devuelve Aitor.

Código (php) [Seleccionar]

$prueba = $con->query("SELECT * from pruebas01 WHERE user ='shr3'")->fetchColumn();

echo $prueba;


Devuelve shiro.

Código (php) [Seleccionar]

$prueba = $con->query("SELECT * from pruebas01 WHERE email ='ejemplo@example.es'")->fetchColumn();

echo $prueba;


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.

Cita de: @drvy 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

Lo estoy echando un vistazo, gracias por el detalle.

Y de nuevo, gracias a los dos.

Un saludo.
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

EFEX

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 (php) [Seleccionar]

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


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
GITHUB 

#Aitor

Cita de: EFEX 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 (php) [Seleccionar]

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


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
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

el-brujo

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.

:ohk<any>

Cita de: el-brujo 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.


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.
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.