Php para dummies

Respuesta a un comentario sobre PHP: hablemos de seguridad

Enviado por clbustos el Mié, 21/11/2007 - 10:49.

Un usuario acaba de enviarnos un comentario, preguntando porque falla lo siguiente (he eliminado las líneas con comentarios del comentario original)

  1.  <?php
  2.   include('conexion.php');
  3.   //Ejecucion de la sentencia SQL
  4.   mysql_query("INSERT INTO medicamento (grupo, nombre,clave,formula,prioridad , presentacion, contenido,unidad_medida,existencia,nivel ) VALUES ($_POST[clave],$_POST[nombre],$_POST[grupo], $_POST[prioridad], $_POST[formula], $_POST[presentacion], $_POST[unidad_medida], $_POST[nivel], $_POST[existencia], $_POST[contenido])");
  5.  ?>

Más allá del problema obvio de la falla de comillas en los valores de la query, alrededor de los $_POST, lo más grave es la posibilidad de hacer una inyección SQL feroz.

mis pininos en php

Enviado por rastaman el Mar, 07/11/2006 - 17:54.

IRIE HERMANOS.

me incio en este mundo del php y como siempre ya he leido los manuales, de php les comento que tengo un mundo de dudas

resulta que tengo apache + php para consultar pedidos, ventas, etc. pero en un reporte me da un error de cantidad. mi duda es php se conecta a una base de datos o que pasa si alguien me puede guiar se lo agradecere por toda la vida.

gracias.

Como borrar múltiples registros con checkbox

Clasificado en:

Este último tiempo, un simpático chico argentino se ha vuelto cliente habitual de mi MSN. Me acaba de codeguntar como eliminar múltiples campos de una base de datos vía checkbox. Es una interesante consulta, así que les daré una breve explicación de las diversas formas de hacerlo.

Primero, se deben codeparar los campos de manera adecuada. Para ello, hay dos formas.

La que ocupo yo, por sanidad mental, es la siguiente

  1.  <input type='checkbox' name='campos[$id]'>

Donde $id es el valor del id para la tupla que queremos borrar. Si enviamos por post, la función php que recibe debe ser similar a la siguiente

  1.  <?php
  2.  if(!empty($_POST['campos'])) {
  3.   $aLista=array_keys($_POST['campos'];
  4.   $sQuery="DELETE FROM tabla where id IN (".implode(',',$aLista).")";
  5.  ?>

Esa es la forma más simple. Una de las cosas que me molestan mucho de las aplicaciones que he visto es que casi nadie se molesta en usar el IN. Esta instrucción les permite seleccionar 1 o más valores para un campo, con un mínimo de utilización de recursos. La forma ineficiente sería

  1.  <?php
  2.  if(!empty($_POST['campos'])) {
  3.   $aLista=array_keys($_POST['campos']);
  4.   foreach($aLista as $iId) {
  5.   $sQuery="DELETE FROM tabla where id=$iId";
  6.  }
  7.  ?>

¿Por qué es mala esta última forma? Porque para cada campo borrado, se debe realizar una nueva conexión a la base de datos. Usando IN, el sistema de base de datos busca de forma muy rápida en la tabla que valores debe borrar y podemos obtener un aumento de rendimiento de 100% o más!

Ahora, la segunda forma:

Para esto, debemos usar en los valores de los checkbox

  1.  <input type='checkbox' name='campos[]' value='$id'>

Donde $id es el valor del id para la tupla que queremos borrar. La función php queda así

  1.  <?php
  2.  if(!empty($_POST['campos'])) {
  3.   $aLista=$_POST['campos'];
  4.   $sQuery="DELETE FROM tabla where id IN (".implode(',',$aLista).")";
  5.  }
  6.  ?>

Ustedes dirán que esta forma es más sencilla. Claro, pero no es genérica. La primera forma nos permite incorporar varios valores de variable en el mismo input. Por ejemplo, valores de codeferencia distintos para varios usuarios

  1.  <input type='checkbox' name='campos[$id_usuario][$id_codeferencia]'>
Cosa que de la segunda forma quedaría
  1.  <input type='checkbox' name='campos[$id_usuario][]' value='$id_codeferencia'>

Lo cual, a mi entender, no es tan bonito.

Nos vemos!

Heredoc

Clasificado en:

Una de los típicos problemas de principiante es hacer funcionar esos malditos Heredoc. Aquí va un resumen:

La documentación se encuentra en Language Reference ->Types -> Strings ->Syntax ->Heredoc

El formato es el siguiente:

  1.  <?php
  2.  $sTabla="usuarios";
  3.  $sCond="usr=1";
  4.  $sQuery= <<<QUERY
  5.  SELECT * FROM $sTabla WHERE $sCond
  6.  QUERY;
  7.  ?>

QUERY(el identificado) puede ser reemplazado por cualquier otro nombre. No olviden:

  • Poner inmediatamente un salto de línea después del primer identificados
  • Terminar con un salto de línea, identificador y punto y coma.

Lo bueno y bonito del HEREDOC es que puede ser utilizado para hacer búsquedas masivas dentro del código, por ejemplo, buscar todos los puntos en que se hacen querys. Es cosa de ocupar siempre el mismo identificador. Otra ventaja es que permite formatear el texto tal cual como va a salir (ideal para aplicaciones de consola o grabaciones a archivos) y que parsea las variables. Muy lindo, como ya he señalado.

Eso no más. Sayonara!

Función para validar RUT, en PHP

Clasificado en:
Gracias a Cristian(mi compañero de pega) y a un par de páginas, logré dar con el código necesario para validar el RUT, o sea, verificar que tenga el formato correcto y el dígito verificador sea el adecuado. Disfruten!
  1.  <?php
  2.   /**
  3.   * Verifica que el rut ingresado sea v&aacute;lido
  4.   * Debe estar en formato xxxxxxxx-x
  5.   * @return bool
  6.   */
  7.   function validarRut($sUsr) {
  8.   if (!preg_match("/(\d{7,8})-([\dK])/", strtoupper($sUsr), $aMatch)) {
  9.   return false;
  10.   }
  11.   $sRutBase = substr(strrev($aMatch[1]) , 0, 8 );
  12.   $sCodigoVerificador = $aMatch[2];
  13.   $iCont = 2;
  14.   $iSuma = 0;
  15.   for ($i = 0;$i&lt;strlen($sRutBase);$i++) {
  16.   if ($iCont>7) {
  17.   $iCont = 2;
  18.   }
  19.   $iSuma+= ($sRutBase{$i}) *$iCont;
  20.   $iCont++;
  21.   }
  22.   $iDigito = 11-($iSuma%11);
  23.   $sCaracter = substr("-123456789K0", $iDigito, 1);
  24.   return ($sCaracter == $sCodigoVerificador);
  25.   }
  26.  ?>

Array bidimensional en base de datos

Clasificado en:

En la lista de correos de php, ante la pregunta

Estimados listeros, ¿Cómo podría guardar un array bidimensional en un mysql?

Se me ocurrió algo como:

Primero, crear una tabla con campos ARRAY_ID,FILA_ID,COL_ID,VALOR, con las tres primeras col como clave primaria

Entonces, guardas con

  1.  <?php
  2.  foreach($aBi as $sRow=>$aCols) {
  3.   foreach($aCols as $sCol=>$sValor) {
  4.   $query="insert into arrays (array_id,fila_id,col_id,valor) VALUES ('$sIdArray','$sRow','$sCol','$sValor')";
  5.   }
  6.  }
  7.  ?>

para recuperar, nada más fácil que

  1.  <?php
  2.  
  3.  // supongo uso de AdoDb
  4.  $rs=$db->getArray("SELECT * from arrays where array_id='$sId'");
  5.  while($aTupla=$rs->fetchRow()) {
  6.   $aBi[$aTupla['fila_id']][$aTupla['col_id']]=$aTupla['valor'];
  7.  }

Redireccionador

Felipe Garán, un estimado phpero dummy con muy buen ánimo, me pidio ayuda con un redireccionador basado en el dominio. La idea es que teniendo varios dominios que apunten al mismo hosting, el script mande a una página o a otra dependiendo de nuestro amable carácter.

La cosa sería como la siguiente:

  1.  <?php
  2.  // Redirector
  3.  $http_host=strtolower($_SERVER['HTTP_HOST']);
  4.  $sDefault="http://www.tomatte.com/fullcustom/index2.php"; // aqui coloca la p&aacute;gina por defecto
  5.  // ingresa en la clave el dominio y en el valor la direcci&oacute;n.
  6.  $aSites=array(
  7.  ""=>$sDefault,
  8.  "fullcustom.net"=>"http://www.tomatte.com/fullcustom/index2.php",
  9.  "pizanoalcalde.com"=>"http://www.tomatte.com/pizanoalcalde/"
  10.  );
  11.  $sRedireccion=($aSites[$http_host]?$aSites[$http_host]:$sDefault);
  12.  header("Location: ".$sRedireccion);
  13.  ?>

Sesiones (basico)

Clasificado en:
Uno de los temas clásicos es el trabajo con sesiones. Aquí va un rápido tutorial de como ocuparlas (en php 4.1 y superior).

Lo primero es iniciar la sesión con la función
  1.  <?php
  2.  session_start();
  3.  ?>

Esta función debe ir al inicio de cada página!

Después, simplemente se almacenan las variables necesarias en el array superglobal $_SESSION.
Por ejemplo, si se quiere almacenar el nombre de una persona a partir de un campo "nombre" en un formulario enviado por el método post, la cosa sería
  1.  <?php
  2.  $_SESSION["nombre"]=$_POST["nombre"];
  3.  ?>

Si en otra página se consulta por $_SESSION["nombre"], deberíamos obtener el nombre sin problemas.
Es bastante simple.
Para mayor información, busquen en el manual de php: CXI. Session Handling Functions
Si tienen problemas, agreguen un comentario y trato de ver que pasó

Actualización 1:
Una página con un muy buen tutorial: webestilo.com
Distribuir contenido