Daniel Segovia

Blog personal

Archive for noviembre, 2011

Recuperar el contenido desde Oracle

Hacer un comentario

oci_fetch_array es la función que usaremos para transformar la fila de base de datos en array para tenerlo disponible y poder imprimirlo o procesarlo donde querramos

<?php
 
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
 
$stid = oci_parse($conn, 'SELECT id, nombre FROM personas');
oci_execute($stid);
 
while (($row = oci_fetch_array($stid, OCI_BOTH))) {
    // El array asociativo poseerá los índices en mayúsculas
    echo $row['ID'] . " - " . $row['NOMBRE'] . "\n<br/>";
}
 
oci_free_statement($stid); //libero la memoria
oci_close($conn); //cierro la conexión
 
?>

Written by Daniel Segovia

noviembre 29th, 2011 at 6:11 pm

ABM desde PHP a Oracle

Un comentario

Como en otras secciones del libro, mysql, sqlite y Microsoft SQL Server, para realizar un ABM necesitamos tener el código SQL correcto para enviarlo a la base de datos a través de una función que nos provee PHP, la función especifica para Oracle es oci_execute, pero para ejecutarla primero debemos preparar la cadena de texto SQL con oci_parse

<?php
//alta.php
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
$query = "INSERT INTO mitabla (columna) VALUES ('valor')";
$stid = oci_parse($conn, $query);
oci_execute($stid); // La fila es comiteada y quedará disponible para todos los usuarios
?>
<?php
//baja.php
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
$query = "DELETE FROM mitabla id = 10";
$stid = oci_parse($conn, $query);
oci_execute($stid); // La fila es comiteada y quedará disponible para todos los usuarios
?>
<?php
//modificacion.php
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
$query = "UPDATE mitabla set columna='otro valor' WHERE id = 5";
$stid = oci_parse($conn, $query);
oci_execute($stid); // La fila es comiteada y quedará disponible para todos los usuarios
?>

Written by Daniel Segovia

noviembre 29th, 2011 at 1:08 pm

Posted in 5.6.3 ABM

Mayúsculas y minúsculas en las búsquedas de MySQL

Un comentario

Cuando tenemos que buscar dentro de un campo determinada cadena de texto podemos encontrarnos con la dificultad de de distinguir entre mayúsculas y minúsculas.
El charset (en español cotejamiento) es la respuesta a nuestro conflicto, éste es definido al momento de crear el campo, podemos decir que es case sensitive (cs) o que no lo es (ci)

Sí no elegimos un charset el campo tomará como predeterminado el charset de la tabla, cuando la creamos debemos indicarlo.

Empecemos creando una tabla indicando un charset que no sea case sensitive

CREATE TABLE `personas` (
  `id` INT(11) NOT NULL DEFAULT '0',
  `nombre` VARCHAR(255) NOT NULL,
  `apellido` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;

Supongamos que yo tengo el siguiente registro

1 Daniel Segovia

Busquemos la cadena de texto “daniel” (en minúscula) en el campo nombre

SELECT * FROM personas WHERE nombre LIKE 'daniel'

MySQL me devolverá este registro ya que el campo nombre no esta definido como case sensitve

Cambiemos el charset de una tabla case sensitive (latin1_spanish_ci) a no case sensitive (latin1_bin)

ALTER TABLE `personas` 
CHARSET=latin1 COLLATE=latin1_bin;

Sí realizamos la misma búsqueda que hicimos antes el resultado sería el mismo, nos devolvería el registro. Esto se debe a que no estamos cambiando el charset del campo nombre, solo estamos cambiando la definición de la tabla, esto producirá que cuando se cree un campo de texto nuevo y no se defina un charset este ahora será latin1_bin.

Para cambiar la definición del campo debemos hacerlo con el siguiente código

ALTER TABLE `personas` 
CHANGE `nombre` `nombre` VARCHAR( 255 ) 
CHARACTER SET latin1 COLLATE latin1_bin

Ahora sí dentro de una consulta “Daniel” será distinto de “daniel” entonces la consulta previa que realizamos no nos retornará ningún resultado.

Por último, sí tenemos un campo que es case sensitive podemos realizar una búsqueda y decirle al motor de base de datos para ésta búsqueda que no sea case sensitive

SELECT * FROM `personas` WHERE nombre LIKE 'daniel' COLLATE utf8_spanish_ci

Written by Daniel Segovia

noviembre 25th, 2011 at 2:47 pm

Conectar a Oracle desde PHP

Hacer un comentario

PHP nos ofrece 2 posibilidad para conectarnos a Oracle

php_oracle
Es una librería un tanto antigua pero es una muy buena opción sí no deseamos trabajar con datos tipo BLOB o CLOB.

php_oci8
Librería que permite conectarse a Oracle Database desde la versión 8.0 y posteriores. Posee muchas más funciones y funciona con BLOB y CLOB.

Usaremos oci8 a lo largo de esta sección, para conectarnos lo haremos con la función oci_connect

<?php
// Conectandose al servicio "XE" sobre la dirección "localhost"
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
echo 'Conectado';
?>

Written by Daniel Segovia

noviembre 21st, 2011 at 5:12 pm

Introducción a Oracle desde PHP

Hacer un comentario

OCI8 nos brinda una serie de funciones para trabajar con bases de datos Oracle 11g, 10g, 9i y 8i. Soportan sentencias SQL y PL/SQL. Incluyen transacciones, marcadores de posición oracle, LOB, colecciones, escalabilidad de la base de datos Oracle, agrupamiento de conexiones residentes o Resident Connection Pooling (DRCP) y el almacenamiento en cache de resultados

La página oficial de Oracle posee un manual de PHP y Oracle
Link directo al manual

Written by Daniel Segovia

noviembre 15th, 2011 at 5:51 pm

Optimizar tu sitio con htaccess

Hacer un comentario

Leí un muy buen artículo en catswhocode sobre htaccess

1) Forzar la barra final: Como agregar la barra final en las url, ideal para SEO

<IfModule mod_rewrite.c>
 RewriteCond %{REQUEST_URI} /+[^\.]+$
 RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
</IfModule>

2) Prevenir hotlinks: Para que no usen las imágenes desde nuestro servidor directamente y nos consuman el tráfico

RewriteEngine On
#Replace ?mysite\.com/ reemplace por su URL
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Replace /images/nohotlink.jpg reemplace por la imagen que desea mostrar
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

3) Redireccionar dispositivos moviles: Detecta sí es un dispositivo móvil y redirecciona a donde indiquen

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/m/.*$
RewriteCond %{HTTP_ACCEPT} "text/vnd.wap.wml|application/vnd.wap.xhtml+xml" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "acs|alav|alca|amoi|audi|aste|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "dang|doco|eric|hipt|inno|ipaq|java|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-" [NC,OR]
RewriteCond %{HTTP_USER_AGENT}  "maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|opwv" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "palm|pana|pant|pdxg|phil|play|pluc|port|prox|qtek|qwap|sage|sams|sany" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|w3cs|wap-|wapa|wapi" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "wapp|wapr|webc|winw|winw|xda|xda-" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "up.browser|up.link|windowssce|iemobile|mini|mmp" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "symbian|midp|wap|phone|pocket|mobile|pda|psp" [NC]
#------------- The line below excludes the iPad
RewriteCond %{HTTP_USER_AGENT} !^.*iPad.*$
#-------------
RewriteCond %{HTTP_USER_AGENT} !macintosh [NC] #*SEE NOTE BELOW
RewriteRule ^(.*)$ /m/ [L,R=302]

4) Descargar archivos: Forzar a descargar determinados tipos de archivos

<Files *.xls>
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</Files>
<Files *.eps>
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</Files>

5) Incrustar una fuente en Firefox: Al incrustar una fuente, Firefox no le permiten integrar de una página web externa. con el siguiente código puede evitar esta limitación.

<FilesMatch "\.(ttf|otf|eot|woff)$">
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://yourdomain.com"
</IfModule>
</FilesMatch>

6) Acelerar la velocidad de tu sitio: Acelerar el sitio con cache para los archivos que creamos conveniente

# 1 año
<FilesMatch "\.(ico|pdf|flv)$">
Header set Cache-Control "max-age=29030400, public"
</FilesMatch>
# 1 semana
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
# 2 días
<FilesMatch "\.(xml|txt|css|js)$">
Header set Cache-Control "max-age=172800, proxy-revalidate"
</FilesMatch>
# 1 minuto
<FilesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=60, private, proxy-revalidate"
</FilesMatch>

7) Frenar el spam en tú página: Tenés un wordpress? Sabes de lo que estoy hablando, bloquea el spam en tu wordpress de una manera sencilla

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.*yourdomainname.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
</IfModule>

8 ) Redirigir a diferentes lugares: Te permite redirigir diferentes feeds RSS, Atom o RDF a diferentes lugares

<IfModule mod_alias.c>
 RedirectMatch 301 /feed/(atom|rdf|rss|rss2)/?$ http://example.com/feed/
 RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http://example.com/comments/feed/
</IfModule>

9) Configure su sitio web para videos HTML5

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
AddType video/ogg .ogv
AddType video/ogg .ogg
AddType video/mp4 .mp4
AddType video/webm .webm
AddType application/x-shockwave-flash swf

10) Corre PHP dentro de archivos Javascript

AddType application/x-httpd-php .js
AddHandler x-httpd-php5 .js
 
<FilesMatch "\.(js|php)$">
SetHandler application/x-httpd-php
</FilesMatch>

Written by Daniel Segovia

noviembre 4th, 2011 at 7:09 pm

Posted in General

Recuperar el contenido en MS SQL Server

Hacer un comentario

PHP nos ofrece varias posibilidades para recuperar la información guardada en la base de datos MS SQL Server.
Veremos 2 funciones, mssql_fetch_array que nos recuperará el contenido de una fila como un array con índices numéricos y también mssql_fetch_assoc que nos traerá el contenido en forma de array con los índices de texto iguales a los nombres de los campos en la base de datos.

<?php
//fetch_array
$server = 'MISERVER\SQLEXPRESS';
 
// Conectando a MSSQL
$link = mssql_connect($server, 'sa', 'password');
 
if (!$link) {
    die('Ha ocurrido un error mientras intentaba conectarse a MSSQL');
}
 
$query = mssql_query('SELECT [usuario], [email] FROM [php].[dbo].[usuarios]');
 
while ($row = mssql_fetch_array($query, MSSQL_NUM)) {
    echo "Usuario: " . $row[0] . " - Email: " . $row[1] . "<br />";
}
?>
<?php
//fetch_assoc
$server = 'MISERVER\SQLEXPRESS';
 
// Conectando a MSSQL
$link = mssql_connect($server, 'sa', 'password');
 
if (!$link) {
    die('Ha ocurrido un error mientras intentaba conectarse a MSSQL');
}
 
$query = mssql_query('SELECT [usuario], [email] FROM [php].[dbo].[usuarios]');
 
while ($row = mssql_fetch_assoc($query)) {
    echo "Usuario: " . $row['usuario'] . " - Email: " . $row['email'] . "<br />";
}
?>

Written by Daniel Segovia

noviembre 4th, 2011 at 5:42 pm

ABM en MS SQL Server

Hacer un comentario

Tenemos la función mssql_query para ejecutar los querys, con la cadena de texto con sintaxis correcta de SQL procederemos a ejecutarlos en el motor de base de datos.

Código SQL

// Insertar
INSERT INTO clientes (razon_social, direccion) VALUES ('Pepsico', 'Florida 55202');
// Actualizar
UPDATE clientes SET razon_social = 'Pepsico Snack' WHERE id = 15;
// Eliminar
DELETE FROM clientes WHERE id = 15

Código para insertarlo en el motor MS SQL Server

<?php
//actualizar.php
$server = 'MISERVER\SQLEXPRESS';
 
// Conectando a MSSQL
$link = mssql_connect($server, 'sa', 'password');
 
if (!$link) {
    die('Ha ocurrido un error mientras intentaba conectarse a MSSQL');
}
$sql = "INSERT INTO clientes (razon_social, direccion) VALUES ('Pepsico', 'Florida 55202')";
mssql_query($sql);
?>
<?php
//insertar.php
$server = 'MISERVER\SQLEXPRESS';
 
// Conectando a MSSQL
$link = mssql_connect($server, 'sa', 'password');
 
if (!$link) {
    die('Ha ocurrido un error mientras intentaba conectarse a MSSQL');
}
$sql = "UPDATE clientes set razon_social = 'Pepsico Snack' WHERE id = 15";
mssql_query($sql);
?>
<?php
//eliminar.php
$server = 'MISERVER\SQLEXPRESS';
 
// Conectando a MSSQL
$link = mssql_connect($server, 'sa', 'password');
 
if (!$link) {
    die('Ha ocurrido un error mientras intentaba conectarse a MSSQL');
}
$sql = "DELETE FROM clientes WHERE id = 15";
mssql_query($sql);
?>

Written by Daniel Segovia

noviembre 1st, 2011 at 4:13 pm

Posted in 5.5.3 ABM

Conexión a MS SQL Server

Hacer un comentario

Para conectarnos a una base de datos Microsoft SQL Server PHP nos proporciona la función mssql_connect
Posee 4 parámetros, servidor, usuario, contraseña y nuevo link (devuelve un nuevo identificador), usualmente los 3 primeros son los más usados.

<?php
$server = 'MISERVER\SQLEXPRESS';
 
// Conectando a MSSQL
$link = mssql_connect($server, 'sa', 'password');
 
if (!$link) {
    die('Ha ocurrido un error mientras intentaba conectarse a MSSQL');
}
?>

Written by Daniel Segovia

noviembre 1st, 2011 at 3:23 pm

Posted in 5.5.2 Conexión