Story Transcript
Resumen de uso de funciones DOM con PHP El Document Object Mode (DOM), es la especificación de una interfaz no dependiente del lenguaje de programación que permite a programas acceder, modificar y actualizar la estructura y el estilo de documentos. DOM proporciona un conjunto de objetos estándar para representar documentos XML y HTML y un conjunto de operaciones para acceder a ellos y modificarlos. PHP implementa el estándar DOM (http://www.php.net/manual/en/ref.dom.php) mediante un conjunto de clases que representan los objetos definidos en la especificación y las funciones para trabajar con ellos. La siguiente figura representa de manera simplificado el conjunto de entidades (objetos, clases) que podemos utilizar en con DOM, con un ejemplo de documento.
En la implementación PHP manejaremos fundamentalmente las siguientes clases: • DOMNode. Es la clase base de la mayoría de clases de la implementación. Proporciona métodos para crear nuevos elementos, moverse por el árbol que representa un documento, etc. Las clases que extienden (por herencia) a esta, tienen acceso a sus métodos y propiedades. • DOMDocument. Extiende DOMElement. Representa un documento y proporciona métodos para crear nuevos elementos y realizar búsquedas por un documento DOM. • DOMElement. Extiende DOMElement. Representa un elemento dentro del documento y proporciona métodos para acceder y modificar los atributos de un nodo.
• DOMNodeList. Representa una lista de DOMNodes. Algunas de las funciones más utilizadas son las siguientes: • DOMNode->appendChild() - Adds new child at the end of the children • DOMNode->removeChild() - Removes child from list of children • DOMNode->hasAttributes() - Checks if node has attributes • DOMNode->hasChildNodes() - Checks if node has children
Sus propiedades son: Name
Type
Readonly
Description
nodeName
string
yes
Returns the most accurate name for the current node type
nodeValue
string
no
The value of this node, depending on its type.
nodeType
int
yes
Gets the type of the node. One of the predefined XML_xxx_NODE constants
parentNode
DOMNode
yes
The parent of this node.
childNodes
DOMNodeList
yes
A DOMNodeList that contains all children of this node. If there are no children, this is an empty DOMNodeList.
firstChild
DOMNode
yes
The first child of this node. If there is no such node, this returns NULL.
lastChild
DOMNode
yes
The last child of this node. If there is no such node, this returns NULL.
previousSibling DOMNode
yes
The node immediately preceding this node. If there is no such node, this returns NULL.
nextSibling
yes
The node immediately following this node. If there is no such node, this returns NULL.
DOMNamedNodeMap yes
A DOMNamedNodeMap containing the attributes of this node (if it is a DOMElement) or NULL otherwise.
attributes
DOMNode
ownerDocument DOMDocument
yes
The DOMDocument object associated with this node.
namespaceURI string
yes
The namespace URI of this node, or NULL if it is unspecified.
Name
Type
Readonly
Description
prefix
string
no
The namespace prefix of this node, or NULL if it is unspecified.
localName
string
yes
Returns the local part of the qualified name of this node.
baseURI
string
yes
The absolute base URI of this node or NULL if the implementation wasn't able to obtain an absolute URI.
textContent
string
no
This attribute returns the text content of this node and its descendants.
La segunda columna indica el tipo de datos devuelto al invocar a la propiedad. Si observamos la propiedad nodeList, por ejemplo, vemos que devuelve un DOMNodeList, es decir una lista de nodos que son descendientes del nodo sobre el que se invoca la propiedad. La clase DOMNodeList sólo tiene un método DOMNode item($index) y una propiedad length. Es decir, que sólo se utiliza para recorrer una lista de nodos, mediante un bucle for y acceder a sus elementos. El siguiente ejemplo muestra cómo crear un documento XML:
En el ejemplo, se accede a una BBDD para seleccionar una tabla de un catálogo. A continuación se crea una instancia de la clase DOMDocument, que utilizaremos para crear todos los elementos del documento. Es necesario añadir los nodos al documento invocando la función appendChild del nodo sobre el que queremos insertar un descendiente en el árbol. Por tanto se añade un nuevo elemento al documento creado, de manera que tenemos el elemento raíz. La invocación del método appenChild devuelve un puntero al nuevo nodo insertado en el documento, que utilizaremos para seguir insertando descendientes jerárquicamente. Por ejemplo, $Catalogo = $dom -> appendChild($element); Inserta el elemento raíz y devuelve un puntero al nodo añadido, con lo que posteriormente podemos insertar elementos que desciendan del raíz $Producto = $Catalogo -> appendChild($element);
Finalmente, la función saveXML() devuelve una cadena de texto con la instancia XML del documento DOM en uso. Para trabajar con instancias XML previamente creadas se utilizan las funciones de búsqueda de DOMDocument, así como las propiedades de los DOMNodes: $dom = new DOMDocument('1.0'); $dom->load('exportar.xml'); //Obtenemos el elemento raiz como DOMNodeList $array = $dom->getElementsByTagName("Catalogo"); //Obtenemos el primer elemento (la lista solo tiene uno) $cat=$array->item(0); //Obtenemos todos los hijos de este nodo (productos) $nodes = $cat->childNodes; for ($i = 0; $i < $nodes->length; $i++) {
$node= $nodes->item($i); //Buscamos su atributo $categ= $node->attributes->getNamedItem("Cat")->nodeValue; //Para cada producto obtenemos sus hijos $prod = $node->childNodes; $name = $prod -> item(0)->nodeValue; $precio = $prod->item(1)->nodeValue; $unidades = $prod->item(2)->nodeValue; //Insertamos el producto en la BBDD $query="INSERT INTO catalogo (categoria, descripcion, precio, unidades) VALUES(".$categ.",".$name.",".$precio.",".$unidades.")"; mysql_query($query,$l); } desconectar($l); ?>
En primer lugar se carga en memoria la instancia XML con la que se va a trabajar: $dom = new DOMDocument('1.0'); $dom->load('exportar.xml');
A continuación se buscan los elementos que nos interesan. $array = $dom->getElementsByTagName("Catalogo");
La invocación anterior devolvería un DOMNodeList con todos los elementos del documento que se llamen “Catalogo”. Como, en este caso “Catalogo” es el elemento raíz, la lista sólo contendrá un elemento. $cat=$array->item(0);
En este momento podemos obtener todos los descendientes de raíz y recorrerlos para trabajar con ellos: //Obtenemos todos los hijos de este nodo (productos) $nodes = $cat->childNodes; for ($i = 0; $i < $nodes->length; $i++) { $node= $nodes->item($i); ... ...
Resumen de acceso a BBDD con PHP Para acceder a una BBDD con PHP debemos utilizar las funciones correspondientes a la BBDD que estamos utilizando. En la documentación de PHP se pueden encontrar funciones para trabajar con multitud de BBDD. En nuestro caso utilizamos una BBDD MySQL, con lo que tenemos que usar las funciones correspondiente. Para trabajar con una BBDD usualmente se siguen los siguientes pasos: 1. Conectar a la BBDD usando la función mysql_connect(). $link = mysql_connect('localhost', 'ad', 'ad') or die('Could not connect: ' . mysql_error());
2. Seleccionar una BBDD mysql_select_db().
en
particular
usando
la
función
mysql_select_db('adprueba') or die('Could not select database');
3. A partir de este momento, se realiza la consulta deseada, creando una cadena de caracteres con las sentencias SQL necesarias. $query = 'SELECT * FROM catalogo WHERE `categoria`='.mysql_escape_string($c);
4. Se ejecuta la consulta con mysql_query(). Los resultados se devuelven en forma de tabla (matriz) dónde cada fila corresponde a la fila correspondiente en la BBDD (según la consulta). 5. Se recorre la matriz de resultados con la función mysql_fetch_assoc(). Cada llamada a la función devuelve una fila de la tabla hasta que llegar al final. // Printing results in HTML while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "
"; echo "\t\t | \n"; echo "".$line["descripcion"]." | \n"; echo "".$line["precio"]." | \n"; echo "".$line["unidades"]." | \n"; echo "\t
\n"; }
6. Se liberan memoria con mysql_free_result(). Para consultas grandes esto mejora el rendimiento.
7. Se cierra la conexión a la BBDD cuando no hay más consultas que ejecutar mysql_close($link);
Los pasos 3, 4 y 5 se repiten tantas veces como sea necesario, es decir para cada consulta que sea necesario hacer. La sintaxis de las consultas más comunes es la siguiente: Borrar: DELETE FROM Tabla WHERE user = 'jcole'
Insertar: INSERT INTO Tabla (col1, col2, col3) VALUES(15, 76, 43)
Actualizar una fila: UPDATE Tabla SET dni=48423234 UPDATE Tabla SET age=age+1
Seleccionar datos: SELECT * FROM Tabla; SELECT dni, edad FROM Tabla
Para seleccionar, actualizar o borrar se pueden especificar condiciones añadiendo la cláusula WHERE al final. Esta cláusula puede usar expresiones: SELECT * FROM Tabla WHERE dni=47373621 SELECT * FROM Tabla WHERE unidades=15 AND precio < 100 UPDATE Tabla SET edad=26 WHERE dni=48423234
Aunque se podrían realizar múltiples consultas sucesivas con PHP, casi siempre es preferible combinar consultas sobre varias tablas. Por ejemplo: SELECT tabla.dni, tabla2.salario FROM tabla1, tabla2 WHERE t1.dni = t2.dni;
La consulta anterior permite seleccionar elementos de tablas relacionales, como las siguientes: dni nombre apellidos edad 4523345 Juan García 46 1234223 Ana Pérez 37
dni 4523345 3232535
salario 15000 26000
fechaContrato 11-12-2005 09-10-2005
La consulta anterior devolvería el salario del usuario con dni 4523345 ya que es la única coincidencia en el campo dni entre la tabla 1 y la tabla 2. Para más información sobre sintaxis SQL consultar el capítulo 13 del manual de MySQL