Autor
|
Tema: Mysql, Php, pdo y goto. (Leído 4,107 veces)
|
#Aitor
Desconectado
Mensajes: 173
|
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. // Conecta con mysql // Conecta con la base de datos. // Seleciona la columna user. // 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. <?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/>"; } 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.
|
|
|
En línea
|
Mi algoritmo en PHP (estupideces y más).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
Desconectado
Mensajes: 1.171
"Dinero Facil"
|
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. SELECT * //Seleccionar todo FROM tabla_usuarios //de tabla_usuarios WHERE nombre = 'Aitor'; //donde el nombre sea igual a ...
|
|
|
En línea
|
|
|
|
#Aitor
Desconectado
Mensajes: 173
|
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. SELECT * //Seleccionar todo FROM tabla_usuarios //de tabla_usuarios WHERE nombre = 'Aitor'; //donde el nombre sea igual a ...
$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?
|
|
|
En línea
|
Mi algoritmo en PHP (estupideces y más).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
Desconectado
Mensajes: 1.171
"Dinero Facil"
|
En esos casos tenes que saber que valor tiene $prubea, en este es un objeto y siempre va a ser valido. $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
|
|
« Última modificación: 29 Diciembre 2013, 15:47 pm por EFEX »
|
En línea
|
|
|
|
|
#Aitor
Desconectado
Mensajes: 173
|
En esos casos tenes que saber que valor tiene $prubea, en este es un objeto y siempre va a ser valido. $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.phpGracias, 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; // 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]
$prueba = $con->query("SELECT * from pruebas01 WHERE user ='mr9'")->fetchColumn(); echo $prueba;
Devuelve Aitor. $prueba = $con->query("SELECT * from pruebas01 WHERE user ='shr3'")->fetchColumn(); echo $prueba;
Devuelve shiro. $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. 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).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
Desconectado
Mensajes: 1.171
"Dinero Facil"
|
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). $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.phpSi queres obtener mas de una fila podes utilizar fetchall() http://www.php.net/manual/es/pdostatement.fetchall.phpCreo que asi es... sino corrijanme vengo muy insolado por el sol.
|
|
|
En línea
|
|
|
|
#Aitor
Desconectado
Mensajes: 173
|
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). $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.phpSi queres obtener mas de una fila podes utilizar fetchall() http://www.php.net/manual/es/pdostatement.fetchall.phpCreo que asi es... sino corrijanme vengo muy insolado por el sol. 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).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.
|
|
|
En línea
|
|
|
|
:ohk<any>
Desconectado
Mensajes: 1.744
Yo lo que quiero que me salga bien es la vida.
|
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.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
On Error GoTo NEXT
Programación Visual Basic
|
Scratz
|
3
|
3,304
|
23 Agosto 2007, 05:12 am
por ActiveSheet
|
|
|
On error goto loquesea
Programación Visual Basic
|
papanoel_devacaciones
|
4
|
2,124
|
17 Septiembre 2007, 05:29 am
por Deeo Raiser
|
|
|
Goto en javascript?
Scripting
|
Leber
|
0
|
5,535
|
9 Octubre 2007, 17:03 pm
por Leber
|
|
|
For mas rapido que goto en bucles
Scripting
|
kraszic
|
0
|
2,194
|
29 Diciembre 2008, 00:04 am
por kraszic
|
|
|
¿Por qué GoTo es malo?
Programación Visual Basic
|
martin_poipon
|
4
|
4,214
|
12 Junio 2011, 20:37 pm
por martin_poipon
|
|