Este documento explica el acceso a bases de datos MySQL y SQLite mediante PDO en PHP. Describe cómo conectarse a cada base de datos, realizar consultas y asegurar la seguridad mediante consultas preparadas.
0 calificaciones0% encontró este documento útil (0 votos)
60 vistas18 páginas
Este documento explica el acceso a bases de datos MySQL y SQLite mediante PDO en PHP. Describe cómo conectarse a cada base de datos, realizar consultas y asegurar la seguridad mediante consultas preparadas.
Este documento explica el acceso a bases de datos MySQL y SQLite mediante PDO en PHP. Describe cómo conectarse a cada base de datos, realizar consultas y asegurar la seguridad mediante consultas preparadas.
Este documento explica el acceso a bases de datos MySQL y SQLite mediante PDO en PHP. Describe cómo conectarse a cada base de datos, realizar consultas y asegurar la seguridad mediante consultas preparadas.
Descargue como PDF, TXT o lea en línea desde Scribd
Descargar como pdf o txt
Está en la página 1de 18
PHP Data Objects (PDO)
La extensin PDO (PHP Data Objects) permite acceder a distintas
bases de datos utilizando las misma funciones, lo que facilita la portabilidad. n PHP ! existen dri"ers para acceder a las bases de datos m#s populares ($%&'L, Oracle, $& &'L &er"er, Post(re&'L, &'Lite, )irebird, D*+, ,nformix, etc). n esta leccin se explica el acceso a $%&'L % &'Lite mediante PDO. La extensin PDO no e"al-a la correcin de las consultas &'L. .onexin con la base de datos .onexin con $%&'L .onexin con &'Lite / .onexin confi(urable Desconexin con la base de datos .onsultas a la base de datos &e(uridad en las consultas0 consultas preparadas .onsultas preparadas 1estricciones en los par#metros de consultas preparadas jemplos de consultas 1ecortar los datos .onsultas .123 D232*2&, D1OP D232*2& .onsultas .123 32*L, D1OP 32*L, ,4&13 ,43O, 5PD23, DL3 )1O$ .onsulta &L.3 Conexin con la base de datos Para conectar con la base de datos 6a% que crear una instancia de la clase PDO, que se utiliza en todas las consultas posteriores. n cada p#(ina p6p que inclu%a consultas a la base de datos es necesario conectar primero con la base de datos. &i no se puede establecer la conexin con la base de datos, puede deberse a que la base de datos no est7 funcionando, a que los datos de usuario no sean correctos, a que no est7 acti"ada la extensin pdo o (en el caso de &'Lite) que no exista el camino donde se (uarda la base de datos. Conexin con MySQL n el caso de $%&'L, la creacin de la clase PDO inclu%e el nombre del ser"idor, el nombre de usuario % la contrase8a. Para poder acceder a $%&'L mediante PDO, debe estar acti"ada la extensin p6p9pdo9m%sql en el arc6i"o de confi(uracin p6p.ini ("7ase el apartado extensin pdo9m%sql en la leccin de confi(uracin de 2pac6e % PHP). // FUNC!N D" CON"#!N CON L$ %$S" D" D$&OS M'SQL ()nction conectaDb() * t+y * ,db - ne. PDO(/0ys1l23ost-local3ost/4 /+oot/4 //)5 ,db67set$tt+ib)te(PDO22M'SQL8$&&98US"8%UFF"9"D8QU"9'4 t+)e)5 +et)+n(,db)5 : catc3 (PDO"xce;tion ,e) * cabece+a(/"++o+ <+a=e/)5 ;+int />;7"++o+2 No ;)ede conecta+se con la base de datos?>/;7@n/5 // ;+int />;7"++o+2 / ? ,e67<etMessa<e() ? />/;7@n/5 ;ie()5 exit()5 : : // "A"MPLO D" USO D" L$ FUNC!N $N&"9O9 // La conexin se debe +ealiBa+ en cada ;C<ina 1)e acceda a la base de datos ,db - conectaD%()5 Conexin con SQLite D n &'Lite, no se 6ace una conexin a un ser"idor, sino que simplemente se indica el arc6i"o que "a a contener la base de datos. n &'Lite no 6a% un ser"idor que (estiona todas las bases de datos, sino que cada base de datos es un arc6i"o independiente (que debe estar situado en un directorio que exista % en el que el ser"idor :eb ten(a permisos de escritura). Para poder utilizar &'Lite mediante PDO, debe estar acti"ada la extensin p6p9pdo9sqlite en el arc6i"o de confi(uracin p6p.ini ("7ase el apartado extensin pdo9sqlite en la leccin de confi(uracin de 2pac6e % PHP). // FUNC!N D" CON"#!N CON L$ %$S" D" D$&OS SQL&" ()nction conectaDb() * t+y * ,db - ne. PDO(/s1lite2/t0;/0clib+e8baseDeDatos?s1lite/)5 +et)+n(,db)5 : catc3 (PDO"xce;tion ,e) * cabece+a(/"++o+ <+a=e/)5 ;+int />;7"++o+2 No ;)ede conecta+se con la base de datos?>/;7@n/5 // ;+int />;7"++o+2 / ? ,e67<etMessa<e() ? />/;7@n/5 ;ie()5 exit()5 : : // "A"MPLO D" USO D" L$ FUNC!N $N&"9O9 // La conexin se debe +ealiBa+ en cada ;C<ina 1)e acceda a la base de datos ,db - conectaD%()5 4ota0 n las soluciones de los ejercicios proporcionadas en estos apuntes, los arc6i"os se (uardan en el directorio ;tmp;mclibre. &e debe crear ese directorio para que funcione las soluciones o cambiarlo a otro. Conexin con(i<)+able &i se inclu%en ambas conexiones en el mismo pro(rama, cada usuario puede ele(ir la base de datos m#s con"eniente en cada caso. n el ejemplo si(uiente, bastar<a cambiar el "alor de la "ariable =db$otor para cambiar la base de datos utilizada. // FUNC!N D" CON"#!N CON L$ %$S" D" D$&OS M'SQL O CON SQL&" de(ine (/M'SQL/4 /MySQL/)5 de(ine (/SQL&"/4 /SQLite/)5 ,dbMoto+ - SQL&"5 // %ase de datos e0;leada i( (,dbMoto+ -- M'SQL) * de(ine(/M'SQL8HOS&/4 /0ys1l23ost-local3ost/)5 // No0b+e de 3ost M'SQL de(ine(/M'SQL8USU$9O/4 /+oot/)5 // No0b+e de )s)a+io de MySQL de(ine(/M'SQL8P$SSEO9D/4 //)5 // Cont+aseFa de )s)a+io de MySQL ,dbDb - /0clib+e8baseDeDatos/5 // No0b+e de la base de datos ,db&abla - ,dbDb ? /?tabla/5 // No0b+e de la tabla : elsei( (,dbMoto+ -- SQL&") * ,dbDb - //t0;/0clib+e8baseDeDatos?s1lite/5 // No0b+e de la base de datos ,db&abla - /tabla/5 // No0b+e de la tabla : ()nction conectaDb() * <lobal ,dbMoto+4 ,dbDb5
t+y * i( (,dbMoto+ -- M'SQL) * ,db - ne. PDO(M'SQL8HOS&4 M'SQL8USU$9O4 M'SQL8P$SSEO9D)5 ,db67set$tt+ib)te(PDO22M'SQL8$&&98US"8%UFF"9"D8QU"9'4 t+)e)5 : elsei( (,dbMoto+ -- SQL&") * ,db - ne. PDO(/s1lite2/ ? ,dbDb)5 : +et)+n(,db)5 : catc3 (PDO"xce;tion ,e) * cabece+a(/"++o+ <+a=e/)5 ;+int />;7"++o+2 No ;)ede conecta+se con la base de datos?>/;7@n/5 // ;+int />;7"++o+2 / ? ,e67<etMessa<e() ? />/;7@n/5 ;ie()5 exit()5 : : // "A"MPLO D" USO D" L$ FUNC!N $N&"9O9 // La conexin se debe +ealiBa+ en cada ;C<ina 1)e acceda a la base de datos ,db - conectaD%()5 Desconexin con la base de datos Para desconectar con la base de datos 6a% que destruir el objeto PDO. &i no se destru%e el objeto PDO, PHP lo destru%e al terminar la p#(ina. ,db - n)ll5 >ol"er al principio de la p#(ina Cons)ltas a la base de datos 5na "ez realizada la conexin a la base de datos, las operaciones se realizan a tra"7s de consultas. l m7todo para efectuar consultas es PDO->query($consulta), que de"uel"e el resultado de la consulta. Dependiendo del tipo de consulta, el dato de"uelto debe tratarse de formas distintas. &i es una consulta que no de"uel"e re(istros, sino que simplemente realiza una accin que puede tener 7xito o no (por ejemplo, insertar un re(istro), el m7todo de"uel"e true o false. 4o es necesario (uardar el resultado de la consulta en nin(una "ariable, pero se puede utilizar para sacar un mensaje diciendo que todo 6a ido bien (o no). Por ejemplo, // "A"MPLO D" CONSUL&$ D" NS"9C!N D" 9"GS&9O ,db - conectaDb()5 ,cons)lta - /NS"9& N&O ,db&abla (no0b+e4 a;ellidos) H$LU"S (/,no0b+e/4 /,a;ellidos/)/5 i( (,db671)e+y(,cons)lta)) * ;+int />;79e<ist+o c+eado co++ecta0ente?>/;7@n/5 : else * ;+int />;7"++o+ al c+ea+ el +e<ist+o?>;7@n/5 : ,db - n)ll5 Pero si la consulta de"uel"e re(istros, el m7todo de"uel"e los re(istros correspondientes o false. n ese caso s< que es con"eniente (uardar lo que de"uel"e el m7todo en una "ariable para procesarla posteriormente. &i contiene re(istros, la "ariable es de un tipo especial llamado recurso que no se puede acceder directamente, pero que se puede recorrer con un bucle foreach(), // "A"MPLO D" CONSUL&$ D" S"L"CC!N D" 9"GS&9O,db - conectaDb()5 ,cons)lta - /S"L"C& I F9OM ,db&abla/5 ,+es)lt - ,db671)e+y(,cons)lta)5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 : else * (o+eac3 (,+es)lt as ,=alo+) * ;+int />;7,=alo+Kno0b+eL ,=alo+Ka;ellidosL>/;7@n/5 : : n los ejemplos, la consulta se realiza en dos l<neas, pero podr<a estar en una sola0 // "n dos lMneas ,cons)lta - /S"L"C& I F9OM ,db&abla/5 ,+es)lt - ,db671)e+y(,cons)lta)5 // "n )na sola lMnea ,+es)lt - ,db671)e+y(/S"L"C& I F9OM ,db&abla/)5 4o 6a% moti"o para preferir la primera "ersin, sal"o que se quiera imprimir la consulta mientras se est# pro(ramando para comprobar que no tiene errores0 ,cons)lta - /S"L"C& I F9OM ,db&abla/5 ;+int />;7Cons)lta2 ,cons)lta>/;7@n/5 ,+es)lt - ,db671)e+y(,cons)lta)5 >ol"er al principio de la p#(ina Se<)+idad en las cons)ltas2 cons)ltas ;+e;a+adas Para e"itar ataques de in%eccin &'L (en la leccin ,n%ecciones &'L se comentan los ataques m#s elementales), se recomienda el uso de sentencias preparadas, en las que PHP se encar(a de ?desinfectar? los datos en caso necesario. Cons)ltas ;+e;a+adas l m7todo para efectuar consultas es primero preparar la consulta con PDO->prepare($consulta) % despu7s ejecutarla con PDO- >execute(array(parmetros)), que de"uel"e el resultado de la consulta. Dependiendo del tipo de consulta, el dato de"uelto debe tratarse de formas distintas, como se 6a explicado en el apartado anterior. l si(uiente ejemplo muestra cmo se realizar<a una consulta (en tres l<neas o en dos)0 // "n t+es lMneas ,cons)lta - /S"L"C& I F9OM ,db&abla/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 ,+es)lt67exec)te()5 // "n dos lMneas ,+es)lt - ,db67;+e;a+e(/S"L"C& I F9OM ,db&abla/)5 ,+es)lt67exec)te()5 4o 6a% moti"o para preferir la primera "ersin, sal"o que se quiera imprimir la consulta mientras se est# pro(ramando para comprobar que no tiene errores ,cons)lta - /S"L"C& I F9OM ,db&abla/5 ;+int />;7Cons)lta2 ,cons)lta>/;7/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 ,+es)lt67exec)te()5 &i la consulta inclu%e datos introducidos por el usuario, los datos pueden incluirse directamente en la consulta, pero en ese caso, PHP no realiza nin(una ?desinfeccin? de los datos, por lo que estar<amos corriendo ries(os de ataques0 ,no0b+e - ,89"QU"S&K/no0b+e/L5 ,cons)lta - /S"L"C& COUN&(I) F9OM ,db&abla EH"9" no0b+e-,no0b+e // D"S$CONS"A$DO2 PHP NO D"SNF"C&$ LOS D$&OS $ND a;ellidos-,a;ellidos/5 // D"S$CONS"A$DO2 PHP NO D"SNF"C&$ LOS D$&OS ,+es)lt - ,db67;+e;a+e(,cons)lta)5 ,+es)lt67exec)te()5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 ??? Para que PHP desinfecte los datos, estos deben en"iarse al ejecutar la consulta, no al prepararla. Para ello es necesario indicar en la consulta la posicin de los datos. sto se puede 6acer0 mediantes interro(antes (@) n este caso la matriz debe incluir los "alores que sustitu%en a los interro(antes en el mismo orden en que aparecen en la consulta, como muestra el si(uiente ejemplo0 ,no0b+e - ,89"QU"S&K/no0b+e/L5 ,a;ellidos - ,89"QU"S&K/a;ellidos/L5 ,cons)lta - /S"L"C& COUN&(I) F9OM ,db&abla EH"9" no0b+e-N $ND a;ellidos-N/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 ,+es)lt67exec)te(a++ay(,no0b+e4 ,a;ellidos))5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 ??? mediante par#metros (0parametro) n este caso la matriz debe incluir los nombres de los par#metros % los "alores que sustitu%en a los par#metros (el orden no es importante), como muestra el si(uiente ejemplo0 ,no0b+e - ,89"QU"S&K/no0b+e/L5 ,a;ellidos - ,89"QU"S&K/a;ellidos/L5 ,cons)lta - /S"L"C& COUN&(I) F9OM ,db&abla EH"9" no0b+e-2no0b+e $ND a;ellidos-2a;ellidos/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 ,+es)lt67exec)te(a++ay(/2no0b+e/ -7 ,no0b+e4 /2a;ellidos/ -7 ,a;ellidos))5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 ??? &e aconseja el uso de par#metros, %a que reduce la posibilidad de error. 2unque no "a%an a causar problermas en las consultas, si(ue siendo con"eniente tratar los datos recibidos para eliminar los espacios en blanco iniciales % finales, tratar los car#cteres especiales del 6tml, etc., como se comenta en la leccin de 1eco(ida de datos. 5na "ez realizada la consulta, el tratamiento de la respuesta ser<a el mismo que se 6a "isto en el apartado anterior. 9est+icciones en los ;a+C0et+os de cons)ltas ;+e;a+adas Debido a que las consultas preparadas se idearon para optimizar el rendimiento de las consultas, el uso de par#metros tiene al(unas restricciones. Por ejemplo los identificadores (nombres de tablas, nombres de columnas, etc) no pueden sustituirse por par#metros los dos elementos de una i(ualdad no pueden sustituirse por par#metros en (eneral no pueden utilizarse par#tros en las consultas DDL (len(uaje de definicin de datos) (nombre % tama8o de los campos, etc.) &i no podemos usar par#metros, no queda m#s remedio que incluir los datos en la consulta. .omo en ese caso PHP no 6ace nin(una desinfeccin de los datos, la tenemos que 6acer nosotros pre"iamente. .omo en estos casos los "alores introducidos por el usuario suelen tener unos "alores restrin(idos (por ejemplo, si el usuario puede ele(ir una columna de una tabla, los nombres de las columnas est#n determinadas % el usuario slo puede ele(ir uno de ellos). Podemos crear una funcin de reco(ida de datos espec<fica que impida cualquier tipo de ataque de in%eccin por parte del usuario, como muestra el si(uiente ejemplo // FUNC!N D" 9"COGD$ D" UN D$&O QU" S!LO PU"D" &OM$9 D"&"9MN$DOS H$LO9"S ,ca0;os - a++ay( /no0b+e/4 /a;ellidos/)5 ()nction +eco<eCa0;o(,=a+4 ,=a+O) * <lobal ,ca0;os5 (o+eac3(,ca0;os as ,ca0;o) * i( (isset(,89"QU"S&K,=a+L) PP ,89"QU"S&K,=a+L -- ,ca0;o) * +et)+n ,ca0;o5 : : +et)+n ,=a+O5 : // "A"MPLO D" USO D" L$ FUNC!N $N&"9O9 ,ca0;o - +eco<eCa0;o(/ca0;o/4 /a;ellidos/)5 ,no0b+e - ,89"QU"S&K/no0b+e/L5 ,cons)lta - /S"L"C& I F9OM ,db&abla EH"9" no0b+e-2no0b+e O9D"9 %' ,ca0;o $SC/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 ,+es)lt67exec)te(a++ay(/2no0b+e/ -7 ,no0b+e))5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 ??? >ol"er al principio de la p#(ina "je0;los de cons)ltas n los ejemplos de este apartado, se 6an utilizado sentencias preparadas en los casos en los que las consultas inclu%en datos proporcionados por el usuario % consultas no preparadas cuando no inclu%an datos proporcionados por el usuario. n la ma%or<a de los casos se podr<an 6aber (astado sentencias preparadas aunque no 6a%a datos proporcionados por el usuario. 9eco+ta+ los datos 5na diferencia entre $%&'L % &'Lite es que si se (uarda una cadena de ma%or lon(itud que el campo correspondiente, $%&'L recorta la cadena a la lon(itud del campo pero &'Lite no lo 6ace. Para que los pro(ramas den el mismo resultado en $%&'L % &'Lite, una solucin es recortar los datos introducidos por el usuario a la lon(itud del campo en la base de datos antes de insertarlos. Para ello se puede utilizar las funciones recorta() comentada en la leccin de 1eco(ida de datos. >ol"er al principio de la p#(ina Cons)ltas C9"$&" D$&$%$S"4 D9OP D$&$%$S" 4ota0 n el caso de utiliza &'Lite, no tiene sentido crear o borrar la base de datos %a que con &'Lite cada base de datos es un fic6ero distinto % al conectar con la base de datos %a se dice con qu7 arc6i"o se "a a trabajar % se crea en caso necesario. Para crear una base de datos, se utiliza la consulta .123 D232*2&. // "A"MPLO D" CONSUL&$ D" C9"$C!N D" %$S" D" D$&OS ,db - conectaDb()5 ,cons)lta - /C9"$&" D$&$%$S" ,dbDb/5 i( (,db671)e+y(,cons)lta)) * ;+int />;7%ase de datos c+eada co++ecta0ente?>/;7@n/5 : else * ;+int />;7"++o+ al c+ea+ la base de datos?>/;7@n/5 : ,db - n)ll5 Para borrar una base de datos, se utiliza la consulta D1OP D232*2&. // "A"MPLO D" CONSUL&$ D" %O99$DO D" %$S" D" D$&OS ,db - conectaDb()5 ,cons)lta - /D9OP D$&$%$S" ,dbDb/5 i( (,db671)e+y(,cons)lta)) * ;+int />;7%ase de datos bo++ada co++ecta0ente?>/;7@n/5 : else * ;+int />;7"++o+ al bo++a+ la base de datos?>/;7@n/5 : ,db - n)ll5 >ol"er al principio de la p#(ina Cons)ltas C9"$&" &$%L"4 D9OP &$%L"4 NS"9& N&O4 UPD$&"4 D"L"&" F9OM Para crear una tabla, se utiliza la consulta .123 32*L. Las consultas de creacin de tabla suelen ser espec<ficas de cada base de datos. Los ejemplos no utilizan sentencias preparadas (en caso de utilizarse sentencias preparadas, las "ariables no podr<an ir como par#metros por tratarse de sentencias DDL). // "A"AMPLO D" CONSUL&$ D" C9"$C!N D" &$%L$ "N M'SQL ,db - conectaDb()5 ,cons)lta - /C9"$&" &$%L" ,db&abla ( id N&"G"9 UNSGN"D NO& NULL $U&O8NC9"M"N&4 no0b+e H$9CH$9(,ta0No0b+e)4 a;ellidos H$9CH$9(,ta0$;ellidos)4 P9M$9' Q"'(id) )/5 i( (,db671)e+y(,cons)lta)) * ;+int />;7&abla c+eada co++ecta0ente?>/;7@n/5 : else * ;+int />;7"++o+ al c+ea+ la tabla?>/;7@n/5 : ,db - n)ll5 // "A"MPLO D" CONSUL&$ D" C9"$C!N D" &$%L$ "N SQLite ,db - conectaDb()5 ,cons)lta - /C9"$&" &$%L" ,db&abla ( id N&"G"9 P9M$9' Q"'4 no0b+e H$9CH$9(,ta0No0b+e)4 a;ellidos H$9CH$9(,ta0$;ellidos) )/5 i( (,db671)e+y(,cons)lta)) * ;+int />;7&abla c+eada co++ecta0ente?>/;7@n/5 : else * ;+int />;7"++o+ al c+ea+ la tabla?>/;7@n/5 : ,db - n)ll5 Para borrar una tabla, se utiliza la consulta D1OP 32*L. // "A"MPLO D" CONSUL&$ D" %O99$DO D" &$%L$ ,db - conectaDb()5 ,cons)lta - /D9OP &$%L" ,db&abla/5 i( (,db671)e+y(,cons)lta)) * ;+int />;7&abla bo++ada co++ecta0ente?>/;7@n/5 : else * ;+int />;7"++o+ al bo++a+ la tabla?>/;7@n/5 : ,db - n)ll5 Para a8adir un re(istro a una tabla, se utiliza la consulta ,4&13 ,43O. // "A"MPLO D" CONSUL&$ D" NS"9C!N D" 9"GS&9O ,db - conectaDb()5 ,no0b+e - +eco<e(/no0b+e/)5 ,a;ellidos - +eco<e(/a;ellidos/)5 ,cons)lta - /NS"9& N&O ,db&abla (no0b+e4 a;ellidos) H$LU"S (2no0b+e4 2a;ellidos)/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 i( (,+es)lt67exec)te(a++ay(/2no0b+e/ -7 ,no0b+e4 /2a;ellidos/ -7 ,a;ellidos))) * ;+int />;79e<ist+o c+eado co++ecta0ente?>/;7@n/5 : else * ;+int />;7"++o+ al c+ea+ el +e<ist+o?>/;7@n/5 : ,db - n)ll5 Para modificar un re(istro a una tabla, se utiliza la consulta 5PD23. // "A"MPLO D" CONSUL&$ D" MODFC$C!N D" 9"GS&9O ,db - conectaDb()5 ,no0b+e - +eco<e(/no0b+e/)5 ,a;ellidos - +eco<e(/a;ellidos/)5 ,id - +eco<e(/id/)5 ,cons)lta - /UPD$&" ,db&abla S"& no0b+e-2no0b+e4 a;ellidos-2a;ellidos EH"9" id-2id/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 i( (,+es)lt67exec)te(a++ay(/2no0b+e/ -7 ,no0b+e4 /2a;ellidos/ -7 ,a;ellidos4 /2id/ -7 ,id))) * ;+int />;79e<ist+o 0odi(icado co++ecta0ente?>/;7@n/5 : else * ;+int />;7"++o+ al 0odi(ica+ el +e<ist+o?>/;7@n/5 : ,db - n)ll5 Para borrar un re(istro de una tabla, se utiliza la consulta DL3 )1O$. 4ota0 n el ejemplo, los re(istros a borrar se reciben en forma de matriz % se recorre la matriz borrando un elemento en cada iteracin. // "A"MPLO D" CONSUL&$ D" %O99$DO D" 9"GS&9O ,db - conectaDb()5 ,id - +eco<eMat+iB(/id/)5 (o+eac3 (,id as ,indice -7 ,=alo+) * ,cons)lta - /D"L"&" F9OM ,db&abla EH"9" id-2indice/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 i( (,+es)lt67exec)te(a++ay(/2indice/ -7 ,indice))) * ;+int />;79e<ist+o bo++ado co++ecta0ente?>/;7@n/5 : else * ;+int />;7"++o+ al bo++a+ el +e<ist+o?>/;7@n/5 : : ,db - n)ll5 >ol"er al principio de la p#(ina Cons)lta S"L"C& Para obtener re(istros que cumplan determinados criterios se utiliza la consulta &L.3. // "A"MPLO D" CONSUL&$ D" S"L"CC!N D" 9"GS&9OS ,db - conectaDb()5 ,cons)lta - /S"L"C& I F9OM ,db&abla/5 ,+es)lt - ,db671)e+y(,cons)lta)5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 : else * ;+int />;7Cons)lta ejec)tada?>/;7@n/5 : ,db - n)ll5 Para acceder a los re(istros de"ueltos por la consulta, se puede utilizar un bucle foreac6. // "A"MPLO D" CONSUL&$ D" S"L"CC!N D" 9"GS&9OS ,db - conectaDb()5 ,cons)lta - /S"L"C& I F9OM ,db&abla/5 ,+es)lt - ,db671)e+y(,cons)lta)5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 : else * (o+eac3 (,+es)lt as ,=alo+) * ;+int />;7No0b+e2 ,=alo+Kno0b+eL 6 $;ellidos2 ,=alo+Ka;ellidosL>/;7@n/5 : : ,db - n)ll5 O tambi7n se puede utilizar la funcin PDOStatement->fetch() // "A"MPLO D" CONSUL&$ D" S"L"CC!N D" 9"GS&9OS ,db - conectaDb()5 ,cons)lta - /S"L"C& I F9OM ,db&abla/5 ,+es)lt - ,db671)e+y(,cons)lta)5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 : else * .3ile (,(ila - ,+es)lt67(etc3()) * ;+int />;+e7@n/5 ;+int8+(,(ila)5 ;+int />/;+e7@n/5 : : ,db - n)ll5 l problema es que si la consulta no de"uel"e nin(-n re(istro, estos dos m7todos no escribir<an nada. Por ello se recomienda 6acer primero una consulta que cuente el n-mero de resultados de la consulta %, si es ma%or que cero, 6acer la consulta. l ejemplo si(uiente utiliza la funcin PDOStatement- >fetchColumn(), que de"uel"e la primera columna del primer resultado (que en este caso contiene el n-mero de re(istros de la consulta). // "A"MPLO D" CONSUL&$ D" S"L"CC!N D" 9"GS&9OS ,db - conectaDb()5 ,cons)lta - /S"L"C& COUN&(I) F9OM ,db&abla/5 ,+es)lt - ,db671)e+y(,cons)lta)5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 : elsei( (,+es)lt67(etc3Col)0n() -- R) * ;+int />;7No se 3a c+eado toda=Ma nin<Sn +e<ist+o en la tabla?>/;7@n/5 : else * ,cons)lta - /S"L"C& I F9OM ,db&abla/5 ,+es)lt - ,db671)e+y(,cons)lta)5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 : else * (o+eac3 (,+es)lt as ,=alo+) * ;+int />;7No0b+e2 ,=alo+Kno0b+eL 6 $;ellidos2 ,=alo+Ka;ellidosL>/;7@n/5 : : : ,db - n)ll5 La consulta &L.3 permite efectuar b-squedas en cadenas utilizando el condicional L,A o 4O3 L,A % los comodines 9 (cualquier car#cter) o B (cualquier n-mero de caracteres). La primera consulta del ejemplo si(uiente de"ol"er<a todos los re(istros en los que el primer apellido es P7rez, mientras que la se(unda consulta de"ol"er<a todos los re(istros en los que el primer o se(undo apellido es P7rez. // "A"MPLO D" CONSUL&$ D" S"L"CC!N D" 9"GS&9OS ,db - conectaDb()5 ,cons)lta - /S"L"C& COUN&(I) F9OM ,db&abla EH"9" a;ellidos LQ" 2a;ellidos/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 ,+es)lt67exec)te(a++ay(/2a;ellidos/ -7 /,a;ellidosT/))5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 : else * ;+int />;7Se 3an encont+ado / ? ,+es)lt67(etc3Col)0n() ? / +e<ist+os?>/;7@n/5 : ,db - n)ll5 // "A"MPLO D" CONSUL&$ D" S"L"CC!N D" 9"GS&9OS ,db - conectaDb()5 ,cons)lta - /S"L"C& COUN&(I) F9OM ,db&abla EH"9" a;ellidos LQ" 2a;ellidos/5 ,+es)lt - ,db67;+e;a+e(,cons)lta)5 ,+es)lt67exec)te(a++ay(/2a;ellidos/ -7 /T,a;ellidosT/))5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 : else * ;+int />;7Se 3an encont+ado / ? ,+es)lt67(etc3Col)0n() ? / +e<ist+os?>/;7@n/5 : ,db - n)ll5 &e pueden tambi7n realizar consultas de unin entre "arias tablas (el ejemplo est# sacado del ejercicio de *iblioteca)0 4ota0 scribir como consulta preparada. // "A"MPLO D" CONSUL&$ D" UN!N D" &$%L$S ,db - conectaDb()5 ,cons)lta - /S"L"C& ,dbP+esta0os?id $S id4 ,dbUs)a+ios?no0b+e as no0b+e4 ,dbUs)a+ios?a;ellidos as a;ellidos4 ,dbOb+as?tit)lo as tit)lo4 ,dbP+esta0os?;+estado as ;+estado4 ,dbP+esta0os?de=)elto as de=)elto F9OM ,dbP+esta0os4 ,dbUs)a+ios4 ,dbOb+as EH"9" ,dbP+esta0os?id8)s)a+io-,dbUs)a+ios?id $ND ,dbP+esta0os?id8ob+a-,dbOb+as?id $ND ,dbP+esta0os?de=)elto-URRRR6RR6RRU O9D"9 %' ,ca0;o ,o+den/5 ,+es)lt - ,db671)e+y(,cons)lta)5 i( (J,+es)lt) * ;+int />;7"++o+ en la cons)lta?>/;7@n/5 : else * ??? : ,db - n)ll5 FUENTE: http://www.mclibre.org/consultar/php/lecciones/php_db_pdo.html