Sv Community El Salvador

Soporte y Tecnología => Programación => Web => Mensaje iniciado por: vamaya en agosto 15, 2014, 06:09:56 pm

Título: ¿Cómo recuperar variable $_GET en una clase php?
Publicado por: vamaya en agosto 15, 2014, 06:09:56 pm
Buenas tardes amigos, tengo un inconveniente al hacer una consulta a una base de datos mysql, en la que utilizo una variable $_GET, cuando hago esta consuta en mi clases php resulta que NO muestra los resultados porque al parecer esa variable no existe... les dejo mis archivos, ojalá me puedan ayudar, gracias.

usuarios.class.php
Citar
<?php
$suc = "$_GET[f]";
class Usuarios
{
    public function  __construct() {
        $dbhost = 'localhost';
        $dbuser = 'root';
        $dbpass = '';
        $dbname = 'tda';

        mysql_connect($dbhost, $dbuser, $dbpass);

        mysql_select_db($dbname);
    }

    public function buscarUsuario($nombreUsuario){
        $datos = array();
      
        $sql = "SELECT * FROM existencia
                WHERE (id_suc='$suc') AND (cod_prod LIKE '%$nombreUsuario%')
                "; //ESTA ES MI CONSULTA A LA BD, CUANDO UTILIZO $suc NO ME HACE LA CONSULTA.

        $resultado = mysql_query($sql);

        while ($row = mysql_fetch_array($resultado, MYSQL_ASSOC)){
            $datos[] = array("value" => $row['cod_prod'],
                             "descripcion" => $row['descripcion_prod'],
                             "precio" => $row['precio_venta_cli']);
        }

        return $datos;
    }
}

ajax.php
Citar
<?php

include_once 'usuarios.class.php';

$usuario = new Usuarios();

echo json_encode($usuario->buscarUsuario($_GET['term']));

facturar.php
Citar
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Administración | Tda. Genesis</title>
<link href="estilo/estilo.css" rel="stylesheet" type="text/css" />
<link href="estilo/jquery-ui-1.8.4.custom.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.4.custom.min.js"></script>
<script type="text/javascript">
            $(function(){
                $('#buscar_usuario').autocomplete({
                   source : 'ajax.php',
                   select : function(event, ui){
                       $('#resultados').slideUp('fast', function(){
                            $('#resultados').html(
                                ''   ui.item.descripcion   '<br/>' 
                                '$ '   ui.item.precio
                            );
                       });
                       $('#resultados').slideDown('fast');
                   }
                });
            });
</script>
</head>
<?php

date_default_timezone_set('America/El_Salvador');
include("conectar.php");
session_start();
if($_SESSION["usuario"]) //ANTES DE PHP 5.4 -- @session_is_registered('usuario')
{
   //include("conectar.php");
   $user = $_SESSION["usuario"];
   $suc = "";
   $editor_user = mysql_query("SELECT * FROM usuario WHERE cod_per='$user'", $conexion);
   while($extraer = mysql_fetch_array($editor_user))
   {
      echo "
      <body class='body_ad' onload='document.form5.cod.focus()'>
      <a href='cerrar_sesion.php'><img src='img/gral/cs.png' align='right'></a>
      <center>";
      echo "<div class='div_ad'>FACTURACION</div>
      <div class='div_panel_facturacion'>
         <div class='div_panel_fac_total'>
         TOTALES
         <div class='label_panel_fac_sub'>SUB
         </div>
         <div class='label_panel_fac_iva'>IVA
         </div>
         <div class='label_panel_fac_total'>TOTAL
         </div>
         </div>
         <form id='form5' name='form5' method='post' action=''>
            <div class='div_panel_fac_cli'>
            <table border='0'>
            <tr>
              <td class='td_ad'>Cliente</td>
              <td><label>
              <input type='text' name='cod' id='cod' size='50' />
              </label></td>
              <td class='td_ad'>DUI</td>
              <td><label>
              <input type='text' name='dui' id='dui' size='10' />
              </label></td>         
            </tr>
            <tr>
              <td class='td_ad'>Direcci&oacute;n</td>
              <td colspan='4'><label>
              <input type='text' name='direccion' id='direccion' size='50' />
              </label></td>
            </tr>                  
            </table>
         </form>
         </div>
         <div class='div_panel_fac_producto'>
          <form id='form5' name='form5' method='post' action=''>
            <table border='0'>
            <tr>
              <td class='td_ad'>Cod.</td>
              <td class='td_ad'>Cant.</td>
              <td class='td_ad'>Desc.</td>
              <td class='td_ad'>Total</td>
              <td class='td_ad'></td>      
            </tr>
            <tr>
              <td><input type='text' name='buscar_usuario' id='buscar_usuario' size='40' /></td>
              <td><input type='text' name='cantpro' id='cantpro' size='10' /></td>
              <td><input type='text' name='despro' id='despro' size='10' /></td>
              <td><input type='text' name='totalpro' id='totalpro' size='10' /></td>
              <td><input type='submit' name='aceptarca' id='aceptarca' value='   ' /></td>
            </tr>
            <tr>
              <td><label id='resultados'>
              </label></td>
            </tr>                  
            </table>
         </form>
         </div>
         <div class='div_panel_fac_producto'>
         </div>";
            if(isset($_POST["aceptarca"]))
            {
               $suc = "$_GET[f]";
               $cod = "$_POST[cod]";
               $cantidad = "$_POST[cantidad]";
            }
         echo "</div>";   
   }
}
else
{   
   echo "
   <html>
   <body>
   <script>alert('Por favor inicie sesión... Esta es una página restringida');
   location.replace('admin.php')</script>";
}
?>
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: g00mba en agosto 15, 2014, 06:32:39 pm
Código: [Seleccionar]
$suc = "$_GET[f]";
...
WHERE (id_suc='$suc') AND (cod_prod LIKE '%$nombreUsuario%')
ESTO ES MALA PRACTICA
para empezar, en el controlador dale tratamiento a la variable, va contra toda buena practica el hecho que estes buscando cosas en una base de datos con una variable que es entrada desde la interfaz. tendrias que tener una funcion que te limpie de todo caracter de escape de query como minimo.

segundo, quema la variable a ver si con la variable quemada te da resultado.

tercero, si con la variable quemada te da resultado, entonces si tenes razon y tenes que revisar donde es que la capturas.

pro tip: para obtener la variable asi como la has declarado la tenes que llamar dentro de una funcion como $this->suc
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: Jaru en agosto 15, 2014, 06:38:34 pm
En la funcion "buscarUsuario" ya le estas pasando el $_GET, yo digo que no se lo pases con argumento, pasaselo asi:

Código: [Seleccionar]
include_once 'usuarios.class.php';

$usuario = new Usuarios();

echo json_encode($usuario->buscarUsuario($_GET));

-- ahora ya dentro de la funcion jalas el elemento que queras

Código: [Seleccionar]
public function buscarUsuario($nombreUsuario){
        $datos = array();
     
        $sql = "SELECT * FROM existencia
                WHERE (id_suc='".$_GET["f"]."') AND (cod_prod LIKE '%".$_GET["term"]."%')
                "; //ESTA ES MI CONSULTA A LA BD, CUANDO UTILIZO $suc NO ME HACE LA CONSULTA.

...
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: g00mba en agosto 15, 2014, 06:49:20 pm
Código: [Seleccionar]
WHERE (id_suc='".$_GET["f"]."') AND (cod_prod LIKE '%".$_GET["term"]."%') yo no recomiendo que haga eso, peor todavia meter una superscope variable dentro de un query es peligroso tambien. mejor que agarre la variable con super scope, la limpie, la haga local y DESPUES que la pase al query. es lo mas sano.
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: Jaru en agosto 15, 2014, 06:55:29 pm
Código: [Seleccionar]
WHERE (id_suc='".$_GET["f"]."') AND (cod_prod LIKE '%".$_GET["term"]."%') yo no recomiendo que haga eso, peor todavia meter una superscope variable dentro de un query es peligroso tambien. mejor que agarre la variable con super scope, la limpie, la haga local y DESPUES que la pase al query. es lo mas sano.
osea aja, la seguridad y todo eso,  solo le apuntaba el error que tenia extrayendo la variable.

Lo de la inyección de sql es algo que debería preocuparse desde un principio.
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: g00mba en agosto 15, 2014, 06:57:27 pm
osea aja, la seguridad y todo eso,  solo le apuntaba el error que tenia extrayendo la variable.

Lo de la inyección de sql es algo que debería preocuparse desde un principio.
lo de la seguridad y todo eso se llaman buenas practicas  :thumbsup:

si puesi tambien podes hacerlo asi como decis vos... pero con solo ponerle $this-> antes del nombre de la variable cuando la esta invocando tiene el mismo efecto, el scope de la variable es la q el no habia dominado bien.
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: vamaya en agosto 15, 2014, 07:13:26 pm
Código: [Seleccionar]
$suc = "$_GET[f]";
...
WHERE (id_suc='$suc') AND (cod_prod LIKE '%$nombreUsuario%')
ESTO ES MALA PRACTICA
para empezar, en el controlador dale tratamiento a la variable, va contra toda buena practica el hecho que estes buscando cosas en una base de datos con una variable que es entrada desde la interfaz. tendrias que tener una funcion que te limpie de todo caracter de escape de query como minimo.

segundo, quema la variable a ver si con la variable quemada te da resultado.

tercero, si con la variable quemada te da resultado, entonces si tenes razon y tenes que revisar donde es que la capturas.

pro tip: para obtener la variable asi como la has declarado la tenes que llamar dentro de una funcion como $this->suc

¿Me explicas cómo por favor? te lo agradecería mucho.
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: g00mba en agosto 15, 2014, 07:15:02 pm
pero que parte necesitas que te explique? como limpiar los datos o sobre el scope de las variables?
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: Jaru en agosto 15, 2014, 07:18:40 pm
pero que parte necesitas que te explique? como limpiar los datos o sobre el scope de las variables?
la parte de como terminarle la tarea
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: vamaya en agosto 15, 2014, 07:20:53 pm
pero que parte necesitas que te explique? como limpiar los datos o sobre el scope de las variables?

Sobre las dos cosas, realmente esto es algo nuevo para mi, y me gustaría saber como se puede resolver este problema, desde ayer estoy intentando pero no me da resultado.
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: vamaya en agosto 15, 2014, 07:22:49 pm
la parte de como terminarle la tarea
Si eso solo es un 10% de la tarea  :drinks:
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: g00mba en agosto 15, 2014, 07:35:27 pm
lee aqui

http://stackoverflow.com/questions/110575/do-htmlspecialchars-and-mysql-real-escape-string-keep-my-php-code-safe-from-inje/110576#110576 (http://stackoverflow.com/questions/110575/do-htmlspecialchars-and-mysql-real-escape-string-keep-my-php-code-safe-from-inje/110576#110576)

y aqui
http://php.net/manual/en/language.variables.scope.php (http://php.net/manual/en/language.variables.scope.php)
Título: Re:¿Cómo recuperar variable $_GET en una clase php?
Publicado por: vamaya en agosto 15, 2014, 09:14:10 pm
lee aqui

http://stackoverflow.com/questions/110575/do-htmlspecialchars-and-mysql-real-escape-string-keep-my-php-code-safe-from-inje/110576#110576 (http://stackoverflow.com/questions/110575/do-htmlspecialchars-and-mysql-real-escape-string-keep-my-php-code-safe-from-inje/110576#110576)

y aqui
http://php.net/manual/en/language.variables.scope.php (http://php.net/manual/en/language.variables.scope.php)
Gracias.