Cry Programación php

eXtreM3

Buenas! Necesito desahogarme y vengo a hacer un cry, pequeño, pero cry.

El php me engaña.

Tengo una consulta vale? De la cual, si pongo

echo $row[11];

Me imprime esto (sin comillas) -> "sinFoto.jpg"

Hasta aquí todo perfecto, ahora viene la más absoluta de todas las absurdeces habidas y por haber. Tengo un if, tal que:

if ( $row[11] != "sinFoto.jpg" )
{
       sentencias
}

Por qué coño entra en ese if?????? He hecho ese tipo de estructura un millón de veces y nunca me ha pasado tal cosa. He probado a ponerlo al revés, asi:

if ( $row[11] == "sinFoto.jpg" )

Y también entra. Qué está pasando??? :(

r2d2rigo

strcmp, y tambien comprueba que no hay espacios/caracteres invalidos en el campo de la tabla.

eXtreM3

strcmp compara alfabéticamente 2 cadenas... si comparas 'a' y 'b' te va a decir que 'a' es menor. No me sirve entonces.

He comprobado el campo de la tabla y está como lo he puesto en 1, sin espacios.

La pregunta principal, es por qué entra en el if independientemente del comparador?? si es != entra y si es == también entra, directamente no lo entiendo.

willsmith

en el apartado de fotos puedes dejar el campo vacio si este no lo ha rellenado, haces

if(!$row[avatar]){
$img = "Sin_Avatar.jpg";
}else{
$img = $row[avatar];
}

o

$img = "Sin_Avatar.jpg";
if($row[avatar]){
$img = $row[avatar];
}

o

echo ((true ? $row[avatar] : 'false') ? $row[avatar] : 'Sin_avatar-jpg');
Hobbes

#3 ¿Por que cojones no lees?

Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.

eXtreM3

#5 por qué cojones no lees tú?

<?php
$str1 = 'a';
$str2 = 'b';
var_dump(strcmp($str1, $str2)); //int(-1)
?>

Alphabetically 'a' precedes 'b'. If we view the strings as values 'a' is less than 'b' and therefore the function returns -1.

#4 gracias, ahora lo pruebo ;)

NeB1

#6 las veces que me ha pasado algo así ha sido por espacios en blanco delante y detrás del nombre o cosas parecidas, carácteres raros que no se vén. Prueba a pasarle a la cadena las funciones trim y chop.

si nos puedes hacer un eregi("Foto2.jpg", $row[11])(o preg mejor aún)

cabron

#6

No entiendo tu problema con strcomp. Si son iguales las cadenas, devuelve 0, con lo cual, con poner if (strcomp( $row[11] , "sinFoto.jpg" ) != 0 ) lo tienes hecho.

Sobre cual es el problema con la condición, prueba a poner esto:

var_dump($row[11])

A ver que te muestra.

A

#7 +1 , la de veces que me he tirado de los pelos, y la solución era un simple trim.

tarzanete

Pues lo mio es aun más raro, hago un header('Location: 401.php' ) ; para que me redirija a una página de error, y no lo hace, he tenido que forzarlo con javascript, pero eso es una marranada.
Y no, no escribo nada antes del header

eXtreM3

#10 si te sirve de consuelo, a mí a veces tampoco me va el header... rara vez no le da la gana de hacerlo y tengo que tirar de javascript...

PiradoIV

Es una tontería muchas veces lo del Header, probad el exit.

<?php
header("Location: http://twitter.com/");
exit;
?>
bLaKnI

Lo habeis resuelto? Sino os doy la solución yo, es muy fácil.

Se trata de como gestiona PHP los tipos.
Dado que el array $row puede tener varios tipos, no puede compararlo directamente con un string.
Eso sucede tambien con comparaciones tales como:

if( 0=="lalala" ){
aqui entra, aunque no se comprenda, pero entra.
}

La solución?

Usa "estrictamentes", es decir (!==) :

if ( $row[11] !== "sinFoto.jpg" )
{
sentencias
}

Ya verás como funciona :)

Saludos.

PD: tambien se puede resolver via casting. La idea, es hacer coincidir los tipos. Porque por ejemplo, al comprarar una string con un entero, prevale el entero. Luego se saca automaticamente el valor de la string, y parece ser que por defecto es 0. Luego 0=0 y entra...
Son cosas "raras", pero que hay que tener en cuenta. :)

SiCk

El casting es bien sencillo, pones entre paréntesis el tipo a convertir delante de la variable y listo:

$hola = "123";
$hola = (int)$hola;
// Ya es entero xD

Yo lo uso mucho por que también me gusta pedir tipo estricto en la declaración de funciones.

public function test(String $primera, Boolean $dos) {

}

Todo eso, con el controlador (index.php) englobando un try catch general capturando excepciones y no sabéis la de problemas que se evitan y el buen gestor de errores que consigues bien fácil.

tarzanete

no me va con exit :/

bLaKnI

A ver, al del header (tarzanete):

Tienes una carpeta A.
En esta carpeta tienes un archivo desde el que incluyes un archivo de una carpeta B.
Esta carpeta B, esta dentro de la A.

Luego, en el fichero de A haces:

...
include("B/fichero.php");
... <-- AQUI NO PUEDE HABER HTML ESCUPIDO ALGUNO! Un fichero que incluye un otro fichero que posteriormente hará "header location", no debe contener HTML ALGUNO!

En el fichero de B tienes:

...
header("Location: ../ficherodeA.php");
exit();
...

Detalles de este ultimo trozo:

  • La ruta. Si quieres volver "atrás", asegurate de que los paths no son absolutos! Sino, relativos. Y asegurate de que no tienes "cruce de paths" (archivos excluyentes mutuamente).
  • Location, con : eh?

Si tienes la estructura que aquí te indico, NO DEBES tener problema alguno.

Si consideras que "es lo que tienes", te pido que pongas aquí:

a) la porcion de codigo del archivo que incluye al que luego hara el header_location, y
b) la porcion de codigo del fichero que contiene el header_location.

Merci.

tarzanete

a ver, tengo una pagina de login, que tiene la lógica de login y el formulario de login y una página de error, a la que si accedo directamente(localhost/401.php) si que funciona.
en ese login.php:

un par de includes de funciones auxiliares
session_start();
header('Cache-control:private');
if(isset($_GET['login'])) // si intenta logear paso por get la palabra login si quiero desconectarme paso logout
{
if username y password estan) //simplificando
{
...

}else{
  $_SESSION['access'] = FALSE;
  $_SESSION['username'] = null;
 header ("Location: 401.php");
}

exit;
}

luego el formulario normal de login.

la pagina de error, no tiene tampoco mucho secreto, está en la misma subcarpeta que la de login, así que me dirijo a ella en un path relativo, ya que no tiene que subir ni bajar, están en la carpeta raíz del servidor.

eXtreM3

#17, en #16 ha puesto exit(); y tú exit; igual es por eso...

#13 oh gran sabio jajaja, muchas gracias ^^

tarzanete

no, sea con paréntesis o sin ellos no funciona :(
es como si ignorara el header nuevo, si uso javascript para hacer el cambio de pagina si que lo hace, pero me parece como un fallo de seguridad.

bLaKnI

Te ha rulado eXtreM3? Me alegro entonces! :)

Tarzanete, seguramente te lanza algún error cuando lo ejecutas, en tanto que dices que no funciona. Cual es el error? Pega aquí el warning o error o lo que sea.

Si no te lanza nada, vete a la parte mas "alta" del codigo mas "primario" que tengas, del que otros cuelguen (digamos, el tipico header que incluyes a todas las paginas) y añadele error_reporting(E_ALL);

Luego pon aquí el error que te saca cuando intentas que redireccione a la página.

Sea dicho tambien que, usar el redoreccionamiento via window.location no es incorrecto. Lo usa mucha gente.
Pero el que debas usarlo, denota claramente una mala estructuración de directorios, ficheros y inclusiones entre unos y otros.
Pero tranqui, nos ha pasado a TODOS, y todos hemos salido del paso medianta javascript.
No te preocupes por la seguridad. ;)

De todas formas, intenta mejorar tu práxia en la estructuración de tus proyectos de cara al futuro! :)

tarzanete

Gracias por intentar contestarlo...
A ver, con el error reporting (el cual está activado desde que comencé XD) pero lo he vuelto a poner, pues no muestra nada, simplemente se queda la página en blanco. No se si es por algun rollo de directorios, pero si está en la misma subcarpeta, y escribo directamente el nombre del archivo ya me refiero a éste no?
Lo que más me escama es que si en lugar de esa localizacion, pongo otra pagina, con la dirección http completa, tampoco me redirige a ella, es como si no funcionara el header :o_o:

r2d2rigo

Seguro que no has imprimido ningun otro caracter por pantalla antes de hacer el header? Ni siquiera un espacio que se te haya podido pasar por alto?

tarzanete

Una vez envío el login a la misma página, entra desde arriba, arriba solo hay validaciones php, no hay ningún echo ni nada, y de ahí al head y a un exit, no muestra nada. Y el código fuente de lo que se muestra aparece vacío

LOc0

Revisa cualquier include o require que tengas más arriba y comprueba que no haya caracteres antes del <?php (aunque te debería de saltar un warning con el nivel de reporting al máximo como comentabas que habías puesto). De todas formas, en estos casos lo mejor es crearse un fichero php desde cero súper básico con #12

Si eso no funciona, ya habría que ponerse a mirar fuera de PHP...

Salu2 ;)

eXtreM3

Haz caso a #24.

A mí una vez me pasaba lo que a tí y el error era que dentro de un include, al final del todo puse una función javascript y no me acordaba en absoluto jajaja. Después de mirar y mirar y hacer modificaciones, vi esa maldita función, la puse en su sitio y listo ;)

PiradoIV

También puedes revisar cada archivo que incluyas y le quitas el ?> del final (no es necesario y te ahorras montón de problemas de este tipo)

tarzanete

Arreglado ^^
Muchas gracias por la ayuda, al final, hice un header solo, y fui añadiendo cosas hasta ver cuál era la que estaba interfiriendo.
Resulta que un hábito heredado de la programación C++, al finalizar un archivo, siempre le daba enter.
Al no tenerlo entre etiquetas ni nada pensaba que no influía. Pero si, tres de mis archivos de funciones tenían retorno de carro, y mi main un espacio al terminar ?>
Lo he quitado y ahora redirige cojonudo :D

Gracias de nuevo por ayudarme.

PiradoIV

Por ese tipo de cosas CodeIgniter recomienda no cerrar el tag:

"The PHP closing tag on a PHP document ?> is optional to the PHP parser. However, if used, any whitespace following the closing tag, whether introduced by the developer, user, or an FTP application, can cause unwanted output, PHP errors, or if the latter are suppressed, blank pages. For this reason, all PHP files should OMIT the closing PHP tag, and instead use a comment block to mark the end of file and it's location relative to the application root. This allows you to still identify a file as being complete and not truncated."

Tunnecino

#28 Pues mira eso no lo sabía

NeB1

#28 mira que cuando veía eso de archivos sin cerrar me quedaba a cuadros.

Usuarios habituales

  • NeB1
  • Tunnecino
  • PiradoIV
  • tarzanete
  • eXtreM3
  • r2d2rigo
  • bLaKnI