Foros del Web » Programando para Internet » PHP »

si no es entero no funciona el script

Estas en el tema de si no es entero no funciona el script en el foro de PHP en Foros del Web. Les muestro el codigo que tengo... todo funciona bien cuando $_POST['descripcion'] = 4; // a un numero pero si $_POST['descripcion'] = "Texto y no numero"; ...
  #1 (permalink)  
Antiguo 05/08/2011, 01:02
 
Fecha de Ingreso: mayo-2011
Mensajes: 167
Antigüedad: 12 años, 11 meses
Puntos: 1
si no es entero no funciona el script

Les muestro el codigo que tengo...
todo funciona bien cuando
$_POST['descripcion'] = 4; // a un numero
pero si
$_POST['descripcion'] = "Texto y no numero"; // me marca error

asi
Unknown column 'asd' in 'field list'

Código PHP:
Ver original
  1. $cotizacion_no=$row_cotizaid['id']+1;
  2. $sub=array_sum($_POST['precio']);
  3. $total=$sub*1.16;
  4. $iva=$total-$sub;
  5. if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  6.   $insertSQL = sprintf("INSERT INTO cotizacion (nombre, fecha, email, razon_social, factura_a, telefono, cotizacion, subtotal, iva, total) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
  7.                        GetSQLValueString($_POST['nombre'], "text"),
  8.                        GetSQLValueString($_POST['fecha'], "date"),
  9.                        GetSQLValueString($_POST['email'], "text"),
  10.                        GetSQLValueString($_POST['razon_social'], "text"),
  11.                        GetSQLValueString($_POST['factura_a'], "text"),
  12.                        GetSQLValueString($_POST['telefono'], "text"),
  13.                        GetSQLValueString($cotizacion_no, "text"),
  14.                        GetSQLValueString($sub, "text"),
  15.                        GetSQLValueString($iva, "text"),
  16.                        GetSQLValueString($total, "text"));
  17.  
  18. $cantidad=$_POST['cantidad'];
  19. $descripcion=$_POST['descripcion'];
  20. $precio=$_POST['precio'];
  21.  
  22. $result = count($_POST['cantidad'])-1;
  23. $i = 0;
  24. while($i <= $result) {
  25.  
  26. $sql2="INSERT INTO cotizacion_detail VALUES (NULL, $cantidad[$i], $descripcion[$i], $precio[$i], $cotizacion_no);";
  27. mysql_select_db($database_noticias, $noticias);
  28.   $Result2 = mysql_query($sql2, $noticias) or die(mysql_error());
  29.  
  30.   ++$i; // Esta instrucción hace que el valor de $i se incremente en 1
  31. }
  32.  
  33.   mysql_select_db($database_noticias, $noticias);
  34.   $Result1 = mysql_query($insertSQL, $noticias) or die(mysql_error());
  35. }
  #2 (permalink)  
Antiguo 05/08/2011, 01:49
 
Fecha de Ingreso: abril-2008
Ubicación: Santa Fe, Argentina
Mensajes: 41
Antigüedad: 16 años
Puntos: 14
Respuesta: si no es entero no funciona el script

Me imagino que GetSQLValueString() es una función que sirve para sanitizar las entradas.

Al no usarla para el INSERT INTO cotizacion_detail dejás esa parte vulnerable a inyecciones SQL.

Si en el formulario ingresases números, lo que le llega a MySQL es lo siguiente:

Código MySQL:
Ver original
  1. INSERT INTO cotizacion_detail VALUES (NULL, 3, 4, 5, 6);

Que es totalmente válido, en MySQL los integers no necesitan encerrarse entre comillas. Si descripcion fuese alfanumérica, llegaría

Código MySQL:
Ver original
  1. INSERT INTO cotizacion_detail VALUES (NULL, 3, 4, asd, 6);

Como no se puede dejar un literal sin comillas, no lo interpreta como un valor, sino como una columna de otro resultset (por si trabajases con SELECT anidados o uniones).

La respuesta es encerrar las variables con comillas simples en el código, pero esto sigue dejando el script vulnerable a inyecciones SQL, así que también las tendrías que pasar por tu función de sanitización.

Podrías considerar usar alguna capa de abstracción como PDO, que se encarga de ayudarte a preparar las consultas.

http://web2development.blogspot.com/2007/04/accesando-nuestra-base-de-datos-con-pdo.html



Para que entiendas mejor, acá te doy un ejemplo. Primero intento insertar foo sin comillas, y luego con

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tablaejemplo (campo VARCHAR(5) NOT NULL);
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> INSERT INTO tablaejemplo VALUES (foo);
  5. ERROR 1054 (42S22): Unknown column 'foo' in 'field list'
  6.  
  7. mysql> SELECT * FROM tablaejemplo;
  8. Empty set (0.00 sec)
  9.  
  10. mysql> INSERT INTO tablaejemplo VALUES ('foo');
  11. Query OK, 1 row affected (0.00 sec)
  12.  
  13. mysql> SELECT * FROM tablaejemplo;
  14. +-------+
  15. | campo |
  16. +-------+
  17. | foo   |
  18. +-------+
  19. 1 row in set (0.00 sec)

Si el valor fuese numérico, funcionaría de ambas maneras

Código MySQL:
Ver original
  1. mysql> INSERT INTO tablaejemplo VALUES (1);
  2. Query OK, 1 row affected (0.00 sec)
  3.  
  4. mysql> SELECT * FROM tablaejemplo;
  5. +-------+
  6. | campo |
  7. +-------+
  8. | 1     |
  9. +-------+
  10. 1 row in set (0.00 sec)
  11.  
  12. mysql> INSERT INTO tablaejemplo VALUES ('7');
  13. Query OK, 1 row affected (0.00 sec)
  14.  
  15. mysql> SELECT * FROM tablaejemplo;
  16. +-------+
  17. | campo |
  18. +-------+
  19. | 1     |
  20. | 7     |
  21. +-------+
  22. 2 rows in set (0.00 sec)

Incluso si el tipo de datos fuese numérico, se le podría pasar un número en formato literal y MySQL lo convertiría al vuelo en numérico ('5' no es un número, es una letra; 5 si es un número)

Código MySQL:
Ver original
  1. mysql> ALTER TABLE tablaejemplo CHANGE campo campo INTEGER;
  2. Query OK, 0 rows affected (0.00 sec)
  3. Records: 0  Duplicates: 0  Warnings: 0
  4.  
  5. mysql> DESCRIBE tablaejemplo;
  6. +-------+---------+------+-----+---------+-------+
  7. | Field | Type    | Null | Key | Default | Extra |
  8. +-------+---------+------+-----+---------+-------+
  9. | campo | int(11) | YES  |     | NULL    |       |
  10. +-------+---------+------+-----+---------+-------+
  11. 1 row in set (0.00 sec)
  12.  
  13. mysql> INSERT INTO tablaejemplo VALUES (3);
  14. Query OK, 1 row affected (0.00 sec)
  15.  
  16. mysql> SELECT * FROM tablaejemplo;
  17. +-------+
  18. | campo |
  19. +-------+
  20. |     3 |
  21. +-------+
  22. 1 row in set (0.00 sec)
  23.  
  24. mysql> INSERT INTO tablaejemplo VALUES ('5');
  25. Query OK, 1 row affected (0.00 sec)
  26.  
  27. mysql> SELECT * FROM tablaejemplo;
  28. +-------+
  29. | campo |
  30. +-------+
  31. |     3 |
  32. |     5 |
  33. +-------+
  34. 2 rows in set (0.00 sec)

Última edición por Henkka; 05/08/2011 a las 01:59

Etiquetas: entero, mysql, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:09.