Você está na 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

Você também pode gostar