Archivo

Posts Tagged ‘PHP’

MySQL Mapping DataBase

noviembre 15, 2010 1 comentario

Mucho tiempo sin escribir, Estaba trabajando en ATLConsultores , con DTE del SII y muchas cosas en DuocUC
Ademas, estaba haciendo un sistemita en PHP para Mapear y asi poder crear Modelo,Controlador y Vistas (MVC) a partir de la estructura de una base de datos en MySQL.

Aqui dejare las consultas SQL del Mapeador para que la ocupen en algunos proyectos…

Mostrar Todas las tablas de una base de datos

SHOW TABLES

Muestra la estructura de una tabla

DESC <NombreTabla>

Obtener las Constraints de una Tabla (FK,UNIQUE,DELETE-UPDATE ON CASCADE)

SELECT 	K.constraint_name,
		K.table_name 	AS 'local_table',
		K.column_name 	AS 'local_column',
		K.referenced_table_name		AS	'foreign_table',
		K.referenced_column_name	AS	'foreign_column',
		RC.update_rule,
		RC.delete_rule,
		RC.unique_constraint_name 
	FROM 	information_schema.referential_constraints RC 
		INNER JOIN information_schema.key_column_usage K 
		ON K.constraint_name = RC.constraint_name 
		WHERE 	K.table_name = '<NombreTabla>' 
		AND	RC.constraint_schema='<BaseDeDatos>'

Bueno , ese es mi aporte , espero que les sirva…

Saludos!

Anuncios
Categorías:SQL Etiquetas: , , , ,

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!

Categorías:PHP Etiquetas: , , , ,

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: , , , , , , ,

Mp3Spider (Java) ScreenShot

Hoy estuve dando un POOco de jugo (programando) y este es el resultado de lo que llevo hasta el momento:

screenshot  del Proyecto Mp3Spider 2010 Open Source (Java)

Hasta el Momento:

  • Creado motor de Búsqueda / Descarga
  • Creado servidor (proxy)
  • Creado Mp3 Player
  • Busca y reproduce mp3s
  • Muestra Discografías de Artista
  • Interfaz gráfica (penca)

Bugs o Mejorar:

  • Mejorar Servidor Web (Proxy)
  • Crear hilos en la búsqueda de discografías y demás
  • Interfaz Gráfica
  • Filtro (funcionaba y no se que movi xD)
  • Obtener la duración (tiempo) exacta del mp3
  • optimizar todo
  • manejar de mejor forma los hilos
  • Paginar los resultados
  • ScrollerText xD

Se viene:

  • Busqueda de Artistas Similares
  • Busqueda de Tracks Similares
  • Busqueda de (Información || Biografía) Artista
  • Sistema de Usuarios (PHP)
  • Crear Base de datos (Artista,Track,Disco,Usuario,PlayList,etc) (para guardar la información)
  • Reproducción de FLV (para poder reproducir videos musicales de Youtube)
  • ¿ Agregar Descarga de Archivos ?
  • Agregar Motores de Busqueda
  • Mejorar la Interfaz Gráfica
  • Crear PlayLists Locales (pls,aux,mua) y Web (xml,pls,aux,xspf)
  • AutoUpdater

Link del Proyecto: http://kenai.com/projects/mp3spider/

Registrate en kenai y únete

Dudas, Sugerencias e Ideas  Acá.

Saludos!

SMS Gratis Via MSN Bot [Movistar/Entel]

Ayer empece a hacer este Bot para msn con el cual podrás enviar SMS a Movistar y Entel.

Para poder Usarlo solo Debes agregarlo a tus contactos de messenger:

sms@estebanfuentealba.net

Una vez agregado y cuando lo veas en linea podrás escribirle los siguientes comandos:

LOGIN [password]

Con este comando te logueas a tu cuenta de SMS (Debes pedirme que te agregue a los usuarios del bot)

SEND [no] [msg]

Envia un SMS al celular [no] con el mensaje [msg] (El celular debe tener un largo de 8 digitos)

STATS

Muestra tus estadisticas

SETNAME [nickname]

Setea un nickname para agregarlo al mensaje

Espero que les sirva,

Saludos!

Categorías:Proyectos Etiquetas: , , , , , , , ,

Certamen 2 DAI4501 [PHP/SESSION/JAVASCRIPT/CAPAS]

diciembre 7, 2009 2 comentarios

Acá dejo el último certamen de Desarrollo de Aplicaciones para Internet (DAI4501) de la profesora Yasna Meza

Enunciado:

Considerando la siguiente tabla de datos y su correspondiente diccionario de datos:

Se  pide  construir  una  aplicación  en  PHP  usando  capas  que  permita  cumplir  con  los
siguientes requerimientos:
R01 – Inicio y cierre de sesión
R02 – Agregar registros a la tabla de datos
R03 – Modificar registros de la tabla de datos
R04 – Listar todos los registros de la tabla
R05 –  Listar  usando  como  criterio  de  búsqueda  un  rango  de  sueldo.  El  sueldo  del profesor se calcula de acuerdo a la siguiente fórmula:
SUELDO = NÚMERO HORAS * VALOR HORA
OBSERVACIONES
·  DEBERÁ tener en consideración todas las validaciones
·  La base de datos DEBERÁ llamarse C2

Codigo de Fuente:
http://estebanfuentealba.net/archive/Certamen2-DAI-Esteban-Fuentealba.rar

Saludos!

Servicios para Twitter [Noticias / ChileComparte.cl ]

Dias sin escribir, plagado con proyectos ,certámenes y trabajos xD …

Y vuelvo para presentar estos 3 servicios que hice en PHP con la API de Twitter

Las 2 Primeras son para mantenerse informado minuto a minuto, con las noticias de Radio Cooperativa y CNN Chile

Links:

Noticias Cooperativa: http://twitter.com/coperativa_news

Noticias CNN Chile: http://twitter.com/cnn_chile_news

 

El ultimo servicio es para ver los últimos temas de ChileComparte sección Mp3z

Link:

ChileComparte Mp3z: http://twitter.com/chilecompartemp

 

Saludos!