<?php
//Parámetros
$archivo = 'origen url'; //logo
$angulo = 90;
//Generar el recurso de imagen original
$origen = imagecreatefrompng($archivo) or die('Error al abrir el archivo '.$archivo);
imagealphablending($origen, false); //No mezclar sobre el canal alfa (transparencias)
imagesavealpha($origen, true); //guardar la información completa del canal alfa
//Generar el recurso de imagen rotado
$destino = imagerotate($origen, $angulo, imageColorAllocateAlpha($origen, 0, 0, 0, 127));
imagealphablending($destino, false); //No mezclar sobre el canal alfa (transparencias)
imagesavealpha($destino, true); //guardar la información completa del canal alfa
//RESULTADO
$mostrar_imagen_como_resultado = true;
if ($mostrar_imagen_como_resultado) {
//Mostrar la imagen
header('Content-type: image/png');
imagepng($destino);
} else {
//Guardarla en otro archivo
$rutaDestino = 'ruta-nueva.png';
imagepng($destino, $rutaDestino);
}
//liberar recursos
imagedestroy($origen);
imagedestroy($destino);
[PHP] Rotar imágenes con fondos transparentes
[PHP] Prevenir inyección SQL en sentencias
¿Cómo se previenen?
Utilizando instrucciones preparadas y consultas parametizadas. Estas son sentencias SQL que son enviadas y analizadas por el servidor de la base de datos separadamente de cualquier parámetro. De esta manera es imposible para un atacante inyectar SQL malicioso.
¿Cómo se utilizan?
Usando la extensión MySQLi o PDO y ciertos parámetros que utilizaremos a continuación, en este caso (como yo lo utilizo) voy a poner el ejemplo en MySQLi.
Código
Previamente a empezar con las sentencias, necesitamos crear nuestra conexión con la base de datos, en este caso llamado conexion.php
conexion.php
<?php
##########################
$hostname = "servidor";
$username = "usuario db";
$password = "contraseña db";
$database = "base de datos";
##########################
$conexion = new mysqli($hostname, $username, $password, $database);
/* comprobar conexión */
if ($conexion->connect_error) {
die('Error de Conexión (' . $conexion->connect_errno . ') '
. $conexion->connect_error);
}
Una vez creada la conexión, podemos prevenir nuestras inyecciones usando sentencias parametizadas como en este ejemplo.
//Incluimos el anterior código php para poder establecer una conexión con la base de datos. Include_once significa que solo se incluya una vez, para que no se vuelva establecer más veces llevando a errores.
include_once('conexion.php');
//En caso que enviemos mediante post un usuario establecemos variable para prepararla después.
$nombre = $_POST;
//Primero creamos la sentencia SQL
$sql = "SELECT * FROM usuarios WHERE nombre = ?";
//Preparamos la sentencia anteriormente establecida
$stmt = $conexión->prepare($sql); //$conexion es una variable previamente creada para conectarnos a nuestra db.
//Enlazamos el parámetro a la sentencia. La "s" significa "string", en caso de tener un número sería "i". Opciones : i = integer, d = double, s = string, b = blob.
$stmt->bind_param('s', $nombre);
//Ejecutamos
$stmt->execute();
//Obtenemos resultado
$resultado = $stmt->get_result();
//Mientras que haya resultado de filas hacer algo con $row.
while ($row = $result->fetch_assoc()) {
// Hacer algo con $row.
}
//Y para acabar, liberamos memoria resultados en memoria y cerramos la consulta con close.
$stmt->free_result();
$stmt->close();
[PHP] Cómo sumar un carácter a la cadena en PHP.
$a = 'Esto es un '; $b = 'ejemplo'; $c = $a . $b;
$c = Esto es un ejemplo.
[PHP] Cómo obtener datos de un CSV mediante PHP
Para esto, vamos a utilizar la función fgetcsv que leerá correctamente una sola fila de un archivo, moviendo el puntero a la siguiente fila en el proceso.
$row = 1;
if (($handle = fopen("NOMBRE.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data . "<br />\n";
}
}
fclose($handle);
}
[OOP][MySQLI/PDO] Conectar a MySQL
Cuando se empieza en php se tienen que tomar dos decisiones, o por lo menos en mi caso lo hice así, las decisiones son las siguientes:
-
- ¿Qué uso MySQLI o PDO?
-
- ¿Lo uso orientado a objetos o por procedimientos?
En mi caso, escogí mysqli oop (orientado objetos) aunque PDO, tiene la ventaja de soportar otro tipo de bases de datos que no sean mysql, además que tiene la posibilidad de usar nombres en sentencias parametizadas pero tiene peor rendimiento ya que no usa funciones nativas.
Por favor, no usar la extensión mysql en lugar de mysqli, ya que está DEPRECATED.
Pues bien vamos a conectar la base de datos con este script al que llamaremos db.php.
db.php
<?php
//
$host = "host donde está alojada la web";
$db = "base de datos dónde está alojada la información";
$username = "nombre de usuario de la base de datos";
$password = "contraseña del usuario de la base de datos";
//
//Conectamos a la base de datos mediante la funcion mysqli_connect
$mysqli = new mysqli($host, $username, $password, $db);
//Si el nuevo objeto llamado mysqli falla la conexión mostrar error
if ($mysqli->connect_error) {
die("No hay conexión: " . $mysqli->connect_error);
}
else{
echo "Mensaje opcional de conexión realizada";
}
?>
[Montura] Gusano mental del amante de enigmas
Para conseguir esta montura http://es.wowhead.com/item=147835 hay que ir por todo Azeroth haciendo clic en unas paginas en un orden determinado y si ponemos el numero de las paginas en orden da el ISBN 9781616558451 del libro World of Warcraft: Crónicas volumen 1
El orden de las paginas es el siguiente:
Pagina 1: Salón Juego de Manos (Dalaran) Coordenadas 48.8, 41.7 «http://es.wowhead.com/object=148502»
Página 2: Arboleda del Crepúsculo (Bosque del Ocaso) Coordenadas 49.25, 34 «http://es.wowhead.com/object=209270» (Apenas se ve)
Página 3: Tierras de Fuego (Banda, Monte Hyjal) Cerca de Ragnaros «http://es.wowhead.com/object=245216»
Página 4:Ciudad Perdida de los Tol’Vir (Uldum) Coordenadas 70.0, 78.0 «http://es.wowhead.com/object=251564»
Página 5: Asedio de Orgrimmar. (Valle de la Flor Eterna, Pandaria) «http://es.wowhead.com/object=220821»
Página 6: Pozo de la Eternidad (Cavernas del tiempo) «http://es.wowhead.com/object=220820»
Página 7: Monasterio del ShadoPan (Cima Kun-Lai) Coordenadas 34.6, 50.9 «http://es.wowhead.com/object=19023»
Página 7: Uldum Coordenadas 76.4, 53.6 «http://es.wowhead.com/object=244678»
http://es.wowhead.com/object=269830 Paramos de Poniente Coordenadas 30.5, 28.0
Coordenadas para TomTom:
/way Bosque del Ocaso 49.25 34
/way Uldum:Kalimdor 70 78
/way Cima Kun-Lai 34.6 50.9
/way Uldum:Kalimdor 76.4 53.6
/way Páramos de Poniente 30.5 28
Videoguia por Chibi Sko:
Macro para saber por cual pagina vas
/run local a={45470,47207,47208,47209,47210,47211,47212,47213}for i,q in ipairs(a)do print(format(«Pagina %s: %s»,i, IsQuestFlaggedCompleted(q) and «\124cFF00FF00Completa\124r» or «\124cFFFF0000Sin Completar\124r»)) end
[Mascota/Montura] Kosumoth el Famélico


Primero tendremos que ir a la Costa Abrupta coordenadas 37.1, 71.6 y hablar con http://es.wowhead.com/npc=102695, una vez demos a las opciones y terminemos la conversación tendremos que ir a buscar http://es.wowhead.com/item=139783 en un http://es.wowhead.com/object=252412/ localizado en 57.5 56.0 (Entrada a la cueva en 58,53 54,08)
Una vez tengamos el objeto, volvemos con http://es.wowhead.com/npc=102695 y hablamos con el para enseñarle el objeto, habrá que hablar unas 4 o 5 veces. Ahora es cuando tenemos que ir en busca de unos orbes escondidos a lo largo de todas las islas abruptas, es necesario hacerles clic en el orden correcto
Primer orbe: Una cueva en Azsuna. Coordenadas 37.9, 37.5
Segundo orbe: Una cueva en Tormenheim. Coordenadas 32.9, 75.8
Dentro de esta cueva habrá un élite el cual habrá que ignorar dado que nos puede llegar a matar de 1 golpe.
Tercer orbe: Cueva el Val’shara Coordenadas 41.5, 81.1
Dentro de esta cueva también esta http://es.wowhead.com/npc=111509/, hay que cortarle el casteo de http://es.wowhead.com/spell=222084 y matarlo lo antes posible.
Cuarto orbe: Una cueva submarina en la Costa Abrupta. Coordenadas 29.7, 77.7
Es recomendable ir con pociones o juguetes que aumenten la velocidad de nado, puesto que tendremos fatiga y a parte oxigeno.
Quinto orbe: Una cueva en Azsuna. Coordenadas 59.3, 13.0
Sexto orbe: Una cueva submarina al norte de Tormenheim. Coordenadas 67.3, 14.8
Séptimo orbe: Una cueva en Monte alto. Coordenadas 55.9, 38.5
Octavo orbe: Una cueva oculta en Azsuna. Coordenadas 53.9, 25.2
Noveno orbe: Cueva submarina en Ojo de Azshara (Zona) Coordenadas 79.2, 89.1
Décimo orbe: Costa abrupta, al lado de http://es.wowhead.com/npc=102695
Una vez que cliquemos los 10 orbes http://es.wowhead.com/npc=102695 nos dirá un par de cosas (no quiero hacer spoiler) y tendremos una misión de mundo (http://es.wowhead.com/quest=43798/) en Ojo de Azshara que nos podrá dar la mascota (http://es.wowhead.com/item=140261/) o la montura acuática (http://es.wowhead.com/item=138201/)
/run local t={=43730,=43731,=43732, =43733, =43734, =43735, =43736, =43737, =43760, =43761} for k,v in pairs(t) do print(k,»Esta»,IsQuestFlaggedCompleted(v) and «activa» or «sin activar») end
/way Costa Abrupta:Islas Abruptas 37.1, 71.6
/way Costa Abrupta:Islas Abruptas 58.56, 53.90
/way Azsuna 37.9, 37.5
/way Tormenheim 32.9, 75.8
/way Val’shara 41.5, 81.1
/way Costa Abrupta:Islas Abruptas 29.7, 77.7
/way Azsuna 59.3, 13.0
/way Islas Abruptas 67.3, 14.8
/way Monte Alto:Islas Abruptas 55.9, 38.5
/way Azsuna 53.9, 25.2
/way Ojo de Azshara 79.2, 89.1
[Mascota] Squirky
Vamos a Azsuna, a la Isla Rompemar, coordenadas 19 21


Una vez en la isla, estará habitada por varios murlocs élites que deberemos matar para llegar hasta http://es.wowhead.com/npc=113440/ y poder darle duelo, hay varios http://es.wowhead.com/npc=113440/por toda la isla


Una vez le capturemos ¡estará listo en nuestra colección!
[Mascota] Conejo de Polvo


Para poder ver y capturar http://es.wowhead.com/npc=98506/ necesitamos activar el buff http://es.wowhead.com/spell=210598/ que se activa al dar clic en una http://es.wowhead.com/object=244950/ localizadas en http://www.wowhead.com/zone=7502, el spawn de estas alfombras puede estar en:
-
- Barbería: En el centro de la sala, después de subir las escaleras
- Arca mágica: Detrás del «mostrador»
- Santuario Brisaveloz: Al lado de la posada Horda, encima de la alcantarilla
- Enclave Dientegris: Delante del portal de los Paladines
- Salón juego de manos: Segundo piso
Una vez tengamos el buff http://es.wowhead.com/spell=210598/ podremos ver a los http://es.wowhead.com/npc=98506/ hacerles duelo de mascotas y domarlos, si tenemos suerte pueden salir de calidad «Rara»
Yo me encontré la alfombra en la barbería
[Macro] Comprar muchos objetos de vendedor sin confirmación.
Hay muchas veces que necesitamos comprar objetos de un vendedor y cada vez que le damos nos sale un ventana de confirmación, puede ser un coñazo y lleva mucho tiempo, para saltarse esto podemos hacer la siguiente macro.
/run BuyMerchantItem(1,1)
El color rojo indica la posición del objeto en el vendedor, es decir, si está el primero, segundo, tercero, etc… tenemos que contar para saber en que posición está o de lo contrario compraremos otro objeto.
El color verde indica el número que queremos comprar del objeto.

![[PHP] Rotar imágenes con fondos transparentes [PHP] Rotar imágenes con fondos transparentes](https://pandagg.games/wp-content/uploads/2018/04/php-768x384.png)
![[Montura] Gusano mental del amante de enigmas [Montura] Gusano mental del amante de enigmas](https://pandagg.games/wp-content/uploads/2018/04/gusanito.jpg)
![[Mascota/Montura] Kosumoth el Famélico [Mascota/Montura] Kosumoth el Famélico](https://pandagg.games/wp-content/uploads/2018/04/538121-kosumoth-el-famélico-768x697.jpg)
![[Mascota] Squirky [Mascota] Squirky](https://pandagg.games/wp-content/uploads/2018/04/squir.jpg)
![[Mascota] Conejo de Polvo [Mascota] Conejo de Polvo](https://pandagg.games/wp-content/uploads/2018/04/conejito.jpg)
![[Macro] Comprar muchos objetos de vendedor sin confirmación. [Macro] Comprar muchos objetos de vendedor sin confirmación.](https://pandagg.games/wp-content/uploads/2018/04/macro-comprar-objetos-de-vendedor-768x448.jpg)