elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 75
111  Programación / Desarrollo Web / Re: ¿Cómo configuro correo en VPS Arsys (CentOS7+Plesk)? en: 10 Junio 2016, 01:07 am
Recientemente he añadido una página que ofrece dedicados a un precio imposible  ;D (en serio, quien no pueda permitirse eso ya tiene que tener unicamente lo justo para vivir).

Si todavia te interesa (o estás a tiempo  :P) echale un vistazo a Scaleway y dime que te parece  ::) En cuanto empiezas a leer un poco lás características y el hardware que tiene te quedas loco  :laugh: (no sabia como se fabricaba una placa de circuito impreso ni como se montaba un rack en un server hasta que ví ese video  ;D).

Yo estoy deseando que termine mi actual contrato con un VPS (¡menos de 1 mes!) para lanzarme a por el C1 y el C2.

Si no te aclaras con el software que tienes, echale un vistazo a Kloxo-MR, es estable y está en constante desarrollo por su creador (mustafa). Cualquier duda tienes el foro (ingles o hindú), es muy activo.

Yo lo estoy usando actualmente en la web de un amigo y va perfecto, es muy completo. La única pega sería que todavia no soporta la ultima versión de CentOS, solo la 6.x y 5.x. La ultima soportada sería la nueva 6.8.

Sobre el problema de correo, no soy un experto en configuración dns, pero en kloxo-mr simplemente configuras el template y todo lo demás (dominios, subdominios, correo, etc) funciona perfectamente y sin hacer nada más.
112  Programación / Desarrollo Web / Re: Problema no-object. en: 9 Junio 2016, 23:10 pm
Si mejoraras la estructura de tu aplicación, te resultaria más facil encontrar fallos, modificar cosas, agregar nuevas...

Lo ideal seria que crearas clases, pero si no sabes entonces puedes crear simples funciones en un archivo funciones.php (todas juntas).

Primero comprueba que no haya ningún problem con el user input:

- Comprobar si hay campos vacios (comprobado).
- Comprobar que no haya input malicioso (no comprobado).
- Comprobar que las contraseñas coincidan (comprobado).
- Etc...

Y una vez todas las comprobaciones "pre-insert" se hayan validado, se llama a la función, y esta devuelve el resultado (mensaje para el usuario informandole de que se registró correctamente o false indicando que algo salió mal)
.
Otra cosa muy importante, es usar sentencias preparadas para añadir una importante capa de seguridad.

Te dejo un ejemplo de como usarlas con varias funciónes creadas a partir de tú código y otra función que vas a necesitar en tus formularios:

funciones.php
Código
  1. require('conexion_bd.php');
  2.  
  3. function isNotEmpty($array, $whiteList) {
  4.    foreach ($whiteList as $val) {
  5.        if (empty($array[$val])) {
  6.            return false;
  7.        }
  8.    }
  9.  
  10.    return true;
  11. }
  12.  
  13. function verificar_user($nombre) {
  14.    if ($stmt = $conexion->prepare('SELECT usuario FROM usuarios WHERE usuario = ? LIMIT 1')) {
  15.        $stmt->bind_param('s', $nombre);
  16.        $stmt->store_result();
  17.  
  18.        if ($stmt->num_rows === 1) {
  19.            // 'Este usuario ya ha sido registrado anteriormente.'
  20.            $exit = 'Nombre de usuario ya en uso. Por favor, introduzca otro nombre válido.';
  21.        } else $exit = FALSE;
  22.    }
  23.  
  24.    return $exit;
  25. }
  26.  
  27. function registrar_usuario($user_info) {
  28.    if ($stmt = $conexion->prepare('INSERT INTO usuario (nombre, apellido, email, usuario, password)
  29.                                    VALUES (?, ?, ?, ?, ?)')) {
  30.        $stmt->bind_param('sssss', $user_info['nombre'], $user_info['apellido'], $user_info['email'], $user_info['usuario'], $user_info['password']);
  31.  
  32.        if ($stmt->execute()) {
  33.            $exit = 'Usted se ha registrado correctamente.'
  34.        } else $exit = FALSE;
  35.    }
  36.  
  37.    return $exit;
  38. }
  39.  
  40. function otra_funcion() {
  41.    // code
  42. }

La función isNotEmpty() devolverá false cuando encuentre una variable vacia y se mostrará el error en el formulario.

Por preferencia, primero deberías poner el php y luego el html:

Código
  1. <?php
  2.  
  3.  
  4. if (isset($_POST['enviar'])) {
  5.  
  6.    require('funciones.php');
  7.  
  8.    $mensaje   = NULL;
  9.    $whiteList = ['nombre', 'apellido', 'email', 'reemail', 'usuario', 'password', 'repassword'];
  10.  
  11.    if (isNotEmpty($_POST, $whiteList) === FALSE) {
  12.  
  13.        $mensaje = 'Error. Asegúrese de haber cubierto todos los campos.';
  14.  
  15.    } else {
  16.  
  17.        $user_info = [];
  18.  
  19.        foreach ($whiteList as $val) {
  20.            $user_info[$val] = $_POST[$val]; // aquí puedes hacer lo que prefieras (filter_input, preg_match, preg_replace, etc...)
  21.        }
  22.  
  23.        $mensaje = verificar_user($user_info['nombre']);
  24.  
  25.        if ($mensaje === FALSE) {
  26.  
  27.            if ($user_info['password'] == $user_info['repassword']) {
  28.  
  29.                $mensaje = registrar_usuario($user_info);
  30.                $mensaje = $mensaje ? header('Location: /index.html?mensaje=' . $mensaje) : 'Ha habido un problema al registrar el usuario, intentelo más tarde.';
  31.  
  32.            } else $mensaje = 'Las claves no son iguales, intente nuevamente.';
  33.        }
  34.    }
  35. }
  36.  
  37. if ($mensaje) {
  38.    echo $mensaje;
  39. }
  40. ?>
  41. <!DOCTYPE html>
  42. <html>
  43.  
  44.    <head>
  45.  
  46.        <meta http-equiv="Content-Type" content="Text/HTML" charset="UTF-8" />
  47.        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  48.  
  49.        <title>Nombre página</title>
  50.  
  51.        <link type="text/css" rel="stylesheet" media="all" href="css/style.css" />
  52.  
  53.        <script type="text/javascript" src="js/scripts.js"></script>
  54.  
  55.    </head>
  56.  
  57.    <body>
  58.  
  59.        <header>
  60.  
  61.        </header>
  62.  
  63.        <main>
  64.            <form action="" method="POST" class="registro" action="">
  65.                <div>
  66.                    <label>Nombre:</label>
  67.                    <input type="text" name="nombre"></div><br />
  68.                    <label>Apellido:</label>
  69.                    <input type="text" name="apellido"></div><br /><br />
  70.                    <label>Correo-e:</label>
  71.                    <input type="email" name="email"></div><br /><br />
  72.                    <label>Repetir Correo-e:</label>
  73.                    <input type="email" name="reemail"></div><br /><br />
  74.                    <label>Usuario:</label>
  75.                    <input type="text" name="usuario"></div><br /><br />
  76.                    <div><label>Contraseña:</label>
  77.                    <input type="password" name="password"></div> <br /><br />
  78.                    <div><label>Repetir Contraseña:</label>
  79.                    <input type="password" name="repassword"></div> <br /><br />
  80.                <div>
  81.                <input type="submit" name="enviar" value="Registrar"></div>
  82.            </form>
  83.        </main>
  84.  
  85.        <footer>
  86.  
  87.        </footer>
  88.  
  89.    </body>
  90.  
  91. </html>
113  Programación / Desarrollo Web / Re: [Recomendando] Hosting 2016 en: 9 Junio 2016, 17:59 pm
Empresa: Scaleway (Online Labs)
País: Francia.
Servicios: BareMetal SSD (ARM y x86-64 y 3D V-NAND de Samsung) y VPS.
Precios: Surrealistas (los más bajos del mercado).
Ventajas: A parte de los precios y los equipos, ofrecen tráfico ilimitado a velocidades más que aceptables (200 - 800 Mb/s).
Desventajas: Como no sea el límite de velocidad, no hay ninguna.
Otros datos relevantes: Volumenes flexibles (puedes moverlos entre tus vps e incluso a dedícados). 50GB extra de SSD por solo 1€ más al mes (hasta un máximo de 150GB/volumen - 250GB para C2 - y 1TB/servidor).

URL Oficial: https://www.scaleway.com/

Son los primeros en ofrecer (Iaas) servidores ARM (de 4 núcleos), creados por Online Labs.

¡Son del tamaño de una tarjeta de crédito!  ;D
114  Programación / Desarrollo Web / Re: Como crear Slideshow con thumbnails en: 9 Junio 2016, 17:16 pm
También tienes FlexSlider que es otro plugin jQuery. Yo lo uso y es muy sencillo de usar y hace un buen trabajo. En la página tienes distintos modos para probar.
115  Programación / PHP / Re: mysqli rollback deja de funcionar en: 8 Junio 2016, 18:22 pm
Dejo la solución por si a alguien le ocurre:

Mi problema fue que uso kloxomr7 y este por defecto (por motivos de rendimiento) cambia el engine de la base de datos a MyISAM y las transacciones solo son compatibles con InnoDB.

Una rápida y facil solución sería ejecutando la siguiente query para la base de datos a cambiar:

Código
  1. SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;') FROM TABLES
  2. WHERE ENGINE='MyISAM'
  3. AND table_schema = 'mydatabase'

Solo cambiar donde dice 'mydatabase' por el nombre de la vuestra.
116  Programación / PHP / Re: Formulario subtotales en: 7 Junio 2016, 21:44 pm
Si no te funciona es porque no estás usando la libreria jQuery, la incluyo en el ejemplo de abajo. Y seguiria sin funcionar por que se te olvidó poner el script dentro de un document ready. Abajo dejo el código completo y listo para funcionar.

Estamos en 2016! Usa HTML 5!  ;D

Para declarar el tipo de lenguaje es con el atributo type="text/javascript".

Incluyo las nuevas etiquetas HTML 5 para que sea más facil estructurar y organizar mejor el código html:

Código
  1. <!DOCTYPE html>
  2.  
  3.    <head>
  4.  
  5.        <meta http-equiv="Content-Type" content="Text/HTML" charset="UTF-8" />
  6.        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7.  
  8.        <title>Nombre Web</title>
  9.  
  10.        <link type="text/css" rel="stylesheet" media="all" href="css/styles.css" />
  11.  
  12.        <script type="text/javascript" src="//code.jquery.com/jquery-2.2.4.min.js"></script>
  13.        <script type="text/javascript" src="js/scripts.js"></script>
  14.  
  15.        <script type="text/javascript">
  16.            $(function () {
  17.  
  18.                function fnAlltotal() {
  19.                        var alojamiento_total    = 0,
  20.                            desplazamiento_total = 0;
  21.  
  22.                    $('.amount-aloj').each(function () {
  23.                        alojamiento_total += parseFloat($(this).val() || 0);
  24.                    });
  25.                    $('.amount-desp').each(function () {
  26.                        desplazamiento_total += parseFloat($(this).val() || 0);
  27.                    });
  28.                    $('.alojamiento').val(alojamiento_total);
  29.                    $('.desplazamiento').val(desplazamiento_total);
  30.                    $('.total').val((alojamiento_total + desplazamiento_total).toFixed(2));
  31.  
  32.                }
  33.  
  34.                $('.unit').on('keyup', function () {
  35.                    var self = $(this),
  36.                        qtyVal = self.prev().val();
  37.  
  38.                    self.next().val(qtyVal * self.val());
  39.                    fnAlltotal();
  40.                });
  41.  
  42.                $('.qty').on('keyup', function () {
  43.                    var self = $(this),
  44.                        unitVal = self.next().val();
  45.  
  46.                    self.next().next().val(unitVal * self.val());
  47.                    fnAlltotal();
  48.                });
  49.  
  50.            });
  51.        </script>
  52.  
  53.    </head>
  54.  
  55.    <body>
  56.  
  57.        <header>
  58.  
  59.        </header>
  60.  
  61.        <main>
  62.  
  63.            <div id="invoice">
  64.  
  65.                <h3>PAGOS</h3>
  66.  
  67.                <div class="alojamiento-box">
  68.                    <div>Quantity:
  69.                        <input type="text" class="qty" />Unit price:
  70.                        <input type="text" class="unit" />Amount:
  71.                        <input type="text" class="amount-aloj" readonly />
  72.                    </div>
  73.                    <div>Quantity:
  74.                        <input type="text" class="qty" />Unit price:
  75.                        <input type="text" class="unit" />Amount:
  76.                        <input type="text" class="amount-aloj" readonly />
  77.                    </div>
  78.                    <div>Quantity:
  79.                        <input type="text" class="qty" />Unit price:
  80.                        <input type="text" class="unit" />Amount:
  81.                        <input type="text" class="amount-aloj" readonly />
  82.                    </div>Sub Total:
  83.                    <input type="text" class="alojamiento" readonly />
  84.                </div>
  85.  
  86.                <div class="desplazamiento-box">
  87.                    <div>Quantity:
  88.                        <input type="text" class="qty" />Unit price:
  89.                        <input type="text" class="unit /">Amount:
  90.                        <input type="text" class="amount-desp" readonly />
  91.                    </div>
  92.                    <div>Quantity:
  93.                        <input type="text" class="qty" />Unit price:
  94.                        <input type="text" class="unit" />Amount:
  95.                        <input type="text" class="amount-desp" readonly />
  96.                    </div>
  97.                    <div>Quantity:
  98.                        <input type="text" class="qty" />Unit price:
  99.                        <input type="text" class="unit" />Amount:
  100.                        <input type="text" class="amount-desp" readonly />
  101.                    </div>Sub Total:
  102.                    <input type="text" class="desplazamiento" readonly />
  103.                </div><br />
  104.                Total All: <input type="text" class="total" readonly />
  105.  
  106.            </div>
  107.  
  108.        </main>
  109.  
  110.        <footer>
  111.  
  112.        </footer>
  113.  
  114.    </body>
  115.  
  116. </html>

El header es donde pondrías el menu, el banner... main como indica: el contenido principal, y footer lo mismo: el copyright, etc.

También puedes quitar el script del html y ponerlo en un archivo scripts.js y ahí los pones todos juntos. A menos que necesites imprimir algo de php en el script.
117  Programación / PHP / Re: Formulario subtotales en: 6 Junio 2016, 23:15 pm
Si claro, para eso estamos  ::)

Le he hecho unos arreglos a ese script para que haga lo que quieras o lo que he entendido que querias: http://jsfiddle.net/ch510dk3/17/

Código
  1. function fnAlltotal() {
  2.    var alojamiento_total    = 0,
  3.        desplazamiento_total = 0;
  4.  
  5.    $(".amount-aloj").each(function() {
  6.         alojamiento_total += parseFloat($(this).val()||0);
  7.    });
  8.    $(".amount-desp").each(function() {
  9.         desplazamiento_total += parseFloat($(this).val()||0);
  10.    });
  11.    $(".alojamiento").val(alojamiento_total);
  12.    $(".desplazamiento").val(desplazamiento_total);
  13.    $('.total').val((alojamiento_total + desplazamiento_total).toFixed(2));
  14.  
  15. }

Para mostrar dos deciamales puedes usar .toFixed(2). Y los inputs que quieras que no se pueda escribir (solo leer) puedes ponerle readonly (mejor que disabled).

Para lo de php ya te dije como hacerlo, ademas tienes mil ejemplos en otras preguntas como la tuya. El otro dia puse un ejemplo en el foro de programación web. Mira bien que este tema esta muy visto en el foro (y en todas partes) y para eso está, para buscar lo que necesites y si no lo encuentras entonces se pregunta (no podemos estar repitiendo una y otra vez lo mismo  :-\).
118  Programación / PHP / Re: Formulario subtotales en: 6 Junio 2016, 10:57 am
Esta pregunta no debería ir en el subforo PHP  (menos la ultima  :-\)

1. Siempre en el apartado <head> de tu web, ya sea en un archivo .js incluido en <script src="/path/to/scripts.js"></script> o entre las mismas etiquetas <script>código js</script>.

2. ¿Te estás respondiendo tu mismo o es que quieres un ejemplo?  ;D Como dices, hay que sumar los dos valores. Si los valores están en el campo .result, dales otro nombre a cada uno: .alojamiento y .desplazamiento y simplemente los sumas una vez ambos estén calculados:

Código
  1. var alojamiento    = $(".alojamiento").val(),
  2.    desplazamiento = $(".desplazamiento").val();
  3.  
  4. $('.total').val(alojamiento + desplazamiento);

Siendo total el campo donde muestras la suma de ambos.

3. Para guardar en la db solo tienes que coger los datos (igual que hago arriba) y enviarlos por ajax (preferiblemente usando post) a un script php que haga la petición a mysql. Hay mil ejemplos de ajax en el apartado programación web o directamente ver la función de jQuery .post() que hace lo que necesitas. Y la parte de PHP es simplemente eso, una query a mysql introduciendo lo que quieres (post) en la tabla que quieras: Coger lo que viene por post y usarlo en la query.
119  Programación / Desarrollo Web / Re: Ejecutar funcion php desde botón "onclick" en: 6 Junio 2016, 10:35 am
Sorry fallo mio. Id solo se debe usar una vez, en lugar usa class="Borrar" y $('.Borrar') en el script: https://jsfiddle.net/90vr9zma/1/
120  Programación / PHP / [Resuelto] mysqli rollback deja de funcionar en php 7 en: 6 Junio 2016, 03:01 am
Hace poco me cambie de hosting y le instale la ultima versión de php. Ahora el rollback no hace nada: no da error, el if en el que lo puse da true siempre y los datos se siguen insertando.

Antes usaba php 5.4 y así es como tenia mi script:

Código
  1. public function Upload() {
  2.  
  3.    try {
  4.  
  5.        // rollback should revert here
  6.        // el único cambio es el siguiente
  7.        // $mysqli->query('START TRANSACTION;');
  8.         $mysqli->begin_transaction();
  9.  
  10.        // multiple prepared statements
  11.  
  12.        if ($mysqli->commit()) {
  13.            $exit = $log;
  14.        } else {
  15.            throw new Exception('Transaction commit failed. Property ID: ' . $id);
  16.        }
  17.  
  18.    } catch (Exception $e) {
  19.  
  20.        try {
  21.  
  22.            $test = $this->owner['id'] ? 'property' : ($this->applicant ? 'demand' : 'Fatal Error: PropertyFromInput() contact error (no owner, no applicant)');
  23.  
  24.            $log = 'Rolling back new ' . $test . ' upload' . "\n";
  25.  
  26.            if (!$mysqli->rollback()) $log .= 'no rollback...' . "\n";
  27.  
  28.            if ($test == 'property') $log .= $this->cleanup_prop() ? 'property successfully cleaned up' . "\n" : 'error while cleaning up property' . "\n";
  29.  
  30.            $err_msg = $e->getMessage();
  31.  
  32.        } catch (Exception $f) {
  33.  
  34.            $err_msg .= $f->getMessage();
  35.  
  36.        }
  37.  
  38.        $usr_msg = $upload_err ? $err_msg : 'Se ha producido un error. Por favor contacte con un administrador.';
  39.  
  40.        $log .= 'User triggered an error while uploading a new ' . $test . ".\n" . 'Error message: ' . $err_msg;
  41.  
  42.        $exit = array($log, $usr_msg);
  43.  
  44.    }
  45.  
  46.    $mysqli->autocommit(TRUE);
  47.  
  48.    return $exit;
  49. }

Antes funcionaba y ahora ya no. Supongo que se debe a los cambios que ha sufrido php desde entonces.

Estuve leyendo un poco y al parecer decidieron (al fin) implementar el bloque finally, en php 5.5. El otro cambio relevante a esto fue en php 7 donde se mejora el manejo de errores.

Pero sigo sin estar seguro de donde puede estar el fallo. La única utilidad que le veo a finally en mi caso sería poner el autocommit, por que el return deberia ir fuera. Y no sé que más puede estar fallando.

¿Alguna idea? Gracias!
Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 75
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines