Mostrando entradas con la etiqueta sql. Mostrar todas las entradas
Mostrando entradas con la etiqueta sql. Mostrar todas las entradas

Memcache : guardar en cache datos SQL

Metodos para mantener en cache información que no cambiará muy seguido, y que no es necesario saturar la BD de consultas .

<?php

include 'mysql.php';

    global $memcache;
    $memcache = new Memcache;
    $memcache->pconnect('localhost',11211) or die("Conexión lenta...");

    function Get_memcache($key) {
        global $memcache;
        return ($memcache) ? $memcache->get($key) : false;
    }

    function Set_memcache($key,$object) {
        global $memcache;
        $timeout = 432000; //5dias
            return ($memcache) ?
        $memcache->set($key,$object,MEMCACHE_COMPRESSED,$timeout) : false;
    }

    function Go_memcache($key) {
        global $memcache;
           //Limpiar toda la cache : $memcache->flush();
        $identificador = md5("mysql" . $key);
        $cache = Get_memcache($identificador);
        if (!($cache)) {
           // echo "dentro";
            $db = new MySQL();
            $rs = $db->consulta(Querysql($key));
            if ($rs){
                for ($data = array (); $row = $rs->fetch_assoc(); $data[] = $row);
                Set_memcache($identificador,$data);
                $cache = Get_memcache($identificador);

            }
        }
        return $cache;
    }

    function Querysql($key){
        $sql = null;
     
        if($key==="planes")          
            $sql= "SELECT * FROM TABLA1";
     
        elseif($key==="sedes")        
            $sql= "SELECT * FROM TABLA2 ";
     

        return $sql;
       
    }

PHP con PDO vs SQLSRV - comparison PDO and sql srv

 Para mí, la mejor manera de llegar a conocer un nuevo API es escribir algo de código. Así que, como un ejercicio de aprendizaje, convertí la aplicación de ejemplo que se incluye en la documentación del uso de la API sqlsrv procesal para usar el API orientada a objetos PDO (Los archivos convertidos se adjuntan a este mensaje. Usé la base de datos de ejemplo AdventureWorks2008, que puede descargar aquí .). Tal vez un mejor ejercicio sería reescribir toda la aplicación de ejemplo en un estilo orientado a objetos, pero quería permanecer centrado en cómo los cambios en el código de acceso de datos, así que voy a guardar el ejercicio más riguroso para más adelante.
Si usted ha escrito mucho código PDO contra otras bases de datos, la aplicación de ejemplo convertida en sí no puede ser tan interesante para usted. Sin embargo, mis observaciones de cómo comparar la API sqlsrv y la API de PDO podría ser interesante, así que voy a empezar por ahí. Tengo que decir que me quedé un poco decepcionado con las limitaciones de la interfaz PDO. Esto no es una crítica de este controlador PDO en particular, es sólo que la API sqlsrv ofrece algunas gran funcionalidad que no pueden ser fácilmente expuestos en la interfaz PDO. Esto es algo de lo que me di cuenta:
  • La funcionalidad streaming que está disponible en el API sqlsrv de procedimiento para la recuperación de datos no se puede aprovechar en la interfaz PDO. El API sqlsrv aprovecha PHP arroyos para que pueda enviar y recuperar datos  . Sin embargo, con el controlador PDO, no se puede recuperar datos como una secuencia. Dependiendo de la aplicación, esto puede tener un impacto significativo sobre el uso de memoria.
  • La funcionalidad ofrecida en sqlsrv_has_rows (determina si un conjunto de resultados tiene filas) y sqlsrv_num_rows (determina el número de filas de un conjunto de resultados) no está disponible a través de PDO. Hay soluciones, pero implican trayendo un conjunto de resultados (en parte o en su totalidad) en la memoria. Una vez más, esto puede no ser un problema dependiendo de la aplicación, pero podría ser.
  • La capacidad de moverse a través y recuperar un único campo en un conjunto de resultados de fila sólo se puede hacer con PDOStatement :: fetchObject al usar PDO. Con la API sqlsrv, la combinación de sqlsrv_fetch / sqlsrv_get_field no sólo le permite recuperar un solo campo, que le permite especificar el tipo de datos PHP y codificación cuando se recuperan los datos. Esto no está disponible a través de PDO. El PDOStatement :: fetchColumn método se acerca, pero no permite que usted se mueva cuando los campos de la fila actual.
  • La interfaz PDO no proporciona ninguna manera para el manejo de las advertencias que se provocan por la base de datos. Por defecto, el conductor sqlsrv trata la mayoría de las advertencias como errores para que puedan ser manejados . (Puede desactivar este comportamiento con el sqlsrv_configure función.) El controlador PDO sólo permite que los errores se manejan.
En el lado positivo, me gustó mucho el PDO :: lastInsertId método y la capacidad para lidiar con los errores de manejo de excepciones. En el código de ejemplo siguiente se puede ver cómo estas características hacen de código mucho más legible.
Tengo curiosidad por saber qué tan relevante o importante es esta información. ¿Son importantes para usted estas características sqlsrv (que no se aparecieron en la interfaz PDO)? ¿Qué tan importantes son? ¿Por qué? 
El resto de este post es para la gente que no se ha escrito mucho código PDO. Voy a mirar a una parte del código de la aplicación de ejemplo en la documentación del controlador sqlsrv y lo comparo con el mismo código escrito con el controlador PDO.

Conexión a una base de datos

No hay sorpresas aquí la conexión con la autenticación de Windows (y no hay sorpresas cuando se conecta con la autenticación de SQL Server). Tengo que hacer una llamada extra con DOP para establecer el modo de control de errores, pero me da la ventaja de trabajar con excepciones ahora.
sqlsrv
$ ServerName = "(local) \ sqlexpress"; 
$ ConnectionOptions = array ("Base de datos" => "AdventureWorks2008");
$ Conn = sqlsrv_connect ($ serverName, $ ConnectionOptions); 
if ($ conn === false) 
{Die (FormatErrors (sqlsrv_errors ()));}
PDO
$ ServerName = "(local) \ sqlexpress"; 

intentar 
{ 
$ Conn = new PDO ("sqlsrv: Servidor = $ serverName; Database = AdventureWorks2008", "", ""); 
$ Conn-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION); 
} 
catch (Exception $ e) 
{ 
die (print_r ($ e-> getMessage ())); 
}

Recuperando datos

Dos cosas a destacar aquí:
  1. Con PDO, saqué todo el conjunto de resultados en la memoria para que pueda contar con los resultados.Con la API sqlsrv, puedo usar un cursor desplazable para contar los resultados en el servidor.
  2. La función FormatErrors envuelve una llamada a sqlsrv_errors en el ejemplo sqlsrv. En el código de PDO, tengo la ventaja de trabajar con excepciones.
sqlsrv
$ queryTerms = array ($ _POST ['query']); 
$ Tsql = "SELECT ProductID, Name, color, tamaño, ListPrice 
DE Production.Product 
Donde nombre LIKE '%' +? + '%' Y ListPrice> 0.0 "; 
$ CursorType = array ("desplazable" => SQLSRV_CURSOR_KEYSET); 
$ GetProducts = sqlsrv_query ($ conn, $ tsql, $ queryTerms, $ CursorType); 
if ($ GetProducts === false) 
{Die (FormatErrors (sqlsrv_errors ()));}
if (($ sqlsrv_has_rows GetProducts)) 
{ 
$ RowCount = sqlsrv_num_rows ($ GetProducts); 
BeginProductsTable ($ rowCount); 
while ($ row = sqlsrv_fetch_array ($ GetProducts, SQLSRV_FETCH_ASSOC))
{ 
PopulateProductsTable ($ row); 
} 
EndProductsTable (); 
} 
más 
{ 
DisplayNoProdutsMsg (); 
}
PDO
intentar 
{ 
$ queryTerms = array ($ _POST ['query']); 
$ Tsql = "SELECT ProductID, Name, color, tamaño, ListPrice 
DE Production.Product 
Donde nombre LIKE '%' +? + '%' Y ListPrice> 0.0 "; 
$ GetProducts = $ conn-> prepare ($ tsql); 
$ GetProducts-> execute ($ queryTerms); 
$ products = $ GetProducts-> fetchAll (PDO :: FETCH_ASSOC); 
$ ProductCount = count (productos $); 
if ($ ProductCount> 0) 
{ 
BeginProductsTable ($ ProductCount); 
foreach ($ productos como $ row) 
{ 
PopulateProductsTable ($ row); 
} 
EndProductsTable (); 
} 
más 
{ 
DisplayNoProdutsMsg (); 
} 
} 
catch (Exception $ e)
{ 
die (print_r ($ e-> getMessage ())); 
}

Insertar datos

Realmente, no hay sorpresas aquí, pero tenga en cuenta que la API sqlsrv permite que los datos se transmiten a la base de datos, mientras que la API de PDO no.
sqlsrv
. $ comentarios = "data :/ / text / plain", $ _POST ['comentarios']; 
$ = corriente fopen ($ comentarios, "r"); 
$ Tsql = "INSERT INTO Production.ProductReview (ProductID, 
ReviewerName, 
ReviewDate, 
EmailAddress, 
Clasificación, 
Comentarios) 
VALORES "(,,,,,??????);

$ params = array (& $ _POST ['productid'], 
& $ _POST ["Nombre"], 
date ("Ymd"), 
& $ _POST ['Email'], 
& $ _POST ['Rating'], 
& $ Stream);
$ InsertReview = sqlsrv_prepare ($ conn, $ tsql, $ params); 
if ($ insertReview === false) 
{Die (FormatErrors (sqlsrv_errors ()));}

if (sqlsrv_execute ($ insertReview) === false) 
{Die (FormatErrors (sqlsrv_errors ()));}
PDO
intentar 
{
$ Tsql = "INSERT INTO Production.ProductReview (ProductID, 
ReviewerName, 
ReviewDate, 
EmailAddress, 
Clasificación, 
Comentarios) 
VALORES "(,,,,,??????);

$ params = array (& $ _POST ['productid'], 
& $ _POST ["Nombre"], 
date ("Ymd"), 
& $ _POST ['Email'], 
& $ _POST ['Rating'], 
$ _POST ['Comentarios']); 
$ InsertReview = $ conn-> prepare ($ tsql); 
$ InsertReview-> execute ($ params); 
} 
catch (Exception $ e) 
{ 
die (print_r ($ e-> getMessage ())); 
}

Recuperar datos binarios

Una vez más, dos cosas a destacar aquí:
  1. Con la API sqlsrv, puedo usar la combinación de sqlsrv_fetch / sqlsrv_get_field para recuperar un solo campo y especificar que quiero recuperarla como una corriente PHP.
  2. La capacidad de trabajar con excepciones en el código de PDO para hacer más legible el código.
sqlsrv
$ Tsql = "SELECT LargePhoto 
DE Production.ProductPhoto AS p 
ÚNETE Production.ProductProductPhoto AS q 
EN p.ProductPhotoID = q.ProductPhotoID 
? DONDE ProductID = ";
$ params = array ($ _GET ['productId']);
$ Stmt = sqlsrv_query ($ conn, $ tsql, $ params); 
if ($ stmt === false) 
{ 
echo "Error en la ejecución de la sentencia </ br>."; 
morir (print_r (sqlsrv_errors (), true)); 
}
if (sqlsrv_fetch ($ stmt)) 
{ 

$ Image = sqlsrv_get_field ($ stmt, 
0, 
SQLSRV_PHPTYPE_STREAM (SQLSRV_ENC_BINARY)); 
fpassthru ($ imagen); 
} 
más 
{ 
echo "Error en la recuperación de datos </ br>."; 
morir (print_r (sqlsrv_errors (), true)); 
}
PDO
intentar 
{ 
$ Tsql = "SELECT LargePhoto 
DE Production.ProductPhoto AS p 
ÚNETE Production.ProductProductPhoto AS q 
EN p.ProductPhotoID = q.ProductPhotoID 
? DONDE ProductID = ";

$ Stmt = $ conn-> prepare ($ tsql); 
$ Stmt-> execute (array ($ _GET ['productId'])); 
$ BindColumn stmt-> (1, 
$ Imagen, 
PDO :: PARAM_LOB, 
0, 
PDO :: SQLSRV_ENCODING_BINARY); 
$ Stmt-> fetch (PDO :: FETCH_BOUND); 
echo $ imagen; 
} 
catch (Exception $ e) 
{ 
die (print_r ($ e-> getMessage ())); 
}

Inserción de datos binarios

La capacidad de trabajar con las excepciones y la PDO :: lastInsertId método de hacer el código PDO aquí mucho más legible. Con la API sqlsrv, no hay ninguna función integrada para obtener el último ID después de una inserción, por lo que necesita para ejecutar una consulta por lotes y trabajar a través del segundo conjunto de resultados.
sqlsrv
$ Tsql = "INSERT INTO Production.ProductPhoto (LargePhoto) 
VALORES (?); SELECT SCOPE_IDENTITY () AS Número de foto "; 
$ FileStream = fopen ($ _FILES ['file'] ['tmp_name'], "r"); 

$ UploadPic = sqlsrv_prepare ($ conn, $ tsql, array ( 
array (& $ fileStream, 
SQLSRV_PARAM_IN, 
SQLSRV_PHPTYPE_STREAM (SQLSRV_ENC_BINARY), 
SQLSRV_SQLTYPE_VARBINARY ('max')))); 

if ($ uploadPic === false) 
{Die (FormatErrors (sqlsrv_errors ()));} 

if (sqlsrv_execute ($ uploadPic) === false) 
{Die (FormatErrors (sqlsrv_errors ()));} 

$ Next_result = sqlsrv_next_result ($ uploadPic); 
if ($ next_result === false) 
{Die (FormatErrors (sqlsrv_errors ()));} 
if (sqlsrv_fetch ($ uploadPic) === false) 
{Die (FormatErrors (sqlsrv_errors ()));}
$ Número de foto = sqlsrv_get_field ($ uploadPic, 0);
$ Tsql = "Production.ProductProductPhoto ACTUALIZACIÓN 
SET ProductPhotoID =? 
? DONDE ProductID = ";
if (sqlsrv_query ($ conn, $ tsql, array ($ Número de foto, $ _POST ['productid'])) === false) 
{Die (FormatErrors (sqlsrv_errors ()));}
PDO
intentar 
{ 

$ Tsql = "INSERT INTO Production.ProductPhoto (LargePhoto) 
VALORES "(?); 
$ UploadPic = $ conn-> prepare ($ tsql); 
$ FileStream = fopen ($ _FILES ['file'] ['tmp_name'], "r"); 
$ UploadPic-> bindParam (1, 
$ FileStream, 
PDO :: PARAM_LOB, 
0, 
PDO :: SQLSRV_ENCODING_BINARY); 
$ UploadPic-> execute ();
$ Número de foto = $ conn-> lastInsertId (); 
$ Tsql = "Production.ProductProductPhoto ACTUALIZACIÓN 
SET ProductPhotoID =? 
? DONDE ProductID = "; 
$ AssociateIds = $ conn-> prepare ($ tsql); 
$ associateIds-> execute (array ($ Número de foto, $ _POST ['productid'])); 
} 
catch (Exception $ e) 
{ 
die (print_r ($ e-> getMessage ())); 
}
Una vez más, los dos archivos que componen la aplicación de ejemplo se encuentran en el archivo zip adjunto a este mensaje.
Eso es todo por este post. Por favor, hágamelo saber lo que piensa de esta versión previa del controlador de SQL Server para PHP 2.0. Me aseguraré de que el equipo de desarrollo escucha sus comentarios.

Conectar a una BD mysql desde SQL SERVER con servidores vinculados

Escenario :


Tengo un servidor principal con SQL Server como manejador de base de datos. Adicionalmente, tengo un servidor Linux (con redhat) con un sistema en php que conecta a una base de datos MySQL  instalada en dicho terminal.  El problema : Necesito pasar información de SQL a Mysql de 2 a 4 veces por día.  ¿Como hago para pasar toda la información y que se mantenga en la capa de Datos ?. Después de varios días de investigación y de haber encontrado 3 posibles soluciones sin salir de la capa de datos ( freetds era una muy buena opción, ejecuciones con procesos en segundo plano bajo en cron de linux) , he optado por solucionar el problema con lo que me parece la manera mas elegante y certera. servidores vinculados.

¿Qué es un servidor vinculado?

Su nombre lo dice todo, agrego una BD externa al SQL y la hago accesible, con esto puedo hacer todo tipo de consultas tipo transac sql. 

EMPEZAMOS

1. Instala los driver que te permite manejar la base Mysql.  Entonces bajar el conector  ODBC para mysql

http://dev.mysql.com/downloads/connector/odbc/


2. Luego de instalarlo debemos configurarlo, creamos el odbc y lo configuramos:

Yo tengo el sql server 2005 :

Entra al "Panel de Control" y busca "Herramientas Administrativas". Entra en este y aparecerá "Orígenes de datosODBC".

Se abrirá la siguiente ventana. Busca el botón "Agregar".




Clic sobre Mysql ODBC 3.51 driver (que es lo que instalaste en el paso 1). Luego sobre finalizar.


Se abre el conector ODBC del MySQL. En este debes definir los parámetros de conexión a tu base de datos MySQL. Simplemente agrega el nombre de tu servidor, tu user y password. No olvides colocar el nombre de la conexión (DataSource Name). Lo vamos a usar en el Paso 3. Sugiero "MySQL_LINK".



3. Vincular Mysql con SQL Server 2005

En el  administrador corporativo del SQL Server 2005  buscas la opción "Objetos del servidor". Dentro existe una subcarpeta llamada "Servidores vinculados".

 

clic derecho sobre Servidores vinculados y buscamos la opción "Nuevo servidor vinculado".

 

Se abre la ventana "Nuevo servidor vinculado" y colocas los parámetros para conectarse con la base MySQL.

Marcas la opción "Otro origen de datos" . Debes colocar los siguientes parámetros.

Servidor vinculado : LINKED_MYSQL (coloca el nombre que desees)

Proveedor : Microsoft OLE DB Provider for ODBC Drivers.

Nombre del Producto : MySQL

Origen de datos : MySQL_LINK (Ojo: Este es el nombre del ODBC que creaste en el paso 2, colocale el que tu hayas colocado.)

Cadena de proveedor : ODBC:DSN=MySQL_LINK::Table=aaa (el valor aaa es una tabla de la base MySQL, coloca cualquiera de las tablas de tu base. DSN es el nombre del ODBC que creaste en el paso 2)

Catálogo : pyp1 (nombre de la base de datos a la cuál quieras conectarte)



Dentro de la misma ventana, clic en la ficha "Seguridad" para que establecer con que user y password nos vamos a conectar. Clic en "Se establecerán usando este contexto de seguridad" y colocamos el user y password. Luego clicen el botón "Aceptar". Eso es todo, ya tenemos vinculado nuestro servidor MySQL con SQL 2005.

 

4. Hacer  consultas SQL en el servidor vinculado.

Ubicación : En el servidor central donde esta la base SQL Server 2005

Vayamos a probar si podemos hacer consultas en MySQL.

Ejecutamos exec sp_Tables_Ex 'LINKED_MYSQL' (Devolvemos información acerca de las tablas de el servidor que hemos vinculado.LINKED_MYSQL es el nombre del servidor vinculado que hemos creado). Se deben mostrar las tablas del servidor vinculado.


 


Veamos algunos ejemplos de sentencias SQL con openquery.

¿Si quiero mostrar datos de las tablas?

select * from openquery (LINKED_MYSQL,'select * from aaa')

¿Si quiere eliminar los datos de un tabla?

Delete openquery (LINKED_MYSQL,'select * from aaa'). ¡Borramos todos los datos de la tabla 'aaa'!

¿Si quiero insertar datos en dicha tabla?

insert into openquery(LINKED_MYSQL,'select * FROM aaa')
(Field1, Field2,...)
SELECT Field1, Field2,...
FROM Tabla

¿Y para actualizar datos?

Update openquery(LINKED_MYSQL,'Select * from aaa') SET Cod_Ind = 7
WHERE Cod_Ind = 7.5


http://www.forosdelweb.com/f21/como-hacer-insert-liskserver-por-openquery-238208/







Entorno Apache 2.2, PHP 5.4 y SQL Server

Este tutorial explica como preparar un entorno de programación, sobre Windows 7, utilizando un servidor web Apache 2.2PHP 5.4 y el DBMS SQL Server 2008 utilizando los drivers sqlsrv.dll de Microsoft.

Considerando que el sistema operativo y el servidor de base de datos estan funcionando correctamente y éste último aceptando conexiones en red procedo a los siguientes pasos:

Instalando Apache 2.2

Primero hay que descargar el archivo de instalación desde el sitio oficial de Apache, en este caso utilizamos el archivo httpd-2.2.23-win32-x86-no_ssl.msi. Luego se procede a la instalación típica.
Para verificar que el servidor esta funcionando hay que ingresar a http://127.0.0.1 desde tu navegador preferido y verás el conocido It Works!.

Instalación de PHP 5.4

Nuevamente hay que descargar los archivos de instalación, en este caso un zip, desde la página oficial y utlizamos el denominado VC9 x86 Thread Safe.
Descomprimimos en nuestra PC el contenido, personalmente lo ubiqué en C:\PHP\

Carga de módulo en Apache

Luego de situar los archivos de PHP hay que realizar el enlace con Apache para que el servidor web utilice como manejador de archivos .php al intérprete. Para esto hay que editar el archivo httpd.conf situado en \el directorio de instalación\Apache2.2\conf y agregar las siguientes líneas en la sección LoadModule
1
2
3
LoadModule php5_module "c:/PHP/php5apache2_2.dll"
AddHandler application/x-httpd-php .php
PHPIniDir "C:/PHP"
Luego hay que reiniciar el servidor web y ya tenemos funcionando PHP. Para corroborar la configuración se puede escribir la función phpinfo(); dentro de un archivo .php y ejecutarlo en el navegador.
Antes de continuar hay que ajustar la ruta al archivo de configuración php.ini, esto se hace renombrando el archivo php.ini-production a php.ini y reiniciar nuevamente el servidor.
Configuración de PHP luego de renombrar archivo php.ini

Configuración con MSSQL SERVER 2008

Para conectar PHP con SQL Server es necesario los drivers de conexión, en este caso utilizaremos los provistos por Microsoft. Cabe mencionar que existen otros como mssql soportado hasta versiones anteriores a PHP 5.4 y además era multiplataforma. En contraposición sqlsrv funciona sólo en plataformas Windows ya que utiliza SQL Native Client 12 que permite conectar hasta SQL Server 2012.
Primero hay que dercargar el siguiente archivo, al ejecutarlo se desempaqueta varios archivos .dll. Para la version Thread Safe de PHP copiamos los archivos php_sqlsrv_54_ts.dll y php_pdo_sqlsrv_54_ts.dll (revisar el SQLSRV_Readme.htm) y lo pegamos en el directorio de instalación de PHP en el directorio llamado \ext\.
Ahora hay que editar el archivo php.ini y añadir las siguientes líneas:
extension=php_sqlsrv_54_ts.dll
extension=php_pdo_sqlsrv_54_ts.dll
 Debes asegurarte que esté habilitada la opción extension_dir = C:\PHP\ext
Ahora hay que descargar el archivo SQL Native Cient 2012 según la arquitectura del sistema e instalarlo.
Por último reiniciar el servidor web y verificar nuevamente con la instrucción phpinfo() la carga de la extensión.
Configuración del driver sqlsrv sobre php

Prueba de conexión

Se puede realizar una prueba de conexión ejecutando el siguiente programa:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
$db_usr = 'usuario';
$db_pass = 'pass';
$db_server = 'servidor';
$db_name = 'db';
 
$db_info = array('Database'=>$db_name, 'UID'=>$db_usr, 'PWD'=>$db_pass);
 
$db_link = sqlsrv_connect($db_server, $db_info);
 
if(!$db_link){
die( print_r( sqlsrv_errors(), true));
}
echo 'Conectado';
?>

Convertir cadenas para enviarlos de php a SQL.

Convertir cadenas para enviarlos de php a SQL. 

htmlentities();  permite retirar caracteres raros ( á é í ó ú ñ Ñ etc ) y los convierte a su equivalente en html &aacute;


html_entity_decode() cambia los caracteres en html a caracteres codificados .


addslashes() convierte comillas simples o dobles a su equivalente con slash adelante \'



stripslashes() retira los slash de las comillas

ejemplo :

function sintaxis_sql_encode($campo){
return htmlentities(addslashes($campo));
}

function sintaxis_sql_decode($campo){
return html_entity_decode(stripslashes($campo));
}

CommentFB