Blog

Pasar de Mysql a Mysqli

Cambiar la conexión:

function db_conectar()
{
 $db = mysqli_connect($GLOBALS['configuration']['host'],$GLOBALS['configuration']['user'],$GLOBALS['configuration']['pass'],$GLOBALS['configuration']['db']);

if (!$db) {
 echo "Error: No se pudo conectar a MySQL." . PHP_EOL;
 echo "errno de depuración: " . mysqli_connect_errno() . PHP_EOL;
 echo "error de depuración: " . mysqli_connect_error() . PHP_EOL;
 exit;
 }
 else {return $db;}
}

Solo he tenido que hacer un replace con:

mysql_query(    —————->   mysqli_query($db,
mysql_num_rows( —————->    mysqli_num_rows(
mysql_fetch_array(  —————->   mysqli_fetch_array(
mysql_free_result(  —————->   mysqli_free_result(
MYSQL_ASSOC  —————->   MYSQLI_ASSOC
mysql_result(  —————->   mysqli_result(
mysql_real_escape_string( ——> mysqli_real_escape_string($db,

Como recuperar tu cuenta de Adsense inhabilitada por PII

Si ha recibido un correo por parte de Adsense avisandote de que “Aviso de incumplimiento de las políticas” tienes que darte prisa porque en menos de 1 mes tu cuenta puede ser inhabilitada, y volver a ser habilitada puede costarte mucho tiempo. Te explico mi experiencia que tuve que pasar para conseguir que me habilitaran la cuenta. Si ha recibido un correo por parte de Adsense avisandote de que “Aviso de incumplimiento de las políticas” tienes que darte prisa porque en menos de 1 mes tu cuenta puede ser inhabilitada, y volver a ser habilitada puede costarte mucho tiempo. Te explico mi experiencia que tuve que pasar para conseguir que me habilitaran la cuenta.
adsense
Un día te llega un correo “Aviso de incumplimiento de las políticas” con el siguiente texto: Un día te llega un correo “Aviso de incumplimiento de las políticas” con el siguiente texto:

Estimado editor:

Estimado editor:
Parece que se sigue enviando información de identificación personal (PII) a Google a pesar de las advertencias anteriores. Parece que se sigue enviando información de identificación personal (PII) a Google a pesar de las advertencias anteriores.
Según nuestros contratos y políticas, está prohibido enviarnos información que podamos reconocer como PII, incluidas las direcciones de correo electrónico o las contraseñas de los usuarios. Las cuentas que indicamos a continuación incumplen esta restricción y se han inhabilitado: Según nuestros contratos y políticas, está prohibido enviarnos información que podamos reconocer como PII, incluidas las direcciones de correo electrónico o las contraseñas de los usuarios. Las cuentas que indicamos a continuación incumplen esta restricción y se han inhabilitado:
ca-pub-XXXXXXXXXXXXX

ca-pub-XXXXXXXXXXXXX

Es el momento de ponerte manos a la obra para saber que esta sucediendo. En el mismo correo es posible que te adjunten la URL o URLs que estan siendo las conflictivas, en el fragmento de código verás algo así: Es el momento de ponerte manos a la obra para saber que esta sucediendo. En el mismo correo es posible que te adjunten la URL o URLs que estan siendo las conflictivas, en el fragmento de código verás algo así:

URL sample: http://www.tuweb.com/login.php?mail=redacted@example.com&codigo=RDQa5MnHDv

URL sample: http://www.tuweb.com/login.php?mail=redacted@example.com&codigo=RDQa5MnHDv

Básicamente lo que no quiere Adsense es que pases información personal por GET y esto puede suceder en estos casos: Básicamente lo que no quiere Adsense es que pases información personal por GET y esto puede suceder en estos casos:

    • validaciones de mail
    • validaciones de mail
    • formularios de login
    • formularios de login
    • validaciones de cuentas de usuario
    • validaciones de cuentas de usuario
    • permitir que se registren en foros con un mail
    • permitir que se registren en foros con un mail
    • etc…
    • etc…

Si Adsense no te ha pasado ningún dato sobre las URLs que estan causando el problema ponte en contacto con: adsense-support@google.com Si Adsense no te ha pasado ningún dato sobre las URLs que estan causando el problema ponte en contacto con: adsense-support@google.com
En esta dirección, generalmente te contestan en el día. En esta dirección, generalmente te contestan en el día.
Ya he hecho los cambios ¿que tengo que hacer ahora? Debes rellenar el formulario: https://support.google.com/adsense/contact/policy_disabled_appeal?hl=es Ya he hecho los cambios ¿que tengo que hacer ahora? Debes rellenar el formulario: https://support.google.com/adsense/contact/policy_disabled_appeal?hl=es
Si durante el periodo que te dan no has conseguido solucionar el problema, te llegará el mensaje que nadie quiere con título “Cuenta inhabilitada debido a una infracción de la política de identificación de usuarios”: Si durante el periodo que te dan no has conseguido solucionar el problema, te llegará el mensaje que nadie quiere con título “Cuenta inhabilitada debido a una infracción de la política de identificación de usuarios”:

Tu cuenta se ha inhabilitado por el envío de información de identificación de usuarios (PII) a Google. Te hemos enviado varios avisos acerca de este problema pero todavía no se ha resuelto. Puedes consultar los correos electrónicos de advertencia enviados por publisher-policy-no-reply@google.com con el asunto “Aviso de incumplimiento de las políticas” para obtener más información.

Tu cuenta se ha inhabilitado por el envío de información de identificación de usuarios (PII) a Google. Te hemos enviado varios avisos acerca de este problema pero todavía no se ha resuelto. Puedes consultar los correos electrónicos de advertencia enviados por publisher-policy-no-reply@google.com con el asunto “Aviso de incumplimiento de las políticas” para obtener más información.
Para nosotros es importante ayudarte a mantener tu cuenta en buen estado. Consulta la guía de nuestro Centro de ayuda para resolver el problema y para volver a obtener acceso a tu cuenta. Visita nuestro foro de ayuda para obtener más asistencia. Para nosotros es importante ayudarte a mantener tu cuenta en buen estado. Consulta la guía de nuestro Centro de ayuda para resolver el problema y para volver a obtener acceso a tu cuenta. Visita nuestro foro de ayuda para obtener más asistencia.
Cuando hayas realizado los cambios necesarios, puedes enviar una apelación a través del formulario Recurso de infracción de las políticas. Ten en cuenta que es posible que no se vuelva a habilitar la cuenta hasta que hayan pasado diez días desde la última vez en que esta envío PII a Google. Nuestros especialistas en políticas revisarán tu recurso y te enviarán un correo electrónico para informarte de la decisión cuando los criterios se cumplan.

Cuando hayas realizado los cambios necesarios, puedes enviar una apelación a través del formulario Recurso de infracción de las políticas. Ten en cuenta que es posible que no se vuelva a habilitar la cuenta hasta que hayan pasado diez días desde la última vez en que esta envío PII a Google. Nuestros especialistas en políticas revisarán tu recurso y te enviarán un correo electrónico para informarte de la decisión cuando los criterios se cumplan.

Si has llegado a este punto, habilitar tu cuenta va a ser todavía más complicado. Ahora el formulario que tendrás que rellenar será el siguiente, tendrás que rellenarlo con todo detalle, admitiendo el fallo y explicando detalladamente el proceso técnico que has realizado para solventarlo: https://support.google.com/adsense/contact/PII_policy_violation Si has llegado a este punto, habilitar tu cuenta va a ser todavía más complicado. Ahora el formulario que tendrás que rellenar será el siguiente, tendrás que rellenarlo con todo detalle, admitiendo el fallo y explicando detalladamente el proceso técnico que has realizado para solventarlo: https://support.google.com/adsense/contact/PII_policy_violation
Tardarán unas 48h en contestarte, pero en ocasiones no lo hacen y tendrás que estar enviandote correos con adsense-support@google.com Tardarán unas 48h en contestarte, pero en ocasiones no lo hacen y tendrás que estar enviandote correos con adsense-support@google.com
Para que te vuelvan a habilitar la cuenta tendrás que tener un periodo de 8 días sin enviar PII, si vuelven a detectar problemas comienza la cuenta nuevamente, por lo que se vuelve un proceso muy tedioso. Si contactas con adsense-support@google.com te asesorarán te dirán los días que llevas y donde cometes los errores, mientras tanto es posible que la contestación del formulario en caso de no ser satisfactoria puede ser muy tajante casi indicando que tu inhabilitación será de por vida, nada más lejos de la realidad. Para que te vuelvan a habilitar la cuenta tendrás que tener un periodo de 8 días sin enviar PII, si vuelven a detectar problemas comienza la cuenta nuevamente, por lo que se vuelve un proceso muy tedioso. Si contactas con adsense-support@google.com te asesorarán te dirán los días que llevas y donde cometes los errores, mientras tanto es posible que la contestación del formulario en caso de no ser satisfactoria puede ser muy tajante casi indicando que tu inhabilitación será de por vida, nada más lejos de la realidad.
Por tanto, resumiendo, tienes dos formularios Por tanto, resumiendo, tienes dos formularios

Apóyate en el soporte vía mail: Apóyate en el soporte vía mail:

    • adsense-support@google.com
    • adsense-support@google.com

Sigue la documentación de las políticas de Adsense para saber como corregir el problema: Sigue la documentación de las políticas de Adsense para saber como corregir el problema:

Finalmente, si han pasado los 8 días sin enviar PII recibirás el ansiado correo: Finalmente, si han pasado los 8 días sin enviar PII recibirás el ansiado correo:

Hola:

Hola:
Gracias por realizar los cambios en su cuenta para que cumpla con nuestras políticas de programa. Hemos revisado su cuenta de AdSense y la hemos vuelto a habilitar para su participación en el programa. Gracias por realizar los cambios en su cuenta para que cumpla con nuestras políticas de programa. Hemos revisado su cuenta de AdSense y la hemos vuelto a habilitar para su participación en el programa.
Estado de la cuenta actual: activa

Estado de la cuenta actual: activa

Espero haberte ayudado 🙂

¡Adiós RedCoruna (o HostEurope)! ¡Hola Gigas!

Los cambios son difíciles, este no fue diferente. Durante todo el tiempo que llevo programando y haciendo páginas siempre he confiado en Redcoruna, desde mi comienzo con un humilde hosting hasta estos últimos años con un buen VPS.

suma-redcoruna-host-europe

Pero las relaciones se deterioran, primero fue  el cambio a HostEurope, fue comprada (o absorbida, o vendida, …) y todo empezó a cambiar a mal. Nunca me he quejado del servicio técnico, pero cuando casi “te haces amigo” de ellos es porque algo no va bien. Los tiempos de respuesta son aceptables y normalmente te resuelven los problemas en poco tiempo. Pero algo paso internamente porque los problemas se sucedían, al principio eran errores 500 achacados a páginas wordpress (en mi hosting los wordpress apenas tienen tráfico), después eran procesos que se quedaban “colgados” inexplicablemente (bueno sí, ellos decían que mis páginas consumían mucha memoria las gráficas daban casi 2Gb de holgura), y luego empezaron las caídas por ataques DDOS (de esto mejor mirad por twitter y opinad vosotros mismos)… y así estuve un tiempo, viendo como una cosa normal todo este tipo de problemas.

Las causas podían ser muchas, desde fuera la sensación es que los cambios internos estaban afectando a la calidad en general, igual estaban cambiando equipos, o tenían abarrotados los servidores por ofertas baratuchas para pequeñas páginas que terminan siendo “comerecursos” al amontonarlas en servidores compartidos. No lo sé, pero algo sucedió.

Cuando parecía que todo volvía a la normalidad, llego la gota que colmó el vaso. El día 14/08/2015, supongo que sacaron cuentas y me mandaron un mail con asunto “Alejandro, reduce el coste de tu VPS“. En él, básicamente me intentaban forzar a cambiar a los nuevos planes de HostEurope. Hice cuentas, y con licencia Plesk y todo me salían más caros, por tanto deje pasar el correo.

El 26/10/2015 me llega otro correo con asunto “Importante: nuevos precios para VPS” y que básicamente “obligaba” a que los antiguos planes de RedCoruna se pasarán a los nuevos planes de HostEurope. El incremento era considerable:

Nos ponemos en contacto contigo para informarte sobre una modificación en los precios de la gama antigua de Servidores Privados Virtuales que será de aplicación a partir del próximo 1 de Enero de 2016.

Esta actualización de precios viene motivada por la creciente subida de las tarifas de las empresas proveedoras de suministro eléctrico y de conectividad, además de la tendencia en el cambio Euro/Dólar. Hemos intentado retrasar lo máximo posible este momento, pero actualmente resulta completamente insostenible mantener los precios y seguir ofreciéndote el mismo nivel de calidad y servicio.

Los nuevos precios para estos productos pasarán a ser los siguientes:

VPS I: 21,89 € / mes
VPS II: 32,89 € / mes

¡Cámbiate ahora y benefíciate!
Recuerda también que ahora puedes actualizarte a la nueva gama de VPS y aprovecharte de las ventajas especiales que ofrecemos a nuestros clientes que, como tú, llevan un tiempo con nosotros.

En ellos encontrarás nuevas posibilidades que se adaptarán perfectamente a tu proyecto: discos SSD mucho más rápidos, nuevo panel de control Plesk 12, el más utilizado de la industria y uno de los más potentes y usables… ¡y mucho más! Si quieres más información sobre esta promoción especial, no tienes más que contestarnos a este correo y un agente especializado se pondrá en contacto contigo para ayudarte a tomar la mejor decisión.

Tras mandarme varios correos haciendo cálculos y demás con el comercial al final me da la razón:

“Gracias por contestarnos, como le comentaba , ahora mismo la situación en su caso , no se ha vuelto demasiado positiva e incluso , el cambio a los nuevos servicios pierde rentabilidad en cuanto a la renovación normal del servicio”

No me hacían ningún descuento -¡entendido!- ellos tienen marcados sus precios. Solo me regalaban una licencia Plesk que al año tenía que empezar a pagar y me indicaban que me hacían ellos la migración gratuita… con lo peligroso que puede llegar a ser. Total, por motivos personales tuve que aguantar 6 meses más… me sentí maltratado e identificado con todos los correos que me llegaron de el estilo que os comento arriba. Querían migrar si o si a los planes HostEurope y en vez de dar condiciones ventajosas a clientes fieles se les ocurrió subir precios y mandar correos como los que os he enseñado.

Por estas cosas, decidí dar el salto, hacer la inversión en tiempo y asumir los problemas de una migración de una a una de todas mis páginas y me decante por Gigas. Ya había tenido alguna experiencia pequeña con ellos, tenía buena opinión, además, solo ofrecen productos que se alejan de los hostings baratos (1&1, … HostEurope…), me pareció un precio bastante competitivo y me lancé a probarlos y comenzar una tediosa migración, por delante me quedaban unas horas de trabajo agotadoras.

gigas_hi

Primeras impresiones de Gigas Cloud. Me sentí muy cómodo, desde luego el chat directo es una gran ventaja (pobres los técnicos que me tienen que aguantar…) y la resolución de tickets es bastante rápida y de calidad. Pero además, pequeños detalles hacen sentirse cómodo a uno nada más aterrizar en una empresa nueva. A los dos días de comprar el VPS,  sacan una promoción en la que las nuevas altas tienen 2 meses de regalo. Me pongo en contacto con ellos mediante Twitter y sin ningún pero ni escusa me dan los dos meses gratis ¡Y solo llevaba 2 días con ellos!

Ahora ya llevo casi un mes, todo va como la seda y no me puedo quejar. Rendimiento óptimo de las máquinas (sí, las mismas páginas que tantos problemas daban en Redcoruna o HostEurope), gráficas, Plesk,  y el chat… si el chat 🙂

Con este post, no quiero aconsejar irse a Gigas ni dejar HostEurope, solo quiero contar mi pequeña historia y mi sensación que me deja todo lo que me ha acontecido estos meses. Al final, buscas tranquilidad, que no haya cambios y de donde venia había demasiados cambios y en mi humilde opinión todos a peor. Ahora parece todo estable ¡Que dure mucho!

 

Solucionado: Strict Standards: mktime(): You should be using the time() function

Otro de los ajustes que me he encontrado a la hora de la migración entre servidores con distintas versiones de PHP es el siguiente mensaje:

Strict Standards: mktime(): You should be using the time() function instead in xxxxxxx.php on line xx

El problema viene por la función mktime() y resolverlo es sencillo, ya que solo se deberá sustituir por la función time()

Inicialmente, la función mktime tiene los siguientes argumentos:

int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int$month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

A partir de PHP 5.1 se utiliza la función time() y no se pasan argumentos para diferenciarla.

Borrar todas las tablas de una base de datos SQL Server

Parece una tarea sencilla borrar todas las tablas de una base de datos, pero se puede complicar cuando o tenemos muchas tablas o existen relaciones entre ellas.database
Dejo un script para esto:

-- Primero desabilitar la integridad referencial
 EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
 GO
EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"
-- Ahora volver a habilitar la integridad referencial
 EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
 GO

Hacer un backup de base de datos MySQL usando PHP

Muchas veces tenemos problemas de seguridad en nuestras páginas webs, es altamente recomendable tener preparadas tareas automáticas para que se ejecuten y salven los datos cada cierto tiempo. Con el siguiente script realizamos una copia de las tablas que deseamos exceptuando los nombres de las que pasamos como parámetro, en mi caso los logs no los copio.

Backup

 

backup_tables('servidor','usuario','contrasena','bd','tabla1,tabla2');

function backup_tables($host,$user,$pass,$name,$tablesNo)
 {
 $link = mysql_connect($host,$user,$pass);
 mysql_select_db($name,$link);

//get all of the tables
 $tables = array();
 $tablesNoBackup = explode(',',$tablesNo);

$result = mysql_query('SHOW TABLES');
 while($row = @mysql_fetch_row($result))
 {
 $tables[] = $row[0];
 }

//cycle through
 foreach($tables as $table)
 {
 if(!in_array($table, $tablesNoBackup))
 {
 $result = mysql_query('SELECT * FROM '.$table);
 $num_fields = mysql_num_fields($result);

$return.= 'DROP TABLE '.$table.';';
 $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
 $return.= "\n\n".$row2[1].";\n\n";

for ($i = 0; $i < $num_fields; $i++)
 {
 while($row = mysql_fetch_row($result))
 {
 $return.= 'INSERT INTO '.$table.' VALUES(';
 for($j=0; $j<$num_fields; $j++)
 {
 $row[$j] = addslashes($row[$j]);
 $row[$j] = ereg_replace("\n","\\n",$row[$j]);
 if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
 if ($j<($num_fields-1)) { $return.= ','; } } $return.= ");\n"; } } $return.="\n\n\n"; } } //save file $handle = fopen('db-backup-'.date("Ymd").'-'.(md5(implode(',',$tables))).'.sql','w+'); fwrite($handle,$return); fclose($handle); }

 

Linq to XML, .Descendants() no devuelve resultados

Tenemos un XML con esta forma, que tiene definido un espacio de nombres para algunas etiquetas (véase el ns4). Aparentemente su lectura con Linq to XML es sencilla, con un simple Descendats o Elements nos dará los resultados que queremos… pero algo va mal… cunden los nervios y no aparecen los resultados, podemos llegar a realizar combinaciones imposibles y no caer que en el XML viene con el espacio de nombre en las etiquetas que hacen referencia a un URL. Este es un ejemplo:

<DatosAdicionales>
     <ns4:Prueba atributo="0">
       <Prueba2 causa="blablabla">
           <Prueba5 descriptivo="dasdasdasd" porcentaje="100.00" importe="0.00" />
       </Prueba2>
     </ns4:Prueba>
     <ns4:Prueba/>
 </DatosAdicionales>

Si nos encontramos con el problema de que Linq to XML no lee al hacer:

 ... cargamos el xml en la variable "xml" .....
 var XML1 = (from c in xml.Descendants("DatosAdicionales") select c).FirstOrDefault();
 var XML2= (from c in XML1.Descendants("Prueba") select c).FirstOrDefault(); // NULL -> No da resultado¿?¿?¿

Para que consiga leer tenemos que tener definido el espacio de nombre previamente con XNamespace:

XNamespace ns4 = "http://url de definicion....";
var XML2= (from c in XML1.Descendants(ns4 + "Prueba") select c).FirstOrDefault(); // Éxito¡

En este hilo más info: http://stackoverflow.com/questions/2338512/understanding-linq-to-xml-descendants-return-no-results

linqtoxml

Indicar a Facebook que imagen mostrar cuando se comparte la url

En ocasiones compartimos el contenido de nuestra web en redes sociales como Facebook. Cuando lo hacemos queremos que aparezca la imagen principal, el texto de la entrada y el título de la página, pero en ocasiones esto no es así.

Para que aparezca el contenido en Facebook que queremos al compartir la URL debemos indicárselo de una forma muy sencilla, mediante el marcado Open Gragh. Son etiquetas que se introducen en la cabecera del html y es la manera más sencilla de introducir información de la página para Facebook.

Captura

Así algunas etiquetas son para:

  • Enlaces de páginas web.
  • Vídeos.
  • Fotos que estén en páginas web.
  • Audios.

Esto son los meta tags (og) básicos a poner en el head de nuestras páginas web:

  • og:title: Título del contenido a compartir.
  • og:type: Tipo de contenido. En esta URL tenéis los direntes tipos. (Objetct Types)
  • og:image: Foto que queremos mostrar en Facebook.
  • og:url: URL del post o contenido.

Metas opcionales para complementar con el contenido:

  • og:description: Texto descriptivo de contenido compartido.
  • og:locale: Idioma del contenido, en mi caso “es_ES” –> Lenguaje_Territorio.
  • og:site_name: Nombre de la web de la que compartimos el contenido

Meta tags específicos para imágenes:

  • og:image:url: mismo valor que og:image.
  • og:image:secure_url: Para rutas de imágenes con protocolo HTTPS.
  • og:image:type: Tipo del formato (MIME TYPES) de la imagen, por ejemplo “image/jpeg”.
  • og:image:width: Anchura en pixels de la imagen.
  • og:image:height: Altura en pixels de la imagen.

Meta tags específicos para vídeos:

  • og:video:url: URL del archivo del vídeo. Por ejemplo: www.dominio.com/video.avi
  • og:video:url: mismo valor que og:video.
  • og:video:secure_url: Para rutas de archivos de vídeos con protocolo HTTPS.
  • og:video:type: Tipo del formato (MIME TYPES) del vídeo, por ejemplo “video/avi”.
  • og:video:width: Anchura en pixels del vídeo.
  • og:video:height: Altura en pixels del vídeo.

Meta tags específicos para audio:

  • og:audio: URL del archivo. Por ejemplo www.dominio.com/audio.mp3
  • og:audio:secure_url: Para rutas de audios con protocolo HTTPS.
  • og:audio:type: Tipo de formato (MIME TYPES) del audio, por ejemplo “audio/mpeg3″.

Habilitar la ejecución de scripts para Powershell

En ocasiones nos podemos encontrar con una sorpresa al intentar ejecutar un script en un servidor. El problema/restricción más común es que se nos lance una excepción indicando que:

“No se puede cargar el archivo XXXX.ps1 porque en el sistema está deshabilitada la ejecución de scripts. Vea “get-help about_signing” para obtener más información”.

Captura2

 

Por tanto, el error es que en el sistema esta deshabilitada la ejecución de scripts. Si abrimos el Windows PowerShell como administrador y ejecutamos el comando “Get-ExecutionPolicy” nos tendría que devolver “Unrestricted” o lo que es lo mismo “Restringido”. Para cambiar esta configuración basta con ejecutar “Set-ExecutionPolicy Unrestricted”.

Captura1

En ese momento ya se pueden ejecutar scripts sin problemas.