Solución al error de codificación para PHP/MySQL

Bueno... hoy he estado un buen rato "haciendo nada", nunca mejor dicho... uno de esos problemillas que nunca sabemos porque suceden.. y que todo el mundo en la web encuentra solución menus tu -.-"

Bueno el tema estaba en un problema con la codificación, se veia el tipico rombo negro con un ? que te saca de quicio....

Lo mas divertido es que tenia el meta con utf8, la bd con utf8_general_ci y todas las tablas sin contar que la BD guardaba los datos correctamente y que solo habia problemas al mostrarlos, pero, oh! si escribias un echo "ó"; en el php se ve perfectamente!

Enfin que tras 2 horas buscando en los archivos de configuración de Apache y MySQL, pues el error tenia que estar en la transferencias de estos, me encontré con un artículo interesante y que me solucionó el problema.

La broma se trata de agregar

<?php
@mysql_query("SET NAMES 'utf8'");
?>


directamente después del mysql_select_db()

Por lo que un code de ejemplo será:

<?php
//Consultas a la BD   
   
$con = db_connect();
   
mysql_select_db($db, $con) or die(mysql_error());
   @
mysql_query("SET NAMES 'utf8'"); //totalmente necesario -.-"
?>


y ya tenemos una codificación perfecta en nuestra web...
eso si, con una hora menos para trabajar en lo realmente importante...

enfin me voy a la ducha xD

Comentando el code: Milw0rm Feeder

Bueno como no sabia de que escribiros hoy, y ya hacia unos días que no actualizo las entradas, pensé que seria buena idea idear una "sección" de comentarios sobre codes.

Hoy os traigo un Milw0rm Feeder que encontré por Bl4ck-P0rtal el code en cuestión es:

<?php
#goast BHF

#modules
define('MILW0RM','10:milw0rm.com/rss.php:Milw0rm');

function 
goast_rss($type,$i)
{
 
$type = explode(':',$type);

 
$xx = file_get_contents('http://'.$type[1]);

 if(
$type[0]>$i){'ERROR:The MAX listing of module '.$type[3].' is set to '.$type[0];}

 
$CRUNCH = 0;

 while(
$CRUNCH<=$type[0])
 {
  
$x[0] = explode('</item>',$xx);
  
$x[1] = explode('<item>',$x[0][$CRUNCH]);
  
$x[2] = explode('title',$x[1][1]);
  
$x[3] = explode('link',$x[1][1]);

  
$xtitle = substr($x[2][1],1);$xtitle = substr($xtitle,0,strlen($xtitle)-2);
  
$xurl = substr($x[3][1],1);$xurl = substr($xurl,0,strlen($xurl)-2);

  
$out = "<a href='$xurl'>$xtitle</a>";

  
$CRUNCH+=1;
  
$data[$CRUNCH] = $out;
 }

 return 
$data[$i];
}

echo 
goast_rss(MILW0RM,1).'<p />';
echo 
goast_rss(MILW0RM,2).'<p />';

?>


Por funcionalidad no hay nada que objetar, el código funciona
A simple vista se entiende que la sintaxis es: goast_rss("url", "numero de entrada");
Por lo que podemos recomendar que, en vez de el numero de entrada se especifique la cantidad de entradas a ver y a partir de cual... algo así goast_rss("url","cantidad", "inicio");

El tema de crearlo como una función, al principio lo vi con malos ojos, pero si tenemos en cuenta que así el code puede ser reutilizado no hay problema alguno.

El tiempo de ejecución es algo elevado: 1.3430 segundos, elevado entiendase en un localhost y un code tan corto.

Como "cosa curiosa" destaco el uso de file_get_contents() para capturar el HTML de la página y no usar el módulo SimpleXML para tratar con la dirección: http://milw0rm.com/rss.php de una forma mas eficaz.

Conclusión: Es un código aceptable, e interesante para practicar las funciones explode() y substr(). Pero en mi opinión podria ser mejor y más simple usando simpleXML

Diferencias entre Myisam y InnoDB

Me encuentro diseñando un par de aplicaciones y este es un tema que siempre te planteas, cual tengo que utilizar?

Una forera de elhacker.net (^Tifa^) me recomendó un servidor con InnoDB para consultas Insert y Update y otro con Myisam para Select, pero claro... no todos podemos permitirnos tal cosa, y yo menos.

Así que en base a ciertos valor tendremos que "jugarnosla" por uno de ellos.
Vamos a exponer los principales puntos que se comentan en la red, que no todos, pues no soy ningún experto.

InnoDB:
- En general se recomienda para consultas Insert y Update por su integridad a la hora de guardar datos
- Lo que lo convierte en mas lento
- Pero mas seguro (bajo cortes de luz, por ejemplo, si la consulta no se ejecutó completamente no se guarda y así no recibimos la mitad de los datos corruptos)
- También tiene las Foreng Keys (FK), lo cual lo hace muy util para una base de datos optimizada

Myisam:
- Se recomenda para aquellos diseños en los que suele haber mas SELECT que no Insert o Update
- No garantiza la integridad de nuestros datos,
- lo cual lo convierte en mas rapido
- pero menos seguro a lo que datos se refiere
- Quizá su mayor desventaja es que no tiene las preciadas FK
- Los Text se indexan con mayor desempeño, lo cual permite crear una "specie de buscador" mas eficiente que en InnoDB

A grandes rasgos quizá esto sea lo mas importante a destacar

Conclusión propia:

Mi conclusión es siempre decantarme por InnoDB (si necesito FK), soy un negado del SQL si algún dia le meto mas tiempo y aprendo a usar los TRIGGERS quizá mi visión del mundo cambie. De momento prefiero utilizar InnoDB y sus amadas FK para mis base de datos relacionales.

Conclusión de otras entidades:
Otros blogs, web, docuemntos, dicen que si tu sitio es mas propenso a recibir datos que no a mostrarlos, tu motor es InnoDB, como el caso no se suele producir frecuentemente, por regla general el motor a usar es myisam.
Quizá lo lógico, bajo esa perspectiva, es tener alguna tabla tipo un log de acciones con un motor InnoDB y el resto usando myisam.

En definitiva, cada uno escoja lo que mas le convenga de acuerdo a su necesidad o gustos. El post pretende ser una guia para empezar a tomar conciencia de que es cada motor y en que se diferencian. A partir de este punto queda investigarlos un poco mas y tomar la decisión de cual de ambos necesita nuestra aplicación.

Que tan licitas son tus patentes?

Hoy, o mejor dicho ayer xD, en una discusión en elhacker.net, se discutia sobre que tan útil/lógico/moral es el colocar una patente o derecho de autor, creditos y demás comentarios sin importancias a aquellos códigos simples y muy comunes.

Bueno la discusión original derivó en muchas secundarias que no eran el objetivo, pero desde aquí me gustaria dejar mi opinión respecto al tema.

Como primer punto decir que a todos nos gusta que nos reconozcan el trabajo que realizamos, pero, reconocemos el trabajo que otros hacen?
Un ejemplo de no hace mucho, yo estoy trabajando en un código para saltar un captcha (como pasatiempos) el captcha en cuestión es de shell root, la pregunta es: ¿te molestarias en colocar un comentario al principio de la función explicando que el code de captchas es suyo?
En mi caso la respuesta es sí. Me parece un punto importante, dado que si quieres que te reconozcan, reconocer el trabajo de otros es importante.

Ahora, ¿crees que es lógico patentar o poner una licencia GPL a una función de 5 lineas que te encuentras en casi cualquier script?
Mi respuesta es no, como podemos siquiera pensar en patentar una función que todo el mundo usa y existe, probablemente, antes de que yo empezara a programar?
Recuerdo que las licencias GPL autorizan la modificación y la distribución del código siempre y cuando se nombre el autor original, ahora, el punto es: ¿quien es el autor original? una patente que es tan común como ir a trabajar a diario... no tiene un autor original...

En conclusión creo que patentar código de 5, 10 y 20 líneas es una auténtica pérdida de tiempo...
en mi opinión un:
//Coded by Nax to bl4ck-p0rtal.org
es mas que suficiente para casi cualquier script sin demasiada importancia o impacto...

Perder el tiempo, y perder lineas de code, poniendo una licencia que luego pierde todo sentido es cosa de egocentricos que se creen que el único code que existe es suyo y que nadie se olvide de nombrarlo...

Es mi humilde opinión, claro que no estoy hablando de codes extraodinarios o clases impresionates.... ni mucho menos de proyectos como SMF a los cuales me parece apropiada las licencias que usan.

Con este artículo me despido de ustedes hasta el Lunes.
Tengan un buen fin de semana.

Curso PHP 5 || V. Declaracion y llamado de funciones

Actividades IV

1.   Con  datos inventados crea array para los diferentes casos:
a)   La nota y el ID de cada estudiante según su grupo


<?php
$estudiantes 
= array( 'group1' => array ('user1' => array ('nota' => 4,
                                             
'id' => 1),
                               
'user2' => array ('nota' => 6,
                                             
'id' => 2)
                               ),
                
'group2' => 'etc');
?>


b)   Cantidad de stock de cada producto en una tienda

<?php

$tienda 
= array( 'product1' => 'stock',
             
'product2' => 10);
?>


c) Nombres de las personas de tu familia

<?php

$familia 
= array ('name1', 'name2', 'name3');

?>


d) Nombre edad y parentesco con las personas de tu familia

<?php

$family 
= array ( 'hermano' => array('juan', 'esteban'),
              
'hermana' => 'julia',
              
'padre' => 'ernest',
              
'madre' => 'juana');
?>


Este último también se podía hacer tipo el de la tienda.


VII.    Creando Funciones propias

A día de hoy, está muy bien visto el reutilizar código.
Si tenemos una determinada acción que se repetirá más de una o dos veces y que los cambios en ambos procesos son menores quizá nos convenga crear una función para dicho proceso y así evitarnos líneas repetitivas y errores en la programación.
Los argumentos de una función son datos extra que le pasamos a esta para que realice la acción, si por ejemplo tenemos una función que muestra un mensaje envuelto en etiquetas h1, el argumento a enviarle es el texto a mostrar.

Tenemos 2 tipos de funciones:

-   De dirección única: A las cuales podemos, o no, pasarle argumentos pero no devuelven un valor
-   De dos direcciones: a las cuales le pasamos argumentos y nos retornan un valor.

Para este último podríamos tener una función de comprobación de usuarios y en caso de coincidir los datos devuelve true o false si alguno es incorrecto.

Las variables dentro de una función son distintas a las de fuera de la función, como si vivieran en mundos separados. Este apartado se explicará más adelante, pero es importante tenerlo presente.

Declarar y llamar funciones:


Como habrá notado, todo (o casi todo) en PHP son funciones, como echo printf o strcasecmp, los parámetros que les enviamos funcionan de la misma manera que lo harán nuestras funciones.
Para declarar una función usaremos la palabra function seguida del nombre que asignemos a la función y los paréntesis, estos no son obligatorios pero ayudan a la comprensión del código por lo que es recomendable ponerlos.

Inserta ste codigo en tu site:
<?php
function page_header() {
   echo 
'<html><head><title> MI pagina web</title></head>
        <body bgcolor="#ECE6B4" text="#ffffff">'
;
}
page_header();

?>


Este código es un ejemplo de la declaración de una función, su cometido es imprimir el código HTML del head de nuestras páginas web.
La forma de llamar a la función es la última línea.
Los nombres de las funciones siguen la misma regla que los de la variable, empiezan por una letra o un subrayado y pueden contener letras, números y subrayados.
Las funciones pueden ser llamadas antes o después de ser declaradas y funcionan de igual forma.
En el código siguiente se aprecia como una función es llamada antes de ser declarada sin problema alguno.

<?php

function page_header() {
   echo 
'<html><head><title> MI pagina web</title></head>
        <body bgcolor="#ECE6B4" text="#ffffff">'
;
}


page_header();
page_foot();

function 
page_foot() {
   echo 
'</body></html>';
}
?>


Enviar parámetros a las funciones

Ahora nos planteamos, ¿Qué pasa si queremos que el título de la web sea diferente para cada sección?
Para conseguir eso utilizaremos los argumentos.


<?php

function page_header($title="indice") {
   echo 
'<html><head><title>MiWeb || '.$title.'</title></head>
        <body bgcolor="#ECE6B4" text="#ffffff">'
;
}

page_header("Seccion 1");


?>


En el código podemos notar 2 grandes diferencias:
En la línea que declaramos la función agregamos un $title=”índice” entre paréntesis.
$title es el nombre que adquirirá la variable e índice el valor en caso de que al llamarla no se proporcione uno.
Si no agregamos el valor por defecto, y dejamos algo como page_header($title), al llamar la función obtendremos un error por falta de parámetros.

Y una cosa más, los valores por defecto no pueden ser variables.
Para pasar múltiples parámetros a una función solo hay que concatenarlos con comas.

<?php

function page_header($title="indice", $fondo, $text='#ECE6B4') {
   echo 
'<html><head><title>MiWeb || '.$title.'</title></head>
        <body bgcolor="'
.$fondo.'" text="'.$text.'">';
}

page_header("Seccion 1", "#ffffff");

?>


Es recomendable, y una buena práctica, que los parámetros obligatorios se sitúen al principio de la declaración (es decir, en el ejemplo, $fondo sería el primer parámetro).

Retornar valores de una función

No sería lógico decir que una función puede retornar valores y no enseñar cómo.
El retorno de datos se hace con la sentencia return y solo puede ejecutarse un return por sentencia (pero puede haber varios) ya que al ejecutarse el primer return el programa sale de la función

<?php

function suma5 ($value) {
   
$value = $value + 5;
   return 
$value;
}

echo 
suma5(6);
?>


A esta función se le envía un valor (6) y le suma 5 y devuelve el resultado.
El retorno se puede enviar directamente a una función o almacenarlo en una variable.

Entendiendo el ámbito de las variables.

La forma más fácil de entender este apartado es con ejemplos, así que me voy a matar poco en la explicación.
Las funciones tienen variables de ámbito privado o local, eso quiere decir que si en una función usamos la variable $count y dicha variable no está definida fuera, la variable no existirá.
Así mismo si en el programa principal usamos la variable $precio, y dicha variable no está definida en la función, la variable no existirá.
Veamos unos ejemplos:

<?php
function ambito() {
   echo 
$numero;

}
$numero = 5;
echo 
ambito();

?>


En este ejemplo no hay salida ya que la variable $numero no fue declarada en la función.

<?php
function ambito() {
   
$numero = 3;
   echo 
$numero.'<br />';

}

echo 
ambito();
echo 
$numero."!!!!";

?>


Aquí vemos como en el echo de la función sí que está declarada (pues la declaramos arriba), pero fuera ya no.
Por si aún se alberga alguna duda:

<?php
function ambito() {
   if (!
$numero)
      
$numero = 3;
   echo 
$numero.'<br />';

}
$numero = 1;
echo 
ambito();
echo 
$numero."!!!!";

?>


Este último ejemplo un poco más elaborado, da el valor 1 a $numero, llama a la función.
En la función, si el valor $numero no está definido lo define a 3 y lo muestra, sale de la función.
Muestra el valor de $numero.

Si probáis el código, ya no deberíais albergar duda sombre el ámbito de las variables.

Pero… ¿Qué pasa si quiero usar una variable de fuera de la función?

Esta pregunta tiene 2 respuestas:
- Si el objetivo es proporcionar alguna información, podemos pasarlo como parámetro
- Si el objetivo es modificar la variable original podemos usar las 2 formas siguientes:

<?php
function ambito() {
   global 
$numero;
   echo 
$numero.'<br />';
   
$numero = 4;

}
function 
ambito2() {
   echo 
$GLOBALS['numero'];
}
$numero = 3;
ambito();
ambito2();


?>


En estas 2 funciones comprobamos las 2 formas de acceder a una variable externa.
En ámbito, comprobamos como podemos alterar el número original mostrando así el número modificando en ambito2.

$GLOBALS[] es uno de los tantos arrays que existe dentro de PHP, este contiene todas las arrays globales del script.

Actividades V

Crea un programa en PHP a forma de calculadora utilizando el mínimo de funciones posible.

Crea un programa en PHP en el que tengas que exponer todo lo aprendido en este apartado



Versión .doc: Funciones.doc
Versión .pdf: Funciones.pdf