03/11/2011

Optimizando sentencias a mysql

Voy a mostrar un ejemplo de como optimizar tus consultas a una base de datos mysql. Para esto trabajaremos un clase en php muy sencilla.

Esta clase nos permitira crear desde luego un objeto y reutilizar los resultados de un select. De igual manera podremos ahorrar algunas lineas de codigo en los bucles, cosa que en lo personal me parece latoso.

A continuación un idea:


class DMysql {
// Clase para optimizar consultas a mysql
// Por Daniel Gerardo Sánchez
// www.danger.com.mx - dangercito@hotmail.com - @DangerCheshire
var $con;
var $bd;
var $msg;

function conexion($host,$db,$user,$pass){
$this->bd = $db;
if($this->con = mysql_connect($host,$user,$pass)){
if(mysql_select_db($db, $this->con)){
$this->msg = 'Se conecto.';
}else{
$this->msg = 'No se pudo conectar.';
}
}else{
$this->msg = 'No conecto al servidor.';
}
}

var $rows;
var $select;
function select($s){
$q = mysql_query($s,$this->con);
$this->rows = mysql_num_rows($q);
$this->select = '';
for($i=1;$i<=$this->rows;$i++){
$this->select[$i] = mysql_fetch_array($q);
}
return $this->rows;
}

function sql($s){
$q = mysql_query($s,$this->con);
}
}

Partiendo de esta idea de clase, podriamos hacer la impresión de un select, de la siguiente manera:


// Quiza esto lo jalamos desde inc..
include('DMysql.php');
$a = new DMysql();
$a->conexion('localhost','db','user','pass');
// End

// Aquí seria lo productivo de la clase
for($i=1;$i<=$a->select('SELECT * FROM `tabla`');$i++){
echo $a->select[$i]['campo'].'
';
}

// Para todo lo que no sea select
$a->sql('..sentencia..');

Y listo, de esta manera tendriamos todo mas limpio, mas organizado y facil de mantener. Espero les sirva.

02/11/2011

Unir resultados de dos o mas tablas

El detalle que surge es cuando quieres unir el resultado de dos o mas tablas.

Por ejemplo, en mi caso tengo una base de datos para newsletter, en cada tabla almaceno contactos con diferente estructura pero con dos campos en comun; “nombre y correo”.

Sí quisieramos mostrar un solo listado, sin hacer un bucle diferente en cada consulta, ni escribir mas lineas de codigo, mas rapida, y SIN REGISTROS REPETIDOS… Seria de la siguiente manera;


SELECT `nombre`,`correo` FROM `tabla1` UNION DISTINCT
SELECT `nombre`,`correo` FROM `tabla2` UNION DISTINCT
SELECT `nombre`,`correo` FROM `tabla3`

Tan sencillo como eso!.

29/10/2011

If y elseif cortos en php

Sí tuvieramos algo como:


for($i=0;$i<=10;$i++){
if($i==9){
$res = true;
}else{
$res = false;
}
}

Podriamos optimizarlo un poco de la siguiente manera:


for($i=0;$i<=10;$i++){
$res = ($i==9) ? true : false;
}

Listo!

14/07/2011

Acceso denegado al pasar variable $_GET['']

Hace pocos días estuve experimentando con un proyecto de forma local, utilizando wamp.

Cuando subi el script al servidor en internet me mostro un error “Acceso Denegado.”, me puse a investigar y la verdad no encontre el porque me estaba pasando esto, enseguida me percate del problema. Como ejemplo les pondre el siguiente codigo:


echo 'Imprimir url: '.$_GET['url'];

Supongo que el host tiene algun parametro que aun desconozco cual sea (pnp.ini se me ocurre) y te manda el mensaje cuando le pasas por GET algo como “http://www.danger.com.mx”.

Cabe mencionar que el envio lo hacia con JQuery, algo parecido a lo siguiente:


...
$('#Contenedor').load('carga.php?url=http://www.danger.com.mx');
...

No me espere a que me respondieran en foros ó a martirizarme en google sin una respuesta. Asi que probe enviandolo como post. Quedo de la siguiente manera:


$.post('carga.php?varget=valor',$('#Form').serialize(),function(data){
$('#Contenedor').html(data);}
);

Asi pase una variable GET y pues el resto en POST, ya que las enviaba al hacer un onSubmit.

Y problema resuelto. Ojala les sirva.

Bienvenida.

Este es el inicio de algo bueno,

Asi que esten al pendiente porque aquí publicare experiencias y soluciones a problemas de programación y desarrollo que vaya teniendo.

No iniciare oficialmente sin antes postear un:


echo 'Hola mundo.';