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;
}
Desde el 2012 llevo mis apuntes en este blog documentando lecciones aprendidas, formatos, procesos, negocios, metodologías, herramientas, guias y buenas prácticas para el mundo informativo y la gestión de proyectos. Habilidades blandas, habitos, frases de líderes, empresarios exitosos y apuntes personales que son el resultado de investigaciones que realizo para mejorar cada día en el ambito personal y profesional.
Mostrando entradas con la etiqueta sql. Mostrar todas las entradas
Mostrando entradas con la etiqueta sql. Mostrar todas las entradas
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í:
- 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.
- 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í:
- 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.
- 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.2, PHP 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 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
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.
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 á
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));
}
htmlentities(); permite retirar caracteres raros ( á é í ó ú ñ Ñ etc ) y los convierte a su equivalente en html á
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));
}
Etiquetas:
BD,
cadena texto,
crear,
EDITAR,
php,
php sql mysql injection ataques,
sql,
validaciones
Suscribirse a:
Entradas (Atom)
