Ir al contenido



Foto

Caracteres especiales en consulta


  • Por favor identifícate para responder
6 respuestas en este tema

#1 Richi

Richi

    Advanced Member

  • Miembros
  • PipPipPip
  • 61 mensajes

Escrito 26 octubre 2017 - 12:22

Buenas, por motivos de la vida existe una tabla llamada tabla1 que tiene varias columnas, entre ellas se encuentra una llamada Año y otra llamada Ubicación. Cuando hago el select en el programa que administra las BD pues funciona correctamente, cuando hago un fetch_assoc en php se cae. El detalle esta en los caracteres especiales. Mi consulta es, ¿Como hago para llamarlos y poder mostrarlos?


php
  1. query= select Año, Ubicación, edad,etc from tabla1
  2. $resultado3 = $conexion-> query($query);
  3. while($reg= $resultado3-> fetch_assoc()){
  4. echo $reg['Año'];
  5. }

Asi es como normalmente lo trabajo pero con esto si tengo la duda, muchas gracias


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.999 mensajes
  • LocationArgentina

Escrito 26 octubre 2017 - 02:02

¿Que error te arroja?

Por lo general los motores de bases de datos no aceptan caracteres "extraños" (ñ, espacios, acentos) como identificadores, sean tablas, campos, índices, etc. Incluso pueden haber problemas al mezclar mayúsculas con minúsculas. Dependiendo de como se configure el motor.

No recuerdo como era el caso de MySQL, pero se ha extendido como si fuera estándar el de nombrar todo con mayusculas. Con Firebird, y el administrador IB Expert por caso puedes llegar a tener problemas si destildas el checkbox para que nombre a los objetos con mayúsculas. En caso de destildar el motor entenderá que no es lo mismo "NOMBREDEMITABLA" que "NombreDeMiTabla". Esto afecta a como deberán escribirse las instrucciones SQL, y hasta incluso en como deberá entender las comillas dobles y simples. Básicamente te obliga (si destildas) a que todo de ahora en adelante lo llames con comillas dobles.

No recuerdo como era el nombre de esta configuración. Pero otros motores son igual.

 

Lo mejor sería que cambies Año por Anno, Anio, o alguna otra expresión. Creo, y me parece que no es un identificador válido. Un identificador válido debe tener A..Z, a..z, 0..9, _ y creo que no más.

 

Saludos,


  • 0

#3 Richi

Richi

    Advanced Member

  • Miembros
  • PipPipPip
  • 61 mensajes

Escrito 26 octubre 2017 - 02:09

¿Que error te arroja?

Por lo general los motores de bases de datos no aceptan caracteres "extraños" (ñ, espacios, acentos) como identificadores, sean tablas, campos, índices, etc. Incluso pueden haber problemas al mezclar mayúsculas con minúsculas. Dependiendo de como se configure el motor.

No recuerdo como era el caso de MySQL, pero se ha extendido como si fuera estándar el de nombrar todo con mayusculas. Con Firebird, y el administrador IB Expert por caso puedes llegar a tener problemas si destildas el checkbox para que nombre a los objetos con mayúsculas. En caso de destildar el motor entenderá que no es lo mismo "NOMBREDEMITABLA" que "NombreDeMiTabla". Esto afecta a como deberán escribirse las instrucciones SQL, y hasta incluso en como deberá entender las comillas dobles y simples. Básicamente te obliga (si destildas) a que todo de ahora en adelante lo llames con comillas dobles.

No recuerdo como era el nombre de esta configuración. Pero otros motores son igual.

 

Lo mejor sería que cambies Año por Anno, Anio, o alguna otra expresión. Creo, y me parece que no es un identificador válido. Un identificador válido debe tener A..Z, a..z, 0..9, _ y creo que no más.

 

Saludos,

Gracias, si eso lo tengo muy claro que no se deben usar pero es como la tienen y propuse el cambio solo que muchisimos sistemas funcionan asi y esta es el primero en web y pues no me resulta. El error que me lanza es


php
  1. Fatal error: Call to a member function fetch_assoc() on a non-object

Me lo muestra cuando en mi consulta hago el select Año from... pero si no agrego esos con caracteres especiales pues si me lanza los datos solo que realmente quiero saber como se soluciona en forma de codigo.


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.999 mensajes
  • LocationArgentina

Escrito 26 octubre 2017 - 08:20

Es que no hay forma de evitarlo. Si necesitas nombrar a ese campo va a salir el error. La otra es que hagas el select * y sólo accedas a los campos de interés.

 

Saludos,


  • 0

#5 Richi

Richi

    Advanced Member

  • Miembros
  • PipPipPip
  • 61 mensajes

Escrito 27 octubre 2017 - 07:41

No espera, ya lo logré. Lo que hice fue crear una variable $log que me guarde lo que viene del mysql_query. Luego con el while recorrerla y utilizando el mysql_fetch_array($log) logro que me corra todo lo que hay en la variable $log para poder desplegar todo.

 

Es importante recalcar que no se deben usar estos caracteres especiales en los campos de la BD, en este caso fue porque ya habian muchos sistemas desarrollados en diferentes lenguajes que utilizan esos campos pero no lo deben hacer.


php
  1. $log=mysql_query("SELECT Año, Campaña, edad, nombre from table1");
  2. while($reg = mysql_fetch_array($log)){
  3. echo $reg['Año'];
  4. echo $reg['Campaña'];
  5. }


  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.254 mensajes
  • LocationRepública Dominicana

Escrito 27 octubre 2017 - 09:08

Es que el problema está en que los nombres de los campos tienen el carácter "ñ", evítalo y te quitarás mucho dolores de cabeza.


  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.999 mensajes
  • LocationArgentina

Escrito 27 octubre 2017 - 09:23

Exacto. Porque la otra es habilitar el ANSI_QUOTES y ahí, en teoría, te debería permitir hacer cosas como:


sql
  1. SELECT "NombreÑadúes" FROM "Mi Tabla de Ñandúes"

Pero claro, tiene sus contras. Como ya he dicho antes.

Lo mejor, es respetar ese "estándar". Que incluso hace más fácil posible migrar de una DB a otra.

 

Saludos,


  • 0