{"id":944,"date":"2014-02-18T02:35:05","date_gmt":"2014-02-18T08:35:05","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=944"},"modified":"2014-02-18T03:01:31","modified_gmt":"2014-02-18T09:01:31","slug":"pdo-basico-en-php","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=944","title":{"rendered":"PDO basico en PHP"},"content":{"rendered":"<p>Este art\u00edculo pretend\u00eda ser muy ambicioso, pero descubr\u00ed que mi ambici\u00f3n termina en el momento que hab\u00eda que configurar lo necesario para tener un ORM en PHP, por lo que bajare el perfil.<\/p>\n<p>En la oficina el equipo de desarrollo est\u00e1 trabajando en un software de infraestructura muy complejo y que requiere acceso a bases de datos, este proyecto es interesante por toda la infraestructura sobre la que est\u00e1 montado.<\/p>\n<p>Una de las piezas fundamentales es un ORM de hecho es m\u00e1s que solo el ORM, pero debido  a que de hecho el dise\u00f1o es actualmente un secreto no puedo escribir m\u00e1s al respecto. <\/p>\n<p>\u00bfPor qu\u00e9 se requiere un ORM?<\/p>\n<p>Entre las curiosidades de un ORM es abstraerse completamente de la base de datos, esto significa que es deseable que conozcas de SQL pero no indispensable para programar con un ORM. Por ejemplo insertar un registro en la base de datos SQL seria asi.<\/p>\n<p>insert into persona (nombre,edad) values(&#8216;Soy Batman&#8217;,15);<\/p>\n<p>en un ORM, ya finalizado en una clase instanciada ser\u00eda algo as\u00ed.<\/p>\n<p>Persona.nombre = \u201cSoy Batman\u201d;<br \/>\nPersona.edad = 15;<br \/>\nPersona.save();<\/p>\n<p>Como se deja ver queda totalmente abstra\u00eddo del SQL, el ORM se encarga de reconvertir todo a SQL y lo mismo ocurre si queremos obtener alg\u00fan valor de la base de datos. Esto hace que la programaci\u00f3n se acelere de forma exponencial.<\/p>\n<p>Por supuesto llegar a manejar solo clases tiene un costo, la configuraci\u00f3n de un ORM puede llegar a ser un gran dolor  y m\u00e1s si este se tiene que configurar mediante XML es por eso y muchas otras cosas mas que decidi no hacer el articulo de ORM para PHP, lo cual es altamente recomendable para desarrollos grandes pero demasiado laborioso para hacer peque\u00f1os programas WEB<\/p>\n<p>Otra de las caracter\u00edsticas de un ORM es obviar la base de datos, el ORM sabe c\u00f3mo debe conectar al motor de la base de datos por lo que incluso migrar de una motor a otro es tan simple como configurar unas l\u00edneas en el ORM, de eso si tratara este articulo. Pero no con un ORM.<\/p>\n<p>Lo hare con algo que es lo b\u00e1sico sobre lo que un ORM se monta.<\/p>\n<p>En el caso de PHP es PDO porque es PHP Data Objects. Hay uno en cada lenguaje de programaci\u00f3n orientado a objetos. En Java su clase equivalente es JDBC ( Java Database Connectivity )<\/p>\n<p>Lo que tienen en com\u00fan estas clases es que abstraen el motor de la base de datos, solo requieren un driver y el resto de las operaciones se hace igual y aunque tienen algunos m\u00e9todos que abstraen los ACID no llegan a hacer un mapeo como un ORM, sin embargo abstraen lo suficiente para no tener  que aprender un API para cada base de datos,puede ser MySQL, MSSQL, PostgreSQL, SQLite, MS-ACCESS, ETC.<\/p>\n<p>La abstracci\u00f3n es tan efectiva que el programa final podr\u00eda soportar pr\u00e1cticamente cualquier base de datos siempre y cuando el driver est\u00e9 presente. Cambiar de motor es tan simple como modificar un l\u00ednea en todo el c\u00f3digo del programa.<\/p>\n<p>Para este art\u00edculo hice un ejemplo con el mismo c\u00f3digo fuente para MySQL y SQLite, el c\u00f3digo es el siguiente.<\/p>\n<blockquote><p>< ?php\n\n\/\/Conectar a la DB con Driver MYSQL Base de datos pdotest, Usuario pdo y clave test\ntry\n{\n  $con = new PDO('mysql:host=localhost;dbname=pdotest', 'pdo', 'test');\n  $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);<br \/>\n}<br \/>\ncatch(PDOException $e)<br \/>\n{<br \/>\n  echo &#8216;Error conectando con la base de datos: &#8216; . $e->getMessage();<br \/>\n}<\/p>\n<p>\/\/Consultas para recuperar valores<\/p>\n<p>try {<br \/>\n        $sql = &#8220;select * from persona;&#8221;;<br \/>\n        $stmt = $con->prepare($sql);<br \/>\n        $stmt->execute();<\/p>\n<p>       while( $datos = $stmt->fetch() )<\/p>\n<p>        {<br \/>\n                echo $datos[&#8220;nombre&#8221;]. &#8220;<br \/>&#8220;;<br \/>\n                echo $datos[&#8220;edad&#8221;]. &#8220;<br \/>&#8220;;<br \/>\n        }<\/p>\n<p>}<br \/>\ncatch (PDOException $e)<br \/>\n{<br \/>\n  echo &#8216;Error conectando con la base de datos: &#8216; . $e->getMessage();<br \/>\n}<\/p>\n<p>\/\/Consultas para ingresar valores<\/p>\n<p>try {<br \/>\n        $sql = &#8220;insert into persona (nombre,edad) values(&#8216;Soy Batman&#8217;,35);&#8221;;<br \/>\n        $stmt = $con->prepare($sql);<br \/>\n        $stmt->execute();<br \/>\n}<br \/>\ncatch (PDOException $e)<br \/>\n{<br \/>\n  echo &#8216;Error conectando con la base de datos: &#8216; . $e->getMessage();<br \/>\n}<\/p>\n<p>?><\/p><\/blockquote>\n<p>La \u00fanica l\u00ednea a modificar<\/p>\n<p>Para MySQL<\/p>\n<blockquote><p>$con = new PDO(&#8216;mysql:host=localhost;dbname=pdotest&#8217;, &#8216;pdo&#8217;, &#8216;test&#8217;);<\/p><\/blockquote>\n<p>Para SQLite<\/p>\n<blockquote><p>$con = new PDO(&#8216;sqlite:dragon.db&#8217;);<\/p><\/blockquote>\n<p>Un video demostrativo.<\/p>\n<p><iframe loading=\"lazy\" width=\"420\" height=\"315\" src=\"\/\/www.youtube.com\/embed\/rkTurl1DhLM\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este art\u00edculo pretend\u00eda ser muy ambicioso, pero descubr\u00ed que mi ambici\u00f3n termina en el momento que hab\u00eda que configurar lo necesario para tener un ORM en PHP, por lo que bajare el perfil. En la oficina el equipo de desarrollo est\u00e1 trabajando en un software de infraestructura muy complejo y que requiere acceso a bases&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-944","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/944","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=944"}],"version-history":[{"count":4,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/944\/revisions"}],"predecessor-version":[{"id":948,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/944\/revisions\/948"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=944"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=944"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}