Uso de POST, GET y REQUEST en PHP

El lenguaje de PHP es un lenguaje de código abierto muy popular adecuado para el desarrollo web; PHP cuenta con etiquetas que nos ayudan al envió y recuperación de datos desde un servidor como lo son POST, GET  Y REQUEST.

Para utilizar estas etiquetas antes que nada se requiere de tener un servidor activo ya sea WampServer, Xampp, etc.

El siguiente formulario será utilizado para los tres próximos ejemplos modificando solo partes significativas del código.

El código de HTML es el siguiente:

GET

El método GET es un arreglo asociativo de variables enviados por medio de la URL. Consiste en enviar la información de un formulario y que se “incruste” en la URL junto con la página php.

La estructura de la URL es la siguiente.

altaRegistro.php?txtNombre=Nombre&txtAlias=Alias&txtPwd=123&retxtPwd=123

Donde se divide la URL en la dirección y los datos que se envían. El ‘?’ tiene la función de ser un separador entre la página y la información enviada y el ‘&’ sirve para separar los datos entre sí.

Para extraer la información por GET se utiliza la etiqueta $_GET y el nombre de la variable en el arreglo, tomando como ejemplo $_GET[‘txtNombre’].

POST

El método POST es un arreglo dinámico de variables asociadas a una petición. Aunque es algo parecido al método GET la característica de este método es que el envió de información es “invisible” para el usuario ya que a comparación del método GET no se muestra la información en la URL.

Para extraer la información por POST se utiliza la etiqueta $_POST y el nombre de la variable en el arreglo, tomando como ejemplo $_POST[‘txtNombre’].

REQUEST

El método REQUEST es un arreglo asociativo que por defecto contiene el contenido de tres métodos: GET, POST y COOKIE.

Una gran característica que tiene REQUEST es que se considera como una variable “superglobal” lo que significa que es una variable que estará disponible en cualquier parte del script ya sean métodos o funciones dentro del mismo.

Al utilizar REQUEST para obtener la información enviada desde un formulario en la parte de la etiqueta “method” se puede usar tanto GET como POST.

Cómo crear una conexión ORACLE 11g – ASP.NET utilizando C#

Los siguientes pasos muestran la manera de establecer conexión entre el sistema gestor de base de datos Oracle y el modelo de desarrollo ASP.NET.

Antes que nada es importante mencionar que en algunas ocasiones es conveniente dejar a un lado lo convencional y no utilizar solo aplicaciones de Microsoft para brindar tecnología a un sistema. Muchas empresas y DBA`s (Database Administrator) eligen los servicios de Oracle antes que otros motores de BD convirtiéndolo en uno de los mejores y mas utilizados. Algunas razones por las que es seleccionado son por las características de desempeño, facilidad en la escalabilidad, la alta disponibilidad en la base de datos y la seguridad implementada en sus aplicaciones.

Para este ejercicio necesitarás:

1.- Para comenzar se debe de construir la base de datos que se desea utilizar en Oracle.

2.- Una vez creada la base, se debe de crear el proyecto de tipo Web Aplication y agregar un WebForm.

Es importante agregar la siguiente referencia al proyecto ya que sin ella no se podrá tener accedo a ninguna libreria Oracle.

3.-Se agrega la referencia al componente Oracle Data Access, ubicado en la carpeta de instalacion Oracle  en el disco c de la computadora. /oraclexe/app/oracle/product/11.2.0/server/odp.net/bin/OracleDataAccess.dll

4.-A continuación se agrega una nueva clase dentro del proyecto.

5.-Ahora dentro de la clase antes creada se realiza el código de conexión:

//Se declara la siguiente linea para el acceso a las librerías Oracle
 using Oracle.DataAccess.Client;
//declaración de Objeto Conexión a Oracle
 private OracleConnection cn;
public Conexion()
{
  //Utilizaremos un try/catch para verificar que no ocurrió algún error 
  try{
    //Se crea una nueva conexión, el nombre del Usuario y contraseña son
     los establecidos en el momento de la instalación de Oracle
     cn= new OracleConnection("Data Source=*; User Id=SYSTEM;
                               Password=123456;");
    
   //Se abre la conexión creada
     cn.Open();
   //Mostraremos un mensaje en pantalla con el estado de la conexión
     MessageBox.Show(cn.State.ToString()); 
     }
catch(Exception e)
      {
   //Mensaje de Error en caso de no establecer conexión
    MessageBox.Show("No se realizar la conexion. Error: " + ex);
     }
 }

Recuerda que es necesario cerrar la conexión.

 public void cerrarConexion
   {
  //Cerramos conexión
   cn.Close();
   }

También se debe crear una nueva función de tipo OracleConnection  para regresar la conexión cuando la clase sea llamada.

 public OracleConnection regresaConexion()
 { return cn; }

Listo ya tenemos nuestra clase conexión, la cual utilizaremos cada vez que necesitemos comunicarnos con la base de datos en Oracle como se muestra en el siguiente ejemplo:

  Conexion c;
  OracleCommand cmd;
  String query=""; 

private void InsertDatos(object sender, EventArgs e)
  {
    c = new Conexion(); //nueva conexión
    query="INSERT INTO  Nombre_Tabla VALUES(Valores_a_Insertar_en_Tabla);"
 
    cmd = new OracleCommand(query, c.regresaConexion());
    cmd.ExecuteNonQuery();
   //Mensaje Inserción exitosa
    MessageBox.Show("Datos insertados correctamente");
    c.cerrarConexion(); //se cierra la conexión
 }

Es importante mencionar que OracleCommand representa una instrucción SQL o un procedimiento almacenado que se va a ejecutar en una base de datos.

El link de la documentación de Oracle se encuentra en el enlace siguiente:
http://www.oracle.com/technetwork/es/database/enterprise-edition/documentation/index.html

[IIS] Subir archivos de mas de 4MB

En algunas ocasiones es necesario adjuntar archivos desde el cliente, ya sea para enviar mi CV (Hoja de Vida) en algún registro a un Diplomado o simplemente para asociar una imagen a mi cuenta (Avatar), anteriormente ya vimos Cómo cargar archivos en SQL Server con ASP.NET usando C#  Pero IIS tiene definido por default permitir solo el cargado de archivos menores a 4Mb, es decir archivos relativamente pequeños.

En caso de necesitar archivos de mas de 4MB, se deberá hacer lo siguiente:

En el archivo de configuración Web.config:

Agregar la etiqueta <httpRuntime>, como propiedad agregar maxRequestLength y como valor de esta propiedad, establecer como entero (Int32) el tamaño en KB del limite del búfer, es decir del tamaño máximo del archivo que se puede seleccionar.

<httpRuntime maxRequestLength="10240"/> //10 MB

Saludos

Cómo cargar archivos en SQL Server con ASP.NET usando C#

El siguiente ejemplo muestra las líneas necesarias para cargar un archivo en una base de datos, el ejemplo se basará en usar SQL Server, así que los pasos son:

1.- Antes de comenzar con la creación del código es necesario crear la base de datos, creamos una tabla, le llamaré “tblArchivos

2.- Las columnas que contendrá la tabla “tblArchivos” serán:

Imagen

Recuerden que esta tabla solo nos servirá de ejemplo para realizar el cargado de los archivos, así como para conocer que tipo de archivo se está cargando, es probable que para un ejercicio real esta tabla se complemente.

Los siguientes pasos muestran lo necesario en cuanto a controles y lineas de código para hacer la transferencia del archivo al servidor.

3.- Una vez creado el proyecto de tipo Web Aplication, agregar un WebForm.

4.- Dentro de la página añadir un control de tipo “FileUpload” y un control de tipo “Button“, el primero nos servirá para seleccionar el archivo que queremos cargar, el segundo nos servirá para invocar el envío de datos al servidor.

5.- Al control de tipo FileUpload le llamaremos “archivoSeleccionado”, al botón pueden darle el nombre que mejor les parezca.

6.- Invocar el método onClick del botón, ahí colocaremos el siguiente código.

//Con esta condición nos aseguramos de dos cosas, primero que el se haya realizado la carga o la transferencia de un archivo ya que con PostedFile se recupera la información relacionada al archivo (tamaño, tipo, contenido, etc.) y en segundo lugar que el arreglo contenga al menos un archivo cargado.
if ((archivoSeleccionado.PostedFile != null) &&
(archivoSeleccionado.PostedFile.ContentLength > 0))  
{

//Con la clase HttpPostedFile se obtiene acceso de forma individual a los archivos cargados
HttpPostedFile imgFile = archivoSeleccionado.PostedFile;

//Creamos byteFile que contendrá todo el contenido del archivo
Byte[] byteFile = new Byte[archivoSeleccionado.PostedFile.ContentLength];

//Se lee el contenido del archivo en la variable creada byteFile
imgFile.InputStream.Read(byteFile, 0, archivoSeleccionado.PostedFile.ContentLength); 

//Se crea la sentencia SQL que insertará los datos en la tabla de la BD
string sql = “insert into tblArchivos (Image, Tipo) values (@Archivo, @Tipo)”;

//Se crea el recurso de conexión a la BD, la cadena de conexión varia de acuerdo a los parámetros establecidos por su conexión al gestor, usuario, contraseña y método de conexión.
SqlConnection conn = new SqlConnection(“String de conexión al gestor y a la BD.”);

//Se crea el recurso de Command que permitirá ejecutar la instrucción SQL.
SqlCommand cmd = new SqlCommand(sql, conn);

cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(“@Archivo”, System.Data.SqlDbType.Image);
cmd.Parameters.Add(“@Tipo”, System.Data.SqlDbType.VarChar, 50);
cmd.Parameters[“@Archivo”].Value = byteFile;
cmd.Parameters[“@Tipo”].Value = archivoSeleccionado.PostedFile.ContentType;

//se abre la conexión al gestor de BD y se hace la ejecución de la sentencia
conn.Open();

cmd.ExecuteNonQuery();
conn.Close();

}

De esta manera el código anterior permite a partir de una página web seleccionar un archivo y cargarlo en una BD.

El límite de tamaño de un archivo está restringido a 4096 KB es decir 4MB, si queremos permitir la carga de archivos de mayor se debe especificar en el archivo de configuración Web.Config, de igual manera si se quiere restringir a un tamaño menor, en el ejemplo siguiente se permite el tamaño hasta 8MB.

<httpRuntime targetFramework=”4.5″ executionTimeout=”90″ maxRequestLength=”8192″ />

Otros valores para maxRequestLength son: 16384 para 16 Mb, 65536 para 64 Mb, y así sucesivamente.

Saludos

[ASPX] Mostrar Imagen en Base de Datos en una etiqueta

Es muy común que en alguna aplicación además de información de tipo texto o numérico (entre otras), sea también necesario almacenar imágenes correspondientes a la información que se requiere representar.

Supongamos una aplicación en la cual se desean mostrar los eventos que se realizaran en cierta institución ordenada en cierta manera pero que además de la información propia del evento, se quiera mostrar un carrusel con JQuery en el cual se muestren los banners correspondientes a cada evento.

Para esto se deberá almacenar dicho banner en Base de Datos junto con la información textual del evento. He aquí la pregunta. Si mi imagen esta almacenada en base de datos, ¿Cómo puedo mostrar esta imagen en una etiqueta IMG? A continuación se muestra una opción para hacerlo.

Paso 1: Crear un WebForm llamado Imagen.aspx

Este formulario funcionara como url local para acceder a la imagen.

Paso 2: Obtener la imagen.

En este paso se consulta la base de datos para obtener la imagen en el evento Page_Load de la página Imagen.aspx, esto se hace de la misma forma que con cualquier dato.

//Recuperar el identificador
string id = Request.QueryString["id"];
//Crear conexion
using (SqlConnection con = new SqlConnection())
{
   //Obtener ConnectionSctring de web.config
   System.Configuration.Configuration rootWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
   System.Configuration.ConnectionStringSettings connString;
   if (0 < rootWebConfig.ConnectionStrings.ConnectionStrings.Count)
   {
     connString=rootWebConfig.ConnectionStrings.ConnectionStrings["MiCadena"];
     if (null != connString)
     {
       con.ConnectionString = connString.ToString();
       con.Open();
       using (SqlCommand com = con.CreateCommand())
       {
          //tipo de comado StoreProcedure o consulta
          com.CommandType = CommandType.Text;
         //nombre del StoreProcedure o consulta
          com.CommandText = "SELECT Banner FROM Eventos WHERE IdEvento=" + id;
         try
         {
            //Ejecutar comando
            byte[] img = (byte[])com.ExecuteScalar();
         }catch(SqlException se){}
      }
      //Cerrar conexion
      con.Close();
   }
 }
}

Paso 3: Una vez obtenida la información de la imagen. Solo nos resta responder esta imagen como contenido de tipo “image/jpeg” ya que JPG es el formato en que se almaceno la imagen en la Base de Datos. Ver Tipos Mime


MemoryStream str = new MemoryStream();
str.Write(img, 0, img.Length);
Bitmap bit = new Bitmap(str);
Response.ContentType = "image/jpeg";//Responder Img JPG
bit.Save(Response.OutputStream, ImageFormat.Jpeg);

Paso 4: En el codigo HTML, mostrar la imagen de la siguiente manera:

<img alt="imagen1" src="Imagen.aspx?id=1" />

Con esto nos queda una URL local con la cual accedemos a la imagen que necesitamos.

Gracias

Mostrar PDF en IFRAME dentro de Master Page

En algunas ocasiones es necesario mostrar archivos PDF en un sitio Web, por ejemplo, en un Sistema que genera Ordenes de Pago, pues es lógico pensar que las ordenes generadas sean mostradas en un Web Form, para su impresión o almacenamiento por parte del cliente.

He aquí una forma de mostrar un archivo PDF creado en Directorios de la aplicación (Servidor) en un Web Form, hijo de una Master Page.

ASPX


<iframe id="pdf" runat="server" height="800" width="600"><iframe>

Como puedes darte cuenta, coloco la etiqueta runat=”server”, esto hace visible este control del lado del servidor.

C#

//Nuevo control HTML y Buscamos dentro del ContentPlaceHolder del sitio llamado "contenido"
HtmlControl frame1 = (HtmlControl) Page.Master.FindControl("Contenido").FindControl("pdf");
//Asignamos a la propiedad "src" la ruta donde se genero el archivo
frame1.Attributes["src"] = "../../Documentos/" + Session["usuario"] + ".pdf";

Con esto se le indica al contro iframe (de lado del cliente), la ruta del archivo PDF (del lado del servidor). Esto bastará para mostrarse correctamente.

Saludos.
Gracias.

ASPX + TinyMCE

En algunas ocasiones es necesario crear aplicaciones web, cuyos formularios soliciten información a los usuarios (Eje: El registro a un diplomado virtual), en donde estos puedan agregar enlaces a alguna pagina, crear tablas para organizar contenidos, enumerar en lista algunas características o elementos, resaltar texto o hacerlo mas grande.

Claro!!!.. Las respuesta es un TextBox que tenga la propiedad de poder editar contenido como HTML. Ya que nativamente el control ASP TextBox no cuenta con esta propiedad, es necesario utilizar otras tecnologías como Ajax o en este caso JQuery.

Lo primero que necesitamos es descargar el plugin TinyMCE, un editor de contenido HTML muy popular, que además de todo cuenta con plugins para WordPress, Joomla, etc.

http://www.tinymce.com/tryit/basic.php

Agregamos el directorio tiny_mce a nuestro proyecto, que entre otras cosas continene:

Los archivos .js, los temas, lenguajes, etc.

Luego de esto, ubicamos el asrchivo donde irá el control HTML, y configuramos el plugin:

<script src="tiny_mce/tiny_mce.js" type="text/javascript"></script>
<script type="text/javascript">
tinyMCE.init({
// General options
mode: "textareas",
theme: "advanced",
plugins: "pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions
,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste
,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,
template,wordcount,advlist,autosave",


// Theme options
theme_advanced_buttons1: "bold,italic,underline,strikethrough,|,justifyleft
,justifycenter,justifyright,justifyfull,fontselect,fontsizeselect,
|,tablecontrols",
theme_advanced_buttons2: "bullist,numlist,link,unlink,image,code",
theme_advanced_buttons3: "tablecontrols,|,hr,removeformat,visualaid,|,sub,
sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",
theme_advanced_buttons3: "",
theme_advanced_buttons4: "insertlayer,moveforward,movebackward,absolute,|
,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,
template,pagebreak,restoredraft",
theme_advanced_toolbar_location: "top",
theme_advanced_toolbar_align: "left",
theme_advanced_statusbar_location: "bottom",
theme_advanced_resizing: true,

// Example content CSS (should be your site CSS)
// using false to ensure that the default browser settings are used for
best Accessibility
// ACCESSIBILITY SETTINGS
content_css: false,
// Use browser preferred colors for dialogs.
browser_preferred_colors: true,
detect_highcontrast: true,

// Drop lists for link/image/media/template dialogs
template_external_list_url: “lists/template_list.js”,
external_link_list_url: “lists/link_list.js”,
external_image_list_url: “lists/image_list.js”,
media_external_list_url: “lists/media_list.js”,
// Style formats
style_formats: [
{ title: ‘Bold text’, inline: ‘b’ },
{ title: ‘Red text’, inline: ‘span’, styles: { color: ‘#ff0000’} },
{ title: ‘Red header’, block: ‘h1’, styles: { color: ‘#ff0000’} },
{ title: ‘Example 1’, inline: ‘span’, classes: ‘example1’ },
{ title: ‘Example 2’, inline: ‘span’, classes: ‘example2’ },
{ title: ‘Table styles’ },
{ title: ‘Table row 1’, selector: ‘tr’, classes: ‘tablerow1’ }
],

// Replace values for the template plugin
template_replace_values: {
username: “Some User”,
staffid: “991234”
}
});
</script>

Y finalmente el control que por default debe ser un textarea. Agregamos el
runat=”server” para verlo del lado del servidor y listo.

<body>
<form id="form1" runat="server">
<div>
<textarea runat="server" style="background-color:#000;
width: 300px" id="Texto" name="elm1" rows="15" cols="80"
></textarea>
</div>
</form>
</body>

Error “A potentially dangerous Request.Form value was detected”

Solucion 1:
Uso de las clases HTMLEncode y HTMLDecode.

http://blog.tentaclesoftware.com/archive/2012/05/21/asp-net-4-0-tinymce-and-
ldquoa-potentially-dangerous-request.aspx

Solucion 2:
Deshabilitar la RequestValidation.

Default.ASPX
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="TinyMCE.Default" ValidateRequest="false">

Web.Config

<location path="Default.aspx">
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
</location>

Gracias.

< %# Eval(“Valor”)% >

Últimamente me he percatado de la valiosa ayuda que esta función
tiene, y es que a veces es necesario procesar la información que el origen de
datos nos da, pero todo esto sobre algún control de datos.

Como ejemplo, he desarrollado una aplicación de evaluación de
escenarios/temas, donde cada usuario autenticado y autorizado, puede dar
valores de probabilidad a un escenario, en una escala del 1 al 5, registrando
en una Base de Datos, la evaluación que cada usuario le ha dado a cada uno de
los escenarios.

Pero sabemos que un usuario no terminará de evaluar todos
los escenarios en una sola sesión, así que es recomendable mostrarle una lista
de los escenarios y recordarle cuales ya han sido evaluados y cuáles no.

Para esto utilice un ListView como control de repetición
de datos, para mostrar los escenarios/temas, y si ya han sido evaluados o no.
Para mostrar si ya han sido evaluados muestro una y si o muestro una .

Aqui el código de como hacerlo:

Dentro del ASP ListView

<HeaderTemplate>
<table cellpadding="0" cellspacing="0" width="700px" style="font-family:Calibri, Sans-Serif">
</HeaderTemplate>
<ItemTemplate>
<%# Convert.ToInt32(Eval("Probabilidad")) > 0 ? "<img src="../images/palomita.png" width="20px" />" : "<img src="../images/tachita.png" width="15px" />"%>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>

Quedando algo asi:

Gracias


Facebook
Twitter
More...

Customizar Rows en un ASP Gridview

La manera más fácil de utilizar un ASP Gridview es que a partir de un origen de datos seleccionado Visual Studio, cree automáticamente las columnas y el tipo de control en el cual se representaran los datos, generalmente de tipo ASP BoundField.

Pero cada caso es muy diferente a los demás, en ocasiones esto no es muy conveniente debido a la extensa longitud de algunos datos.

Desarrollando un acortador de URL’s me encontré con un dato que quería mostrar en una columna de un ASP Gridview que era demasiado extenso (Url Larga), y al darle un ancho fijo a la columna lo único que hacia era distribuir el contenido en varias líneas. Eso si la cadena tenía espacios, si no, no respetaba el ancho de la columna.

Entonces, como no era necesario mostrar la cadena completa (Url Larga), decidí, hacer lo siguiente.

Dentro de la etiqueta <Columns> del Gridview
1.- Cambiar el tipo ASP BoundField por el tipo ASP ItemTemplate
2.- Dentro de <ItemTemplate>, Colocar un
<div> con el ancho requerido, y el estilo overflow:hidden.
3.- Dentro del div evaluar la expresión del origen de datos <%# Eval(“Url Larga”)%>

De esta manera, dentro del div se mostrara el contenido de la expresión, el ancho no cambiara a pesar de la longitud del contenido, y con el estilo nos aseguramos que el texto que se salga del div no aparezca, quedando algo asi:

De igual manera para la columna Url Corta, modifique el BoundField por ItemTemplate para poder mostrar este campo como un enlace <a>

Gracias

Bindear un ASP Label desde un SqlDataSource

Por default, el control ASP Label no es bindeable a un origen de datos, dado que no posee la propiedad DataSource.

Pero si por alguna razon se necesita mostrar informacion desde un origen en tiempo de ejecucion, esta es una buena solucion:

“Envolver” el control Label dentro de algun otro que sea bindeable, por ejemplo un Formview

<asp:FormView ID=”Saldo” runat=”server” DataSourceID=”SqlDataSourceSaldo”>
     <ItemTemplate>
              <asp:Label CssClass=”formulario negritas” ID=”SaldoActualLabel” runat=”server” Text='<%# Eval(“Monto_Ejercido”)%>’ />
    </ItemTemplate>
<asp:FormView>

Y si se requiere algun formato en particular:
     Text='<%# Eval(“Monto_Ejercido”,”{0:c}”) %>’

Gracias