Archivo

Archive for 29 abril 2010

BlackBoard PHP Class [Manipular Información]

Bueno hoy hice esta pequeña clase en PHP para ingresar a BlackBoard.
¿ Que puedes Hacer con esta clase ?

– Puedes Conectarte a Blackboard.
– Ver tus ramos.
– Ver cuantos mensajes en Inbox/Enviados
– Muestra los mensajes en Bandeja de entrada

Requerimientos:
– PHP5
– Libreria curl habilitada

¿ Que puedes hacer con esta libreria ?
Se podria crear un archivo php y crear un cron en tu hosting cada X minutos y comprobar si tienes mensajes nuevos, asi estar al día con los mensajes que envian los profesores, etc.

Aca dejo la clase:

<?PHP
require_once 'class/ProtocolHTTP.class.php';
/*
	@Autor: Esteban Fuentealba
	@Email:	mi [dot] warezx [at] gmail [dot] com
	@Web:	https://estebanfuentealba.wordpress.com/
*/
class BlackBoard {
	var $data	= null;
	var $method	= null;
	var $urls	= null;
	function __construct($data) {
		$this->data	= $data;
		$this->method = new ProtocolHTTP();
	}
	function Login() {
		$params = "action=login&remote-user=&new_loc=&auth_type=&one_time_token=&encoded_pw=".base64_encode($this->data['password'])."&encoded_pw_unicode=".base64_encode($this->data['password'])."&user_id=".$this->data['user']."&password=&Login.x=81&Login.y=8";
		$g = $this->method->methodGET($this->data['urls']['login'],null,null);
		$r = $this->method->methodPOST($this->data['urls']['login'],
									$g['cookies'],
									null,
									$params
								);
		$this->data['cookies'] = $r['cookies'];
	}
	function GetSubjects() {
		if(!$this->data['cookies'])
			$this->Login();
		$httpRequest	= $this->method->methodGET($this->data['urls']['index'],$this->data['cookies'],null);
		$elements = $this->CreateDOM($httpRequest['response'],"//a[contains(@href,'frameset.jsp?tab_id=')]");
		$subjects=null;
		foreach ($elements as $element) {
			preg_match_all('#\%26id\%3d(.+)\%26url\%3d#',$element->attributes->item(0)->value,$r);
			$nodes = $element->childNodes;
			foreach ($nodes as $node) {
				$subjects[$r[1][0]] = $node->nodeValue;
			}
		}
		return $subjects;
	}
	function GetInboxMsgs($idSubject) {
		if(!$this->data['cookies'])
			$this->Login();
		$httpRequest	= $this->method->methodGET($this->CreateUrl($this->data['urls']['inbox'],array('id' => $idSubject)),$this->data['cookies'],null);
		$elements = $this->CreateDOM($httpRequest['response'],"//span[contains(@class,'listItem')]");
		$msgs=null;
		$tmp=null;
		$d = array('user','title','date');
		$x=0;
		$i=0;
		foreach ($elements as $element) {
			$val = trim($element->nodeValue);
			if($val != "") {
				$in = $d[$x++];
				$tmp[$i][$in] = $val;
				if($x == 3) {
					$x = 0;
					$i++;
				}
			}
		}
		return $tmp;
	}
	function GetInboxStats($idSubject) {
		if(!$this->data['cookies'])
			$this->Login();
		$httpRequest	= $this->method->methodGET($this->CreateUrl($this->data['urls']['inboxStats'],array('id' => $idSubject)),$this->data['cookies'],null);
		$elements = $this->CreateDOM($httpRequest['response'],"//span[contains(@class,'listItem')]");
		$stats=null;
		$d = array('BandejaEntradaNoLeido','BandejaEntradaTotal','EnviadoNoLeido','EnviadoTotal');
		$i=0;
		foreach ($elements as $element) {
			$value = trim($element->nodeValue);
			if (is_numeric($value)) {
				$stats[$d[$i++]] = $value;
			}
		}
		return $stats;
	}
	function CreateDOM($html,$xp) {
		$webDoc = new DOMDocument();
		@$webDoc->loadHTML($html);
		$xpath = new DOMXpath($webDoc);
		$elements = $xpath->query($xp);
		return $elements;
	}
	function CreateUrl($text,$replaceParams) {
		preg_match_all('#\{(.[^\}]+)\}#',$text,$r);
		$urlCreated = '';
		foreach($r[1] as $param) {
			$urlCreated = str_replace('{'.$param.'}',(is_numeric($replaceParams[$param])) ? ((int)$replaceParams[$param]) : $replaceParams[$param],$text);
		}
		return $urlCreated;
	}
}
?>

USO:

<?PHP
/*
	@Autor: Esteban Fuentealba
	@Email:	mi [dot] warezx [at] gmail [dot] com
	@Web:	https://estebanfuentealba.wordpress.com/
*/
	//## Incluyo la clase
	require_once 'class/BlackBoard.class.php';
	//## Crea una instancia a la clase BlackBoard
	$b = new BlackBoard(
		//## Como parametro se le pasa un array
		array(
			//## El usuario de BlackBoard
			'user'		=>	'es.fuentealba',
			//## La clave del usuario Blackboard
			'password' 	=> 'miclave',
			//## Urls del portal de Blackboard
			'urls'		=> 	array(
								'login'			=>	'http://campusvirtual.duoc.cl/webapps/login/',
								'index' 		=>	'http://campusvirtual.duoc.cl/webapps/portal/tab/_1_1/index.jsp',
								'inboxStats'	=>	'http://campusvirtual.duoc.cl/webapps/blackboard/messaging/course/folderList.jsp?course_id={id}',
								'inbox'			=>	'http://campusvirtual.duoc.cl/webapps/blackboard/messaging/course/messageList.jsp?nav=messages&course_id={id}&folder=inbox'
							)
		)
	);
	//## Obtengo todos los ramos que tengo
	foreach($b->GetSubjects() as $subjectID => $subjectName) {
		echo $subjectID .' => '.$subjectName."<br />";
	}
	//## Obtengo las estadisticas de mensajes nuevos,totales,enviados
	//## Le paso como parametro un subjectID o id de ramo
	print_r($b->GetInboxStats('_45891_1'));
	//## Obtengo los mensajes de entrada de un ramo especifico
	//## Le paso como parametro un subjectID o id de ramo
	print_r($b->GetInboxMsgs('_45891_1'));
?>

Codigo Fuente: BlackBoard.EstebanFuentealba.rar


Espero que les sirva esta clase, pueden editarla o agregarle nuevas funcionalidades,

Saludos!

Anuncios
Categorías:PHP Etiquetas: , , , ,

Java Persistence: Crea Aplicaciones Rapidamente [Netbeans+Java+Mysql+TopLink]

Supongamos que tenemos una base de datos y de las tablas de esa base de datos queremos armar una aplicación.
Las Tablas son 2:

  • pais
  • ciudad
CREATE TABLE pais (
	p_id VARCHAR(3) NOT NULL,
	p_nombre VARCHAR(25),
	PRIMARY KEY (p_id)
);
CREATE TABLE ciudad (
	c_id VARCHAR(2) NOT NULL,
	c_nombre VARCHAR(25),
	p_id VARCHAR(3) ,
	c_habitantes INT,
	PRIMARY KEY (c_id) ,
	FOREIGN KEY(p_id) REFERENCES pais(p_id)
);

Esas tablas contienen los siguientes registros:

INSERT INTO pais VALUES('001','Chile');
INSERT INTO pais VALUES('002','Venezuela');
INSERT INTO pais VALUES('003','EEUU');
INSERT INTO pais VALUES('004','Francia');

INSERT INTO ciudad VALUES('01','Concepcion','001',222232);
INSERT INTO ciudad VALUES('02','La serena','001',234445);
INSERT INTO ciudad VALUES('03','Valparaiso','001',123434);
INSERT INTO ciudad VALUES('04','Maracaibo','002',89212);
INSERT INTO ciudad VALUES('05','Caracas','002',233456);
INSERT INTO ciudad VALUES('06','Nueva York','003',445212);
INSERT INTO ciudad VALUES('07','Washington','003',235211);
INSERT INTO ciudad VALUES('08','Paris','004',232452);
INSERT INTO ciudad VALUES('09','San Huano','003',445212);

Para crear una aplicación en Java deberiamos comunmente armar un sistema en 3 capas y crear clases para conexión, manipulacion de datos, etc… como lo hacia en este post: https://estebanfuentealba.wordpress.com/2009/03/12/mysql-java-netbeans-conectar-a-una-base-de-datos-con-java/

Bueno en este post mostraré como crear una aplicacion en simples pasos sin necesidad de mucho programar con Java Persistence.

1.- Creamos un proyecto Java Aplication

2.- Le Asignamos un Nombre a nuestro proyecto y Finalizamos

3.- Ahora agregaremos a nuestro proyecto una conexión a nuestra base de datos, Para eso vamos a la pestaña Services, damos click derecho a Databases y presionamos New Connection…

4.- Ahora Configuramos; Seleccionamos el driver de MYSQL y completamos con los datos de la base de dato yFinalizamos.

5.- Ahora vamos a la pestaña Proyects, click derecho en Libraries y Add Library...

Agregaremos el Driver de MySQL y TopLink


Ahora ya podemos empezar a trabajar. Ahora agregaremos clases a nuestro proyecto. TopLink puede mapear la base de datos y transformar bd relacional a programación objetual. Para eso agregamos a nuestro proyecto una clase mapeada de la base de datos llamada Entity Clases From Data Base…

Nos pedirá la conexión y según ésta nos mostrará las tablas. Agregamos las tablas que deseamos ocupar en nuestro Proyecto y damos a Next.

Las tablas se mapearán y se convertirán en Clases , ahora nos pedirá el nombre que tendrán esas Clases mapeadas… Luego configuramos Persistence Unit… (Necesario para percistence)

Seleccionamos TopLink como Persistence Library y precionamos Create

Por Último presionamos Finish

Si todo sale Bien se habrán creado las clases que fueron mapeadas desde la base de datos

Ahora podemos empezar a programar :P , en este mini tutorial crearé el siguiente programa.

Un combobox con todos los países de la base de datos, al seleccionar algún país mostrará todas las ciudades asociadas a ese país.

Agregamos a nuestro proyecto un JFrame Form y agregamos JComboBox,JList y los JLabel’s correspondientes.

Agregamos los siguientes Atributos al JFrame Form:

    private EntityManagerFactory emf;
    private EntityManager em;

Ahora en el constructor del JFrame Form agregamos las siguientes lineas

    public NewJFrame() {
        initComponents();
        //inicializamos el EntityManagerFactory
        emf = Persistence.createEntityManagerFactory("TestPU");
        //inicializamos entity manager
        em = emf.createEntityManager();
        //Agregamos un Model al JList
        jList1.setModel(new DefaultListModel());
        //Posicionamos la ventana en el centro
        this.setLocationRelativeTo(null);
        //Llamamos al metodo que llena el combobox con paises
        loadComboBox();
    }

Ahora creamos el método loadComboBox que carga los países al combobox.

    public void loadComboBox() {
        //Creamos una Query
        //"Pais.findAll" es una query que fue definida automaticamente gracias al mapeo de la db
        //Luego obtenemos los resultados y los recorremos
        Iterator it = em.createNamedQuery("Pais.findAll").getResultList().iterator();
        while(it.hasNext()) {
            //Agrego el resultado al Combobox
            this.jComboBox1.addItem(((Pais)it.next()));
        }
    }

Ahora agregamos un evento al JCombobox para que al seleccionar cualquier Item llene el JList con las ciudades del País Seleccionado. El evento que usaremos es itemStateChanged

    private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {
        if(evt.getStateChange() == 1) {
            //Creamos una Query con una consulta ya definida ""Ciudad.findByPId"
            Query query = em.createNamedQuery("Ciudad.findByPId");
            //Esa query requiere pasarle un valor "pId" , la id del Pais
            query.setParameter("pId", ((Pais)this.jComboBox1.getSelectedItem()).getPId());
            //Elimino todos los elementos agregados al Modelo del JList
            ((DefaultListModel)jList1.getModel()).removeAllElements();
            //Recorro los resultados de la Query
            Iterator it = query.getResultList().iterator();
            while(it.hasNext()) {
                //Agrego el resultado a la JList
                ((DefaultListModel)jList1.getModel()).addElement(((Ciudad)it.next()));
            }
        }
    }

Ahora cambiamos los metodos toString() de Ciudad y Pais para que muestre los nombres de Ciudad y Pais respectivamente.

Con eso ya tenemos una aplicación funcional, sin tocar SQL ya podemos manipular los datos de nuestra base de datos.

Con esto también podemos Agregar datos a la base de datos con solo crear objetos de las Entity Class y hacer otro tipo de consultas.

Espero que sirva de algo este mini tutorial, ahora pueden investigar mas sobre Java Persistence.

Codigo de Fuente: Test.Persistence.EstebanFuentealba.rar

Saludos

Categorías:Java Etiquetas: , , , , , ,

Practica 03 Lección 03 Introducción a Oracle Server [OCADBA]

1.- Conéctese a la base de datos como usuario SYS y ciérrela.

SQL> CONNECT / AS SYSDBA
Connected.
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.

2.- Con la base de datos cerrada, cree un archivo SPFILE a partir de PFILE. El archivo SPFILE se creará en $ORACLE_HOME/dbs

SQL> CONNECT / AS SYSDBA
Connected to an idle instance.
SQL> CREATE SPFILE FROM PFILE;
File created.

3.- Desde el sistema operativo, visualice el archivo SPFILE.

4.- Conéctese como usuario SYS e inicie la base de datos con el archivo SPFILE.

SQL> CONNECT / AS SYSDBA
Connected to an idle instance.
SQL> STARTUP
ORACLE instance started.
Total System Global Area 26706720 bytes
Fixed Size 729888 bytes
Variable Size 20971520 bytes
Database Buffers 4194304 bytes
Redo Buffers 811008 bytes
Database mounted.

5.-
a.- Cierre la base de datos y ábrala en modo de sólo lectura.

SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP MOUNT
Total System Global Area 26706720 bytes
Fixed Size 729888 bytes
Variable Size 20971520 bytes
Database Buffers 4194304 bytes
Redo Buffers 811008 bytes
Database mounted.
SQL> ALTER DATABASE OPEN READ ONLY;
Database altered.

b.- Conéctese como usuario HR con la contraseña HR e inserte una fila en la tabla REGIONS , ¿Qué sucede?

/* Creado usuario */
SQL> CREATE USER HR IDENTIFIED BY HR;
/* privilegios */
SQL> GRANT ALL PRIVILEGES TO HR;
/* crear tabla regions */
SQL> CREATE TABLE regions (
	id NUMBER,
	nombre VARCHAR2(50)
);
SQL> CONNECT HR/HR
Connected.
SQL> INSERT INTO regions VALUES (5, 'Mars');
INSERT INTO regions VALUES (5, 'Mars')
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system
tablespace
'SAMPLE'

c.- Vuelva a poner la base de datos en modo de lectura y escritura.

SQL> CONNECT / AS SYSDBA
Connected.
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP
ORACLE instance started.
Total System Global Area 26706720 bytes
Fixed Size 729888 bytes
Variable Size 20971520 bytes
Database Buffers 4194304 bytes
Redo Buffers 811008 bytes
Database mounted.
Database opened..

6.-
a.- Conéctese como usuario HR con la contraseña HR e inserte la siguiente fila en la tabla REGIONS; no valide ni salga de la base de datos.

INSERT INTO regions VALUES (5, ‘Mars’);

HR SESSION
SQL> CONNECT HR/HR
Connected.
SQL> INSERT INTO regions VALUES (5, 'Mars');
1 row created.

b.- En una nueva sesión telnet, inicie SQL*Plus. Conéctese como SYS y realice un SHUTDOWN TRANSACTIONAL.

SYS SESSION
SQL> CONNECT / AS SYSDBA
Connected.
SQL> SHUTDOWN TRANSACTIONAL

c.- Realice un rollback de la inserción en la sesión HR y salga.

HR SESSION
SQL> ROLLBACK;
Rollback complete.
SQL> EXIT;
ERROR:
ORA-01089: immediate shutdown in progress - no operations are
permitted
JServer Release 9.0.0.0.0 - Beta (with complications)
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.1.0
- 64bit Productn
With the Partitioning, Oracle Label Security, OLAP and Oracle
Data Mining optios
JServer Release 9.2.0.1.0 - Production

¿Qué le ocurre a la sesión HR?
Se recibe un mensaje ORA-01089. El usuario HR no puede salir (EXIT) porque el usuario SYS ha emitido una sentencia SHUTDOWN TRANSACTIONAL. No se permite ninguna otra operación.

¿Qué le ocurre a la sesión SYS?
Cuando la sesión HR completa un ROLLBACK,la sesión SYS cierra la base de datos.

SYS SESSION
Database closed.
Database dismounted.
ORACLE instance shut down.

La sesión HR se desconectará basándose en el comando EXIT.

HR SESSION
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.1.0
- 64bit Productn
With the Partitioning, Oracle Label Security, OLAP and Oracle
Data Mining optios
JServer Release 9.2.0.1.0 - Production

7.-
a.-  Inicie la base de datos en la sesión de usuario SYS.

SYS SESSION
SQL> STARTUP
ORACLE instance started.
Total System Global Area 26706720 bytes
Fixed Size 729888 bytes
Variable Size 20971520 bytes
Database Buffers 4194304 bytes
Redo Buffers 811008 bytes
Database mounted.
Database opened.

b.-  En la sesión telnet abierta, inicie SQL*Plus y conéctese como usuario HR.

Nota: Mantenga las dos sesiones SQL*Plus abiertas, una como usuario SYS y otra como usuario HR.


c.- Como usuario SYS, active una sesión restringida.

SYS SESSION
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
System altered.

d.-  Como usuario HR, realice un SELECT en la tabla REGIONS. ¿Se ha realizado la operación SELECT correctamente?

HR SESSION
SQL> SELECT * FROM regions;
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa

e.- Salga de la sesión y, a continuación, vuélvase a conectar como HR. ¿Qué sucede? El usuario HR no tiene el privilegio RESTRICTED SESSION y, por lo tanto, no puede conectarse.

HR SESSION
SQL> EXIT
Disconnected from Oracle9i Enterprise Edition Release
9.2.0.1.0 - 64bit Productn
With the Partitioning, Oracle Label Security, OLAP and
Oracle Data Mining optios
JServer Release 9.2.0.1.0 - Production
SQL> CONNECT HR/HR
ERROR:
ORA-01035: ORACLE only available to users with RESTRICTED
SESSION privilege
Warning: You are no longer connected to ORACLE.

f.-  Como usuario SYS, desactive la sesión restringida.

SYS SESSION
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;
System altered.

g.-  Salga de la sesión telnet de HR

HR SESSION
$ EXIT
This session is no longer connected.

Creando Un mini WebService en PHP -> JSON-JSONP

Bueno hoy un poco aburrido hice este pequeño código en PHP para crear un mini WebService JSON-JSONP con base de datos ya creadas.

Para eso usaré una clase muy buena para la Base de datos “mysql-database-class-wrapper“. Para esa clase hice una función que consulta, y los resultados  los muestra como JSON o JSONP, acá la “function”:

#-#############################################
# autor: Esteban Fuentealba
# description: Con esta funcion podrás consultar y devolver el resultado en JSON
# params: Consulta SQL, nombre del callback
# returns: JSON
function query2JSON($sql,$callback='') {
	$rows = $this->fetch_all_array($sql);
	$total_rows=count($rows);
	$i=0;
	$str=$callback."({\r\n\tstatus: \"".(($this->query_id != 0) ? 1 : 0)."\",\r\n\titems: [";
	foreach($rows as $k){
		$j=0;
		$total_colums = count($k);
		$str .= "\r\n\t\t{ ";
		foreach($k as $key => $val) {
			$str .= $key." : \"".$val."\"";
			$j++;
			if($j<$total_colums) $str .= ",";
		}
		$str .= " }";
		$i++;
		if($i<$total_rows) $str .= ",";
	}
	$str .="\r\n\t]\r\n})";
	return $str;
}

Con la clase DataBase.class.php lista ahora vamos a nuestra base de datos y creamos una nueva tabla

CREATE TABLE Method (
			name	VARCHAR(100) PRIMARY KEY,
			tabla	VARCHAR(100),
			sentence	TEXT
		);

Ésta tabla guardará todos los métodos de nuestro WS casero xD.

Ahora vamos con el codigo en PHP , este archivo recibirá los parámetros por el metodo GET y me mostrará los resultados en JSON.

<?PHP
	//###
	//	@Autor	: 	Esteban Fuentealba
	//	@Url	:	https://estebanfuentealba.wordpress.com/
	//	@Email	:	mi [dot] warezx [at] gmail [dot] com
	// Ejemplo:		api.php?method=user.getNombre&id=<rut>
	//###

	//## Configuracion de la Base de datos
	require_once 'config.inc.php';
	//## Clase Base de Datos
	require_once 'class/Database.class.php';
	//## Obtengo los parametros pasados por el metodo GET
	$params	= $_GET;
	//## Si los parametros son mas de 0
	if(count($params) > 0) {
		//## Creo un objeto de Base de datos, con los parametros de configuración
		$db = new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
		$db->connect();
		/*
			CODE
			200 OK
			202	OK pero sin resultados
			404	Method no existe
			405 ERROR Method nombre
		*/
		if($params['method']) {
			/*
				## Corto el parametro method en '.' y asi obtengo:
					- [0] 	nombre de la Tabla
					- [1]	nombre del WebService
			*/
			$data = explode('.',$params['method']);
			if(count($data) == 2) {
				//## Compruebo si el metodo del WS existe en la base de datos
				$rows = $db->query_first("SELECT * FROM Method WHERE tabla='".$data[0]."' AND name='".$data[1]."'");
				if($rows['sentence']) {
					//## Busco y reemplazo los parametros {ejemplo} por los parametros pasados por metodo GET
					preg_match_all('#\{(.[^\}]+)\}#',$rows['sentence'],$r);
					$sentenceSQL = $rows['sentence'];
					foreach($r[1] as $param) {
						$sentenceSQL = str_replace('{'.$param.'}',(is_numeric($params[$param])) ? ((int)$params[$param]) : "'".$db->escape($params[$param])."'",$sentenceSQL);
					}
					if($db->affected_rows>0) {
						//## Consulto la bd segun la sentencia y los resultados los muestro como JSON
						echo $db->query2JSON($sentenceSQL,$params['callback']);
					} else {
						echo '{ status :"ok",code: 202 }';
					}
				} else {
					echo '{ status :"error",code: 406 }';
				}
			} else {
				echo '{ status :"error",code: 405 }';
			}
		} else {
			echo '{ status :"error",code: 404 }';
		}
		$db->close();
	}
?>

Con eso ya podemos Usar nuestro WebService. la forma de uso es la siguiente:
Ejemplo:

api.php?method=tabla.nombreMethod&param1=valor1&callback=holaMundo

Ahora dejaré 3 archivos que hice para testear y agregar WebServices (Usenlos solo para Agregar metodos a los WS y luego los eliminan ya que no están validadas ni limpiadas las consultas)

Primero dejo este archivo PHP que agregara los WS a nuestra base de datos
Archivo: addApi.php

<?PHP
	require_once 'config.inc.php';
	require_once 'class/Database.class.php';
	$db = new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
	$db->connect();
	$name			= $_POST['name'];
	$tabla			= $_POST['tabla'];
	$query			= $_POST['query'];
	$in['name'] 	= $name;
	$in['tabla']	= $tabla;
	$in['sentence']	= $query;
	$db->query_insert('Method',$in);
	$db->close();
?>

Ahora les dejo el archivo que testea las consultas:
Archivo: queryTest.php

<?PHP
	require_once 'config.inc.php';
	require_once 'class/Database.class.php';
	$sql	= $_GET['query'];
	$db = new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
	$db->connect();
	echo $db->query2JSON($sql);
	$db->close();
?>

y por ultimo la pagina con el formulario para crear los webservice

<html>
<head>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
	<script type="text/javascript">
		$(function() {
			getSQL("SHOW TABLES","json",function(data) {
				$.each(data.items,function(i,it) {
					if(it.Tables_in_api != 'method') {
						$('<option>').attr('value',it.Tables_in_api).append(
							it.Tables_in_api
						).appendTo(
							$('#tables')
						);
					}
				});
			});
			$('#tables').change(function() {
				var thisTable = $(this).val();
				if(thisTable != "-1") {
					var sql = 'SELECT ';
					var fields = new Array();
					getSQL("DESC "+thisTable,"json",function(data) {
						$.each(data.items,function(i,it) {
							fields.push(it.Field);
						});
						sql += fields+" FROM "+thisTable;
						$('#query').val(sql);
					});
				}
			});
			$('#query').keyup(function(event) {
				var url = $('#query').val();
				var re  = /\{(.[^\}]+)\}/g;
				var match;
				var html = $('<fieldset>').append('Parametros:').attr('id','parametros');
				while (match = re.exec(url)) {
					$('<div>').append(
						match[1]+" "
					).append(
						$('<input>').attr('type','text').attr('id','{'+match[1]+'}')
					).appendTo(html);
				}
				$('#params').html(html);
			});
			$('#qTest').click(function() {
				var sql = $('#query').val();
				$.each($('#parametros :input'),function(i,item) {
					sql = sql.replace($(this).attr('id'),$(this).val());
				});
				getSQL(sql,"html",function(data) {
					$('#out').html(data);
				});
			});
			$('#qAdd').click(function() {
				$.post('addApi.php',{
									name: $('#name').val(),
									tabla: $('#tables').val(),
									query: $('#query').val()
				},function(data) {
					$('#boxB').html('OK').hide('slow');
				});
			});
			$('#name').blur(function() {
				getSQL("SELECT * FROM Method WHERE name='"+$(this).val()+"' and tabla='"+$('#tables').val()+"'","json",function(data) {
					if(data.items.length > 0) {
						alert('Method ya existe');
						$('#name').val('');
					}
				});
			});
		});
		function getSQL(sql,type,callback) {
			$.ajax({
				type: "GET",
				url: 'queryTest.php',
				data: 'query='+sql,
				dataType: type,
				success: callback
			});
		}
	</script>
</head>
<body>
<form>
	<fieldset>
		WebService Name:
		<select id="tables">
			<option value="-1">Tablas:</option>
		</select>.<input type="text" id="name" />
	</fieldset>
	<fieldset>
		WebService Query:
		<textArea id="query" style="width: 100%; height: 50px;"></textArea>
	</fieldset>
	<div id="params"></div>
	<input id="qTest" type="button" value="Test Query" />
	<input id="qAdd" type="button" value="Agrega WebService" />
</form>
<div id="box">
	<textArea id="out" style="width: 100%; height: 500px;"></textArea>
</div>
<div id="boxB"></div>
</body>
</html>

Acá les dejo una ScreenShot del sistema montado en mi netbook.

Selecciono la tabla, le agrego un nombre a mi Method , ingreso la consulta SQL y testeo. La consulta SQL puede tener Parametros , ejemplo en la ScreenShot definí un parametro entre llaves {id}, ese parametro lo asignaré cuando llame al WebService api.php.Dejo el Ejemplo de la llamada al WebService en la siguiente Imagen:

En la tabla user tenía 2 registros la id=1 pertenece al usuario caca Bueno ese es un ejemplo básico, ustedes pueden darle el uso que quieran.

Espero que les sirva esta pequeña aplicación. solo es una idea y la primera versión, debe tener muchos errores pero si alguien quiere aportar con alguna idea o mejora estará bien.

Saludos!.

Demo WebService :

Codigo de Fuente WebService: Webservice.EstebanFuentealba.rar

Categorías:PHP Etiquetas: , , , , , , ,

Invitaciones para Lockerz

Desde hace unas semanas que algunos amigos me comentan sobre Lockerz, una empresa de EEUU que a simple vista regala premios, algunos muy caros, solo por responder unas simples preguntas y entrar a diario a su web.

Lo que es seguro es que no son un scam ni estafadores, es solo un modelo de publicidad para luego lanzar una tienda online real para venta de objetos tipo Amazon, pero por el momento no paran de enviar regalos a todo el mundo.

Videla fue quien me dio la invitación y desde hace unos días lo estoy probando, y es realmente sencillo como responder por ejemplo esto:

Como funciona Lockerz?

Siendo user común entras y presionas sobre la fecha que aparece abajo a la izquierda ganas 2 PTZ (abreviación de pointz) y 2 PTZ más por responder la pregunta diaria, no sumas puntos si respondes una pregunta vieja, aunque estas seguirán estando en tu panel. Además 2 PTZ por cada amigo referido.

Si alcanzas la suma de 20 amigos invitados y activos pasas a ser un miembro de la Z-List y con ello te envían una polera de regalo, por eso durante el registro te piden el talle cosa muy rara que nunca vi en otro formulario de registro, y en vez de sumar 2 PTZ (preguntas, clic en fecha y referidos) sumas 4 PTZ.

Como se canjean los premios?

Hay días especiales llamados “Redeem Time”, tienes que estar atento porque el stock de productos no suele ser muy grande y el tiempo de canje no supera los 5 minutos, si eres un afortunado veras la pantalla de “Fresh out”, donde deberás corroborar tus datos de registro y completarlos en el caso de que falte algo.

Que premios hay?

Acá la parte jugosa, los premios en Lockerz van desde dinero en Paypal o Amazon, pasando por una sección de merchandising hasta lo mejor, una colección de gadget que cualquiera desearía: iMac, Macbook,iPad, iPod Touch, Apple Magic Mouse, PS3, Wii, Xbox,PSP y un par más de cosas muy buenas.

Y no son premios inalcanzables, por ejemplo un “New iPad” se canjea por 3500 PTZ.

Como puedo registrarme en Lockerz?

Por el momento no puedes ir a la web y registrarse directamente, necesitas de una invitación, si quieres una invitación para Lockerz deja tu comentario (CON EMAIL) y la enviare lo más pronto posible.

Saludos!

Categorías:Utilidades Etiquetas: ,