Comunidad PHPeros
Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: Focux en 09 de Agosto de 2010, 21:30:44 pm
-
Bueno pondre algunos tutoriales sobre como usar mysqli, antes de comenzar a aprendeer mysqli deberiamos por lo menos saber lo basico de POO. Ahora vamos a aprender como conectarnos a la base de datos.
Los datos de la conexion los debemos poner al inicializar el objeto, veamos el siguiente ejemplo que explica como colocar los datos.
<?PHP
$conexion = new mysqli('host','usuario','contraseña','bd');
if(!$conexion) printf("Fallo al conectar con la base de datos: %s", mysqli_connect_error()); #En caso de haber algun fallo en la conexion mostrara el error.
?>
Algo que me gusta de mysqli es que podemos separar los errores de conexion & de consultas, aqui ya tenemos nuestra primera conexion, ire colocando mas tutoriales sobre este tema.
Luego de haber aprendido a conectarnos a la base de datos lo que sigue es aprender a seleccionar & mostrar los datos. Para hacer lo anterior primero debemos seleccionar los datos con la funcion query de la clase mysqli & luego mostrarlos con la funcion fetch_array dependiendo del tipo que queramos.
A la funcion fetch_array le podemos especificar como queremos el array, puede ser asociativo (MYSQLI_ASSOC), numerico (MYSQLI_NUM) o de los dos tipos (MYSQLI_BOTH). Ahora vamos a ver como se veria nuestro codigo.
<?PHP
/* Conexion */
$conexion = new mysqli('host','usuario','contraseña','bd');
if(!$conexion){
printf("Fallo al conectar con la base de datos: %s", mysqli_connect_error());
} else {
$consulta = $conexion->query("SELECT id FROM algo ORDER BY id DESC");
$resultado = $consulta->fetch_array(MYSQLI_ASSOC);
printf("Hola %s", $resultado['nombre']); # No es que tengan que usar siempre printf, yo lo uso porque es mas comodo para mi, pueden usar echos
/* Liberamos & cerramos la conexion */
$consulta->close();
$conexion->close();
}
?>
-
Me parece una chorrada como una casa..... pero para gustos, los colores sin animo de ofender por tu tutorial.
-
Chorrada?, que no lo sepas manejar no significa que sea chorrada, te aseguro que supera a mysql en mucho, ademas de que la mayoria de personas programan orientado a objetos que seria mucho mas facil para los programadores, como quiera seguire p*****ndo tutoriales de las cientas de funciones que posee la misma.
-
Me parece estúpido que se cree un objeto para una query y que esta tenga que cerrarse con close()... es raro que sea asi
-
me parece que no esta mal para los que quieran aprender la funcion pero yo personalemente no tengo intencion de meterme en serio con POO ahora mismo y con query a secas me va genial así que si eso lo dejo para dentro de un tiempo xP a parte que query es mas simple y para los códigos que hago de momento no me importa que sea 0,05 segundos mas lenta xP aun así buen tuto se entiende bien ;) y puede ser bastante útil para algunos.
-
Me parece estúpido que se cree un objeto para una query y que esta tenga que cerrarse con close()... es raro que sea asi
Solo si lo quieres tener orientado a objetos porque tambien lo puedes usar normal como funcion, con respecto a lo otro, explique en un post anterior que se pueden hacer mas de 1 consulta separandose por punto y coma(;), si lo que te molesta es inicializar una clase en cada archivo lo idoneo seria esterilizarla.
me parece que no esta mal para los que quieran aprender la funcion pero yo personalemente no tengo intencion de meterme en serio con POO ahora mismo y con query a secas me va genial así que si eso lo dejo para dentro de un tiempo xP a parte que query es mas simple y para los códigos que hago de momento no me importa que sea 0,05 segundos mas lenta xP aun así buen tuto se entiende bien ;) y puede ser bastante útil para algunos.
Gracias.
-
Me parece estúpido que se cree un objeto para una query y que esta tenga que cerrarse con close()... es raro que sea asi
Lo cierto es que es así como se hace, en PHP y en todos los lenguajes de programación.
Todo debe liberarse de la memoria y todas las conexiones deben ser cerradas.
Y lo de los objetos, Focux esta en lo cierto, la mayoria de los códigos están orientados a objetos, y tener mysql orientado a objetos es un buen avance.
Quizás para algunos de ustedes no os sirva ni notéis mucho el cambio, porque para lo que nosotros hacemos lo mismo nos da llamar una función que instanciar un objeto.
Yo personalmente prefiero instanciar, pero bueno, cuestión de gustos.
Saludos!
-
Yo personalmente les recomiendo muchísimo adentrarse a la Programación Orientada a Objetos. Cuando ustedes iniciaron en PHP, ¿se detuvieron a aprender cosas nuevas? Lo dudo... Pero ahora veo que muchos se detienen porque lo ven muy complicado. Chicos, aquí nada es complicado siempre y cuando le metas interés y dedicación. POO facilita la programación, sobre todo promueve la reutilización de códigos y me parece genial un MySQL OO, así que creo que aprenderé de ahí ya que nunca me dió tiempo para profundizar en el MySQL.
-
Yo personalmente les recomiendo muchísimo adentrarse a la Programación Orientada a Objetos. Cuando ustedes iniciaron en PHP, ¿se detuvieron a aprender cosas nuevas? Lo dudo... Pero ahora veo que muchos se detienen porque lo ven muy complicado. Chicos, aquí nada es complicado siempre y cuando le metas interés y dedicación. POO facilita la programación, sobre todo promueve la reutilización de códigos y me parece genial un MySQL OO, así que creo que aprenderé de ahí ya que nunca me dió tiempo para profundizar en el MySQL.
Karma +, realmente debemos adentrarnos al cambio, llegara un momento de que todo sera orientado a objetos & por lo menos a mi no me gustaria quedarme atras.
-
Siendo sinceros. de hoy en dia, configurando el MySQL bien, con el tunner, y dejando las KeepAlive Off, todo está solucionado. Si es por ahorrar recursos.. dejadlo, no sirve ya ;) Es totalmente inutil. a un i7 de 8G le da igual que sea mysql que mysqli siempre y cuando este bien configurado.
Saludos.
-
Siendo sinceros. de hoy en dia, configurando el MySQL bien, con el tunner, y dejando las KeepAlive Off, todo está solucionado. Si es por ahorrar recursos.. dejadlo, no sirve ya ;) Es totalmente inutil. a un i7 de 8G le da igual que sea mysql que mysqli siempre y cuando este bien configurado.
Saludos.
Claro, y tú como programador te quedarás atrás por no querer aprender algo nuevo. Un programador jamás deja de aprender y me sorprende que un programador tenga la actitud de "no, no quiero aprender esa cosa nueva, prefiero la vieja", cuando saben en realidad como son las cosas aquí...
-
Claro, y tú como programador te quedarás atrás por no querer aprender algo nuevo. Un programador jamás deja de aprender y me sorprende que un programador tenga la actitud de "no, no quiero aprender esa cosa nueva, prefiero la vieja", cuando saben en realidad como son las cosas aquí...
Mira shikillo..
Atrás no me he quedado, pero hay OTRAS cosas por aprender que son más importantes.. y no he dicho que no lo aprenda, yo sé nene... yo sé como funciona.. y no tengo actitud, mi actitud es la que venis aquí, vais al quiosco, o como mucho al FNAC, os compraís:
"Como ser programador PHP en 100 páginas"
Y ya os creeis los reyes del mundo.. y la evolución del web.
Saludos..
-
Buenas,
Buen tutorial a la hora de explicar.
Entre la "discusión" entre Nadeu y Physlet, ambos lleváis razón es importante usar la programación orientada a objetos (en adelante, POO) pero tampoco dejar atrás la opinión de que una base de datos (en adelante, BBDD) bien configurada puede resultar igual de efectiva que usando una MySQLi para aplicaciones/programaciones POO.
Para mí esto es un debate de cuestión de gustos... y como dice aquel refrán, "Para gustos, los colores."
Yo en principio, para mi gusto, seguiré con el antiguo "mysql_" (Libreria MySQL) pero sin dejar atrás las nuevas actualizaciones a la hora de programar como es este 'novedoso' POO.
"Nunca hay que dejar de saber, pero nunca usar lo inservible."
Un abrazo ! :)
-
Es que no puedes comparar mysqli con mysql, primero mysqli tiene mucha más seguridad, segundo muchas más funciones que mysql tambien puedes hacer tu propias funciones en base a las otras.
-
Mira shikillo..
Atrás no me he quedado, pero hay OTRAS cosas por aprender que son más importantes.. y no he dicho que no lo aprenda, yo sé nene... yo sé como funciona.. y no tengo actitud, mi actitud es la que venis aquí, vais al quiosco, o como mucho al FNAC, os compraís:
"Como ser programador PHP en 100 páginas"
Y ya os creeis los reyes del mundo.. y la evolución del web.
Saludos..
Te vas controlando que aquí vemos que poca actitud tienes con respecto a estos temas.
Lamento mucho que no tengas la suficiente capacidad de raciocinio para poder decodificar un mensaje tan simple.
Yo me baso en la experiencia para estas cosas, en la experimentación. Que tu vengas a decir que el MySQLi no es necesario aprenderlo porque te mola mas el MySQL (ya que es lo que conoces y no te interesa enfrentar contra laog nuevo), es tu punto de vista, hay que defenderlo claro está, pero siempre en el marco del respeto, te recuerdo.
Yo te puedo asegurar que de PHP y programación no sé ni la 8va parte que el 90% de los de aquí, pero las cosas que digo no las comento solo por comentar, las comento porque ya las he experimentado.
Y comienza partiendo del principio "una nunca deja de aprender".
-
Es que no puedes comparar mysqli con mysql, primero mysqli tiene mucha más seguridad, segundo muchas más funciones que mysql tambien puedes hacer tu propias funciones en base a las otras.
Focux todo es comparable en esta vida...
MySQLi más seguridad? no tiene por qué exactamente, la seguridad se basa en la programación y configuración de cada desarrollo... eso es lo que suele diferenciar a un buen programador de uno malo (aparte esta estructuración, optimización de codigo, etcétera.)
Muchas más funciones que MySQL... no soy consciente de la cantidad , y tampoco del nombre, de esas funciones que no hay en MySQL... porque en el fondo es lenguaje SQL con el que obtenemos cada información según la orden que le inyectemos a la consulta.
Y para acabar lo que has dicho por último no tiene nada que ver con el tema debido a que todas las funciones complementan a otras y así sucesivamente, porque cuando nos vamos a crear nuestras propias funciones usamos diferentes funciones unidas para obtener el resultado que queremos, por lo tanto, tanto con MySQL y MySQLi podríamos hacer funciones en base a otras (en eso se basa la programación, en tener un mínimo y apartir de ese mínimo construir un máximo).
Un abrazo.
-
Lo primero, la seguridad no siempre tiene que ver con el programador para comprobarlo busca hacerca del Prepared statements de mysqli.
Con respecto a lo segundo, como dices, en el fondo es sql pero hay librerias que no lo aprovechan al maximo, como dicen por ahi, que no saben sacarle todo el jugo.
Por ultimo, lo de hacer tus propias funciones si tiene que ver, esa es una ventaja que nos trae no sólo mysqli sino POO en general, leete un poco sobre heredar de poo.
-
Lo primero, la seguridad no siempre tiene que ver con el programador para comprobarlo busca hacerca del Prepared statements de mysqli.
Con respecto a lo segundo, como dices, en el fondo es sql pero hay librerias que no lo aprovechan al maximo, como dicen por ahi, que no saben sacarle todo el jugo.
Por ultimo, lo de hacer tus propias funciones si tiene que ver, esa es una ventaja que nos trae no sólo mysqli sino POO en general, leete un poco sobre heredar de poo.
Acabo de leer acerca de "Prepared statements" y tan solo dicen que es más seguro frente a SQL Injection, si tu lo programas bien, no te podrían hacer SQLi, por lo que claramente, no me parece un buen motivo.
¿Qué es lo que se puede hacer frente a una DDBB MySQL?
-------------------
Crear db (CREATE)
Crear tabla (CREATE)
Eliminar db (DROP)
Eliminar tabla (DROP)
Alterar la tabla (ALTER)
Limpiarla (TRUNCATE)
Insertar fila (INSERT)
Eliminar fila (DELETE)
Actualizar/Editar fila (SET)
...
Eso en base a SQL.
Funciones de la libreria MySQL:
o mysql_affected_rows — Obtiene el número de filas afectadas en la anterior operación de MySQL
o mysql_client_encoding — Devuelve el nombre de la colección de caracteres
o mysql_close — Cierra la conexión de MySQL
o mysql_connect — Abre una conexión al servidor MySQL
o mysql_create_db — Crea una base de datos MySQL
o mysql_data_seek — Mueve el apuntador interno del resultado
o mysql_db_name — Obtiene los datos del resultado
o mysql_db_query — Envía una consulta MySQL
o mysql_drop_db — Omite (elimina) una base de datos MySQL
o mysql_errno — Devuelve un mensaje de error con un valor numérico de la operación anterior con MySQL
o mysql_error — Devuelve el texto con error del mensaje de la anterior operación MySQL
o mysql_escape_string — Escapes a string for use in a mysql_query
o mysql_fetch_array — Fetch a result row as an associative array, a numeric array, or both
o mysql_fetch_assoc — Recupera una fila de resultado como un array asociativo
o mysql_fetch_field — Get column information from a result and return as an object
o mysql_fetch_lengths — Get the length of each output in a result
o mysql_fetch_object — Fetch a result row as an object
o mysql_fetch_row — Get a result row as an enumerated array
o mysql_field_flags — Get the flags associated with the specified field in a result
o mysql_field_len — Returns the length of the specified field
o mysql_field_name — Get the name of the specified field in a result
o mysql_field_seek — Set result pointer to a specified field offset
o mysql_field_table — Get name of the table the specified field is in
o mysql_field_type — Get the type of the specified field in a result
o mysql_free_result — Free result memory
o mysql_get_client_info — Obtener información del cliente MySQL
o mysql_get_host_info — Obtener información de la máquina anfitriona MySQL
o mysql_get_proto_info — Obtener información del protocolo MySQL
o mysql_get_server_info — Obtener información del servidor MySQL
o mysql_info — Obtiene información sobre la consulta más reciente
o mysql_insert_id — Get the ID generated in the last query
o mysql_list_dbs — List databases available on a MySQL server
o mysql_list_fields — List MySQL table fields
o mysql_list_processes — Lista los procesos MySQL
o mysql_list_tables — Lista las tablas de una base de datos MySQL
o mysql_num_fields — Get number of fields in result
o mysql_num_rows — Get number of rows in result
o mysql_pconnect — Open a persistent connection to a MySQL server
o mysql_ping — Efectuar un chequeo de respuesta (ping) sobre una conexión de servidor o reconectarse si no hay conexión
o mysql_query — Send a MySQL query
o mysql_real_escape_string — Escapes special characters in a string for use in an SQL statement
o mysql_result — Get result data
o mysql_select_db — Select a MySQL database
o mysql_set_charset — Sets the client character set
o mysql_stat — Obtiene el status actual del sistema
o mysql_tablename — Get table name of field
o mysql_thread_id — Devuelve el ID del hilo actual
o mysql_unbuffered_query — Envía una consulta SQL a MySQL, sin recuperar ni colocar en búfer las filas de resultado
[ sacado de php.net # http://es2.php.net/manual/es/book.mysql.php ]
Aparte de poder hacer todo por el query, ya vienen funciones predefinidas en la librería para cambiar lo que quieras de la base de datos.
Funciones MySQLi
* mysqli->affected_rows — Gets the number of affected rows in a previous MySQL operation
* mysqli::autocommit — Turns on or off auto-commiting database modifications
* mysqli::change_user — Changes the user of the specified database connection
* mysqli::character_set_name — Returns the default character set for the database connection
* mysqli->client_info — Returns the MySQL client version as a string
* mysqli->client_version — Get MySQL client info
* mysqli::close — Closes a previously o*****d database connection
* mysqli::commit — Commits the current transaction
* mysqli->connect_errno — Returns the error code from last connect call
* mysqli->connect_error — Returns a string description of the last connect error
* mysqli::__construct — Open a new connection to the MySQL server
* mysqli::debug — Performs debugging operations
* mysqli::dump_debug_info — Dump debugging information into the log
* mysqli->errno — Returns the error code for the most recent function call
* mysqli->error — Returns a string description of the last error
* mysqli->field_count — Returns the number of columns for the most recent query
* mysqli::get_charset — Returns a character set object
* mysqli->get_client_info — Returns the MySQL client version as a string
* mysqli->client_version — Get MySQL client info
* mysqli::get_connection_stats — Returns statistics about the client connection
* mysqli->host_info — Returns a string representing the type of connection used
* mysqli->protocol_version — Returns the version of the MySQL protocol used
* mysqli->server_info — Returns the version of the MySQL server
* mysqli->server_version — Returns the version of the MySQL server as an integer
* mysqli::get_warnings — Get result of SHOW WARNINGS
* mysqli->info — Retrieves information about the most recently executed query
* mysqli::init — Initializes MySQLi and returns a resource for use with mysqli_real_connect()
* mysqli->insert_id — Returns the auto generated id used in the last query
* mysqli::kill — Asks the server to kill a MySQL thread
* mysqli::more_results — Check if there are any more query results from a multi query
* mysqli::multi_query — Performs a query on the database
* mysqli::next_result — Prepare next result from multi_query
* mysqli::options — Set options
* mysqli::ping — Pings a server connection, or tries to reconnect if the connection has gone down
* mysqli::poll — Poll connections
* mysqli::prepare — Prepare an SQL statement for execution
* mysqli::query — Performs a query on the database
* mysqli::real_connect — Opens a connection to a mysql server
* mysqli::real_escape_string — Escapes special characters in a string for use in an SQL statement, taking into account the current charset of the connection
* mysqli::real_query — Execute an SQL query
* mysqli::reap_async_query — Get result from async query
* mysqli::rollback — Rolls back current transaction
* mysqli::select_db — Selects the default database for database queries
* mysqli::set_charset — Sets the default client character set
* mysqli::set_local_infile_default — Unsets user defined handler for load local infile command
* mysqli::set_local_infile_handler — Set callback function for LOAD DATA LOCAL INFILE command
* mysqli->sqlstate — Returns the SQLSTATE error from previous MySQL operation
* mysqli::ssl_set — Used for establishing secure connections using SSL
* mysqli::stat — Gets the current system status
* mysqli::stmt_init — Initializes a statement and returns an object for use with mysqli_stmt_prepare
* mysqli::store_result — Transfers a result set from the last query
* mysqli->thread_id — Returns the thread ID for the current connection
* mysqli::thread_safe — Returns whether thread safety is given or not
* mysqli::use_result — Initiate a result set retrieval
* mysqli->warning_count — Returns the number of warnings from the last query for the given link
[ sacado tambien de php.net # http://es2.php.net/manual/es/book.mysqli.php ]
Básicamente las mismas funciones, sí MySQLi tiene más, pero porque necesita más... porque para mostrar un error de conexión necesita mysqli->connect_errno()(numero) o mysqli->connect_error()(nombre del error).
Cosas que con 'mysql_' tan solo te haría falta mysql_error().
Para mí la simple diferencia entre una y otro esque una es una librería a funciones y la otra es una librería a clases.
Y por ultimo... claro que es la ventaja de POO pero entonces ahora hablamos de POO... no de MySQLi... porque a que con POO se puede usar también la librería mysql?
Por supuesto !
¿Entonces?
Ahí está la cosa que como ya he dicho la diferencia entre MySQL y MySQLi es el simple hecho de función o clase ?
Cuestión de gustos ! jejej
Un abrazo :)
-
Mysqli nos ayuda a ser mucho más organizado, comenzando por la muestra de errores, a quien no le gustaría separar los errores de conexión de los errores de consultas, creo que a todos nos gustaría eso, a quien no le gustaría más seguridad contra las Injecciones SQL, a quien no le gustaria tener la ventaja de ejecutar varias querys separadas por punto y coma, en una conexión, a quien no le gustaría tener más rendimiento, a quien no le gustaría personalizar las funciones agregandole ajustes a nuestro gusto, son muchas cosas que nos trae mysqli, porque no sólo es POO, porque tambien para los que no programan orientado a objetos la pueden usar mediante funciones.
-
Buenas,
Lo de los errores... da igual tenerlos separados o al menos me da igual a mí porque cuando hay un error de conexión se bloquea toda la aplicación y si no, me muestra el error de la sentencia SQL.
Seguridad contra los ataques de SQLi, con librerias MySQL también lo puede solucionar.
Lo de las QUERYS Múltiples es el único beneficio que le veo.
Y claro que no es solo POO, sino que se basa en su funcionamiento y por supuesto que lo pueden usar la gente con programación "clásica" y no orientado a objetos !
-
No es cuestión solo de comodidad FeDe.
Es cuestión de versiones.
MySQLi esta diseñado para bases de datos con versiones superiores o iguales a la 4.1, y MySQL solo no.
Ya lo dice la web de PHP.net, donde te recomiendan (varias veces) que uses MySQLi si tu DB es mayor a esa versión.
http://www.php.net/manual/en/mysqli.overview.php
En esa página también puedes ver las ventajas de una sobre la otra.
Saludos!
-
La MySQL lib se puede usar BAJO cualquier versión de PHP.. solo que necesitas los repos adecuados y los paquetes..
Si hablo, no es por hablar..
Ah y si que se como va MySQLi, he programado con ella, con las dos... Pero digo que si alguien se tiene que tirar tiempo aprendiendo como funciona MySQLi sabiendo MySQL que no lo haga, que es lo mismo casi.. En seguridad, activa el SQL Safe Mode y verás como no te pasa nada chavalin..
Que no, que no voy con chuleria.. eres tu que me chincha..
Saludos.
-
La MySQL lib se puede usar BAJO cualquier versión de PHP.. solo que necesitas los repos adecuados y los paquetes..
Si hablo, no es por hablar..
Ah y si que se como va MySQLi, he programado con ella, con las dos... Pero digo que si alguien se tiene que tirar tiempo aprendiendo como funciona MySQLi sabiendo MySQL que no lo haga, que es lo mismo casi.. En seguridad, activa el SQL Safe Mode y verás como no te pasa nada chavalin..
Que no, que no voy con chuleria.. eres tu que me chincha..
Saludos.
Te has molestado acaso en leer el link que dejó TLX?
-
Te has molestado acaso en leer el link que dejó TLX?
No, parece que no.
La MySQL lib se puede usar BAJO cualquier versión de PHP.. solo que necesitas los repos adecuados y los paquetes..
Si hablo, no es por hablar..
Ah y si que se como va MySQLi, he programado con ella, con las dos... Pero digo que si alguien se tiene que tirar tiempo aprendiendo como funciona MySQLi sabiendo MySQL que no lo haga, que es lo mismo casi.. En seguridad, activa el SQL Safe Mode y verás como no te pasa nada chavalin..
Que no, que no voy con chuleria.. eres tu que me chincha..
Saludos.
Dudo que a alguien que ya conoce el lenguaje SQL le cueste mucho trabajo pasar de MySQL a MySQLi para PHP, porque son exactamente iguales, simplemente cambias las funciones por métodos de clases. No es aprender un lenguaje desde el principio, simplemente se trata de usar un método diferente, pero en esencia es lo mismo.
Te invito a leer el link que dejé mas arriba, porque con MySQLi no solo se gana seguridad y demás (que tambien está muy bien) sino que accedes a carácteristicas de las bases de datos con versiones superiores a la 4.3.1 que la extensión MySQL no te puede ofrecer, porque no esta diseñada para ello.
Saludos!
-
Hola, vine a aprender. Me parecio muy interesante esto de MySQLi, lo habia visto por ahi pero no le habia prestado atención hasta que vi este foro. Me gusto el primer tuto.. no encuentro el resto je... :-[ (ya se, doy asco) donde los puedo encontre (ya probe con el buscador y no me da bola). Gracias che.