Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - gAb1

#471
PHP / Re: paginas incluidas no funcionan correctamente
30 Septiembre 2014, 05:29 AM
Gracias por responder, era el típico fallo, como casi siempre pasa... un molesto fallo que es imposible de ver :)

El problema estaba en la manera de incluir los archivos, depues de googlear pude ver las 4 distintas maneras de incluir archivos archivos en php:

Citar
  • require
    when the file is required by your application, e.g. an important message template or a file containing configuration variables which with without the app would break.

   
  • require_once
    when the file contains content that would produce an error on subsequent inclusion, e.g. function important() { /* important code */} is definitely needed in your application but since functions cannot be redeclared should not be included again.

   
  • include
    when the file is not required and application flow should continue when not found, e.g.
    great for templates referencing variables from the current scope or something

   
  • include_once
    optional dependencies that would produce errors on subsequent loading or maybe remote file inclusion that you do not want to happen twice due to the HTTP overhead

Según tengo entendido require_once es la manera "por defecto" y así he hecho. Pero claro no es tan facil:

Para incluir un archivo de contenido html/php uso include normal.

index.php
Código (php) [Seleccionar]
    include('themes/sportislife/views/layouts/main.php');
     
    function showContent() {
    [...]
    }


Para las funciones uso el require_once

main.php
Código (php) [Seleccionar]
    require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
    include($_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');  // ya esta incluido en functions.php
                                                                      // pero si no lo incluyo de esta manera me da error... y asi no da error
     
    // html and php code
     
    showContent(); //will include login.php


Lo mismo para los archivos de contenido html/php "views":

login.php
Código (php) [Seleccionar]
    <?php
    
require_once($_SERVER['DOCUMENT_ROOT'] . '/includes/functions.php');
    include(
$_SERVER['DOCUMENT_ROOT'] . '/includes/db_connect.php');
     
    
sec_session_start();
     
    if (
login_check($mysqli) == true) {
       
$logged 'in';
    } else {
       
$logged 'out';
    }
    
?>


No hay ningún problema por usar $_SERVER['DOCUMENT_ROOT'], verdad? Es que ya he tenido bastantes problemas con las rutas al ser archivos incluidos...

Sobre el problema del principio, me sigue pareciendo extraño que el include de functions.php a db_connect no funcione para los archivos que incluyan functions.php

Una pregunta a parte, sabes que es mejor, si usar mysqli tal y como hago ahora? o usar mysql pdo??

Gracias!
#472
PHP / Re: query-update
28 Septiembre 2014, 05:44 AM
Hola, tal vez este sea el problema:

Código (php) [Seleccionar]
$sql = "UPDATE TB_CLIENTE SET NOMBRE_CLIENTE='".$name."', APELLIDO_CLIENTE='".$apellido."', DIRECCION_CLIENTE='".$direccion."' WHERE ID_CLIENTE='"$ident"'";
                                                                                                                                                 ^ Aqui


Olvidaste poner las dobles comillas dentro de las comillas normales.

Aunque si $ident es integer no uses comillas (debería serlo ya que seguramente sea auto increment):

Código (php) [Seleccionar]
WHERE ID_CLIENTE=$ident";

Si no funciona, quita las comillas dobles.

Suerte!
#473
PHP / paginas incluidas no funcionan correctamente
28 Septiembre 2014, 05:20 AM
Hola, estoy teniendo un molesto problema a la hora de incluir paginas en php. El problema que tengo es causado al poner el mismo include en dos paginas y una de las paginas es incluida en la otra.

Paso a explicarlo mejor:

Tengo un index.php (.htaccess redirecciona todo aqui)
Código (php) [Seleccionar]
include_once '/themes/default/views/layouts/main.php';

function showContent() {
[...]
}


/themes/default/views/layouts/main.php
Código (php) [Seleccionar]
include_once('/includes/functions.php'); //why this include doesn't work for login.php

// html and php code

showContent(); //will include login.php


y una de las paginas a incluir, pero ocurre con otras paginas con el mismo include y la misma funcion.
/views/site/login.php
Código (php) [Seleccionar]
<?php
include_once('/includes/functions.php');

sec_session_start();

if (
login_check($mysqli) == true) {
    
$logged 'in';
} else {
    
$logged 'out';
}
?>


Este es el error que da:
CitarNotice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 7

Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\includes\functions.php on line 151

La variable $mysqli esta creada en db_connect.php que esta incluido en functions.php y en un principio funciona perfectamente....

db_connect.php
Código (php) [Seleccionar]
include_once 'config.php';
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);


Y el otro error tambien me lo ha dado muchas otras veces con varias funciones mysqli (como execute() o get_result()) y aun no lo he arreglado, simplemente han desaparecido y aparecido en disitintas paginas, al crear un prepared statement. Esto es lo que me ha podido decir un amigo respecto a este error:

CitarYou get the call to member function on non-object error, when you try to call a function in $this-> scope when the object hasn't been instantiated.

Entonces, ¿como hago eso de estanciar el objeto? if ($stmt = $mysqli->prepare("SQL"))

Lo curioso es que no da ningún error si quito el include de main.php, pero entonces tengo que comentar las funciones que llamo...

Si en lugar de include_once utilizo include en login.php me da el siguiente error:
CitarFatal error: Cannot redeclare sec_session_start() (previously declared in C:\xampp\htdocs\includes\functions.php:6) in C:\xampp\htdocs\includes\functions.php on line 26

Este es el codigo del error:
Código (php) [Seleccionar]
function sec_session_start() {   // Esta es la linea 6 de functions.php
   $session_name = 'sec_session_id';   // Set a custom session name
   $secure = SECURE;
   // This stops javascript being able to access the session id.
   $httponly = true;
   // Forces sessions to only use cookies.
   if (ini_set('session.use_only_cookies', 1) === FALSE) {
       header("Location: /error?err=Could not initiate a safe session (ini_set)");
       exit();
   }
   // Gets current cookies params.
   $cookieParams = session_get_cookie_params();
   session_set_cookie_params($cookieParams["lifetime"],
       $cookieParams["path"],
       $cookieParams["domain"],
       $secure,
       $httponly);
   // Sets the session name to the one set above.
   session_name($session_name);
   session_start();            // Start the PHP session
   session_regenerate_id();    // regenerated the session, delete the old one.
}    // Esta es la linea 26 de functions.php


¿Alguna idea de como arreglar esto? ¡Llevo horas intentando arreglarlo pero no consigo nada!

Gracias!
#474
Hola, estoy teniendo problemas con unos botones javascript y al parecer se debe a las rutas y que los archivos no se ejecutan desde donde estan, si no desde otras paginas (son incluidas) y al parecer me esta dando problemas.

Citarindex.php <- main.php <- +showContent()+ %view%.php

Bien, es algo simple, tengo un index.php que incluye una pagina (main.php) que es la estructura de la web y esta a su vez incluye paginas "views" mediante una funcion (showContent()) creada en index.php y llamada en main.php, una de estas paginas "views" es login.php y es donde esta el form con el input.

Pero el problema es este, cuando le doy al boton login (o register que tampoco funciona) no pasa nada y en la consola del navegador me aparecen los siguientes errores:

CitarReferenceError: regformhash is not defined register:1
ReferenceError: formhash is not defined login:1

Esto quiere decir que los archivos .jscript no estan siendo incluidos... Y es extraño porque los css y php script si que funcionan, esos archivos si que son incluidos.

Las ruta estan todas bien, se incluyen desde la raiz (desde htdocs).

Pero lo más extraño de todo, es que cada link de navegacion que le doy, me sale otro error en la consola:

CitarSyntaxError: invalid regular expression flag b forms.js:31

y esto es lo que hay en la linea 31:

Código (javascript) [Seleccionar]
// Check the username - regformhash()

   re = /^\w+$+/b; // esta es la linea 31


Ahora, ese error indica que si esta incluyendo los jscripts, pero que por alguna razón la funcion no se esta leyendo:

login.php
Código (html5) [Seleccionar]
<form action="includes/process_login.php" method="post" name="login_form">
Email: <input type="text" name="email" />
Password: <input type="password"
name="password"
id="password"/>
<input type="button"
  value="Login"
  onclick="formhash(this.form, this.form.password);" />
</form>


Los scripts estan bien y no han sido modificados, porque antes de crear el sistema de includes dinamicos todo funcionaba perfectamente, se podian crear usuarios y loguearse.

Para que lo veais:

La primera función de forms.js (la otra es regfromhash)
Código (javascript) [Seleccionar]
function formhash(form, password) {
   // Create a new element input, this will be our hashed password field.
   var p = document.createElement("input");

   // Add the new element to our form.
   form.appendChild(p);
   p.name = "p";
   p.type = "hidden";
   p.value = hex_sha512(password.value);

   // Make sure the plaintext password doesn't get sent.
   password.value = "";

   // Finally submit the form.
   form.submit();
}


El otro jscript es sha512.js que esta en la misma carpeta y se incluye con la misma ruta que form.js

Estoy teniendo otros problemas similares y al parecer los includes no se incluyen en los includes.... o algo asi, por ejemplo, en una pagina cualquiera quiero hacer una consulta a la db y funciona bien durante un tiempo, hasta que un dia necesito agregar un include o cambiarlo, entonces ya da error porque la conexion a la db no existe (que se hace en otro archivo). Entonces db_connect.php se incluye en functions.php y este se incluye en los demas archivos y con 1 solo include se incluyen varios archivos. index.php incluye functions.php incluye db_connect.php pero index.php no es capaz de incluir db_connect.php.... o lo incluye cuando le da la gana, es un lio  :huh:

¿Hay alguna manera de arreglar esto?

Gracias!

Edito: Solucionado, habia que quitar el ultimo + y b del jscript
#475
PHP / Re: crear enlaces seguros para las paginas php
26 Septiembre 2014, 05:38 AM
¿Te refieres a que funcionen los links con el index.php? Si es eso, es justo lo que no queria, usar nombres completos, el objetivo era este, con un simple nombre sin extension llamar la pagina.

Asi tal cual lo tengo funciona perfectamente.
#476
PHP / Re: crear enlaces seguros para las paginas php
26 Septiembre 2014, 04:34 AM
Lo siento fallo mio, si que funcionaba, se me olvido el .htaccess

Lo unico es que en lugar de entry.php uso index.php.

Código (php) [Seleccionar]

function showContent() {
$views = 'views/';
$site = $views . 'site/';
$user = $views . 'user/';

if($_SERVER['REQUEST_URI'] == '/')
$_SERVER['REQUEST_URI'] = '/home';

$includes = array(
'/home' => $views . 'home.php',
'/login' => $site . 'login.php',
'/logout' => $site . 'logout.php',
'/contact' => $site . 'contact.php',
'/about' => $site . 'about.php',
'/register' => $user . 'register.php',
'/referral' => $user . 'referral.php',
'/friend' => $user . 'friend.php',
'/register_success' => $user . 'register_success.php'
);

preg_match('/^([\w\/]+)=?(\w+)?&?/', $_SERVER['REQUEST_URI'], $matches);
$matches[1] = isset($matches[1]) ? $matches[1] : null;

if(array_key_exists($matches[1], $includes)){
$content = include($includes[$matches[1]]);
} else $content = "Error 404";
return $content;
}


Y efectivamente los links son: site.com/login?error=1

Al final de la manera mas simple posible, directamente el nombre del archivo, sin carpeta.

¿Podrías decirme alguna manera de comprobar si es vulnerable? Como por ejemplo lo de poner una larga cadena de caracteres y crear agujeros de esos. ¿O no se puede si hay una whitelist?
#477
PHP / Re: crear enlaces seguros para las paginas php
26 Septiembre 2014, 02:29 AM
¿Por que no funciona esto?

Código (php) [Seleccionar]
preg_match('/^([\w\/]+)=?(\w+)?&?/', $_SERVER['REQUEST_URI'], $matches);
$matches[1] = isset($matches[1]) ? $matches[1] : null;


Es más complicado de lo que parece porque index.php es lo que llama la estructura y esta llama los views. Si se cambia de pagina ya no funcionaria...

Lo intento de ese modo porque me gustaría tener el tipo de links -> site.com/site/login&error=1 y que funcionara.
#478
PHP / Re: crear enlaces seguros para las paginas php
26 Septiembre 2014, 01:49 AM
Vaya, dos maneras diferentes... Me gustaría probar las dos para ver que tal, pero tengo algunas dudas:

1º ¿Donde tengo que poner este codigo? Perdonar mi ignorancia :P

Código (php) [Seleccionar]
    if(isset($_SERVER['PATH_INFO']))
    $rutaInfo = trim((string)$_SERVER['PATH_INFO'], '/');
     
    elseif(isset($_SERVER['ORIG_PATH_INFO']))
    $rutaInfo = trim((string)$_SERVER['ORIG_PATH_INFO'], '/');


2º El metodo redirigiendo a entry.php,  que pasa en el caso de usar un archivo.php que existe para usar un link? Por ejemplo, si test.php existe y escribo test.php/site/login: daria error, no?

Porque cualquier cosa que escribas se redirige a entry.php y se compara con la lista? O solo se compara lo que hay despues de ?, o de esta manera se compara todo lo que escribas despues de la url? awww.site.com/'---> a partir de aqui se compara todo?

Volvemos a lo de antes, que pasa con las variables como login.php?error=1?? se seguirian ejecutando? site.com/site/login&error=1?

Gracias!
#479
PHP / Re: crear enlaces seguros para las paginas php
25 Septiembre 2014, 23:30 PM
Y volviendo a lo de las rutas de enlace, ¿seria muy dificil con el codigo actual no necesitar "?" para llamar una pagina?
#480
PHP / Re: crear enlaces seguros para las paginas php
25 Septiembre 2014, 23:03 PM
@WHK Gracias, el proyecto actual tengo pensado hacer algo ligero, nada de frameworks o librerias. Ademas de que hacer la web de 0 me ayudara a ganar experiencia en este lenguaje. Pero si no te importa me guardo el codigo, seguramente vaya a necesitarlo para algo más grande :)

Siempre y cuando lo que vaya hacer en la web no requiera nada externo como librerias o plugins, y de momento no es necesario.

@MinusFour Gracias a ti tambien por las molestias! Por cierto, ¿para que es la variable $time que has puesto en el codigo? Se te habia olvidado poner la funcion include() al final, pero ya esta todo funcionando! :D

Código (php) [Seleccionar]
function showContent() {
$views = 'views/';
$site = $views . 'site/';
$user = $views . 'user/';

//$time = microtime(true);       // Para que sirve esto??

//$_SERVER['QUERY_STRING'] = 'home';   // Como hago para mostrar home aunque no se haga un input??

$includes = array(
'home' => $views . 'home.php',
'site/login' => $site . 'login.php',
'site/logout' => $site . 'logout.php',
'site/contact' => $site . 'contact.php',
'site/about' => $site . 'about.php',
'user/register' => $user . 'register.php',
'user/referral' => $user . 'referral.php',
'user/friend' => $user. 'friend.php',
'user/register_success' => $user . 'register_success.php'
);

preg_match('/^([\w\/]+)=?(\w+)?&?/', $_SERVER['QUERY_STRING'], $matches);
$matches[1] = isset($matches[1]) ? $matches[1] : null;

if(array_key_exists($matches[1], $includes)){
$content = include($includes[$matches[1]]);
return $content;
} else print_r(error_get_last());
}


Y dentro de main.php simplemento llamo a la función showContent() aunque he tenido que incluir index.php Y seguro que se puede arreglar la manera de hacerlo... hehehe

Código (php) [Seleccionar]
<?php
$path 
$_SERVER['DOCUMENT_ROOT'];
$path .= "/index.php";
include_once(
$path);
showContent();
?>


Y todavia estoy tratando de averiguar como hacer que home sea lo que se muestra cuando no hay un input: index.php incluye main.php y este home.php.

Gracias!

Edito: Estoy algo espeso... con la solución delante todo el tiempo y no la veia :P

Código (php) [Seleccionar]
if(!$_SERVER['QUERY_STRING'])
   $_SERVER['QUERY_STRING'] = 'home';