Foros del Web » Programando para Internet » PHP »

conectar a tabla sql server de nombre con caracteres especiales

Estas en el tema de conectar a tabla sql server de nombre con caracteres especiales en el foro de PHP en Foros del Web. Hola buenas amigas/os, a ver si me pueden ayudar con esto: Para conectarme a una tabla de una base de datos sql server; Tengo la ...
  #1 (permalink)  
Antiguo 07/06/2018, 03:27
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
conectar a tabla sql server de nombre con caracteres especiales

Hola buenas amigas/os, a ver si me pueden ayudar con esto:

Para conectarme a una tabla de una base de datos sql server;

Tengo la siguiente sentencia que dice:

Código SQL:
Ver original
  1. $sql = "SELECT * FROM dbo.empresa$Tarifas Proveedores";

Y el navegador me dice el siguiente error:

Notice: Undefined variable: Tarifas

Intuyo que mi script no es capaz de interpretar como parte del nombre de la tabla el
simbolo del "$" y quizas tambien tampoco interprete bien el espacio y el "." .
Pero necesito que mi script lo interprete bien por que forman parte del
nombre de la tabla.

Gracias de antemanoa tod@s.

Última edición por mensajeescrito; 07/06/2018 a las 03:42
  #2 (permalink)  
Antiguo 07/06/2018, 04:42
 
Fecha de Ingreso: mayo-2011
Ubicación: Palma de Mallorca
Mensajes: 108
Antigüedad: 12 años, 11 meses
Puntos: 4
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

Hola mensajeescrito

el simbolo $ en algunos lenguajes de programación, en este caso supongo que PHP, se utilizan para definir variables.
En la libreria jQuery se utiliza para hacer referencia a elementos del DOM de esta manera:

Código Javascript:
Ver original
  1. $("#horario")

Por lo tanto, suele ser una 'palabra' reservada. En este caso, PHP interpreta que a tu sentencia sql le estas incluyendo una variable llamada $Tarifas, sea para definir un nombre de tabla, el nombre de un campo o el valor de un campo, y como no está definida esa variable, como bien te dice el error, pues realiza de manera incorrecta la query.

La solución es cambiar el nombre de la tabla, procurando que no incluya este tipo de simbolos especiales.

Un saludo.
  #3 (permalink)  
Antiguo 07/06/2018, 07:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

Usualmente no es posible, pero ciertas bases de datos admiten el uso de "$" como parte del nombre.
PAra esos casos se usan en MySQL los acentos agudos, asi como en Oracle y SQL Server tienen sus métodos. Este último usa los corchetes.

Código SQL:
Ver original
  1. SELECT * FROM dbo.[empresa$Tarifas] Proveedores

De todos modos es recomendable NO usar caracteres especiales en los nombres de los objetos de BBDD, para evitar conflictos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 07/06/2018, 08:15
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

Gracias gnzsoloyo por responder.

Y que te parece la siguiente posible solucion al problema:

Desde la base de datos sql server programarle un trigger que le diga a la base
de datos que exporte la tabla en cuestion en formato .sql y renombrandola con otro
nombre digamos mas normal sin caracteres especiales.

Y ya de paso que la exportación se efectuara a una hora en concreto cada dia.

Esto se prodria hacer?

Supongo que tendria que hacerlo el administrador de la base de datos (que no soy yo dicho sea de paso).

Que opinas de esto ?
  #5 (permalink)  
Antiguo 07/06/2018, 08:18
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

Cita:
Iniciado por mensajeescrito Ver Mensaje
Gracias gnzsoloyo por responder.

Y que te parece la siguiente posible solucion al problema:

Desde la base de datos sql server programarle un trigger que le diga a la base
de datos que exporte la tabla en cuestion en formato .sql y renombrandola con otro
nombre digamos mas normal sin caracteres especiales.

Y ya de paso que la exportación se efectuara a una hora en concreto cada dia.

Esto se prodria hacer?

Supongo que tendria que hacerlo el administrador de la base de datos (que no soy yo dicho sea de paso).

Que opinas de esto ?
Y para que exportarla? Una tabla en sql se puede renombrar y listo :) o en su defecto haces una copia de la estructura de la tabla, y pasas los datos, para que un trigger y para que exportacion?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 07/06/2018, 08:56
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

Te contesto Libras:

Me han encargado lo siguiente:
Conectarme a un base de datos sql server, el administrador de dicha base de datos me ha dado acceso de lectura a la tabla llamada:
"dbo.empresa$Tarifas Proveedores"

Descargarme esta tabla osea exportarla a un directorio mediante un script en php (no puede exportarse desde un gestor de bases de datos,
ya que esta exportacion se hará cada dia a una hora), seguidamente cogerla de un directorio e
importarla a una segunda base de datos pero esta vez mysql la segunda bbdd.

¿Por que dos bases de datos?, por que la primera la administra otra persona (esta otra persona no puede ser la que exporte la tabla).
Y la segunda la trato yo.
Asi importada la tabla en la segunda bbdd, yo puedo operar sobre dicha tabla
haciendo mas acciones sobre ella.

Esto es lo que se me ha ordenado hacer.

Y todo me funciona siempre y cuando la base de datos primera fuera mysql y no sql server.
Pero no, es sql server y con el agravante de que en el nombre de la tabla lleva cararcteres como $, espacios etc.



Alguna idea la agradeceria mucho por que estoy ya sin ideas la verdad.
  #7 (permalink)  
Antiguo 07/06/2018, 10:00
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

https://stackoverflow.com/questions/...sql-table-name

Como te dijeron usa `` para el nombre de la tabla quedaria tu select como esto:

Código MySQL:
Ver original
  1. $sql = "SELECT * FROM `dbo`.`empresa$Tarifas Proveedores` ";
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 07/06/2018, 10:34
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

Libras acabo de probar lo que me has dicho y me tira el mismo error:

Código PHP:
Ver original
  1. $sql = "SELECT * FROM `dbo`.`empresa$Tarifas Proveedores` ";

Notice: Undefined variable: Tarifas

  #9 (permalink)  
Antiguo 08/06/2018, 05:53
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

Libras, solucionado ya me conecta a la base de datos por fin!!!
He salvado el primer obstaculo que era conectarme a la base de datos y
en concreto a una tabla de caracteres especiales.

Ahora solo me falta la guinda del pastel que para no variar se me resiste.
A ver si me pudieran ayudar con esta ultima parte.

Se trata de exportar la tabla en cuestion a un directorio en formato .sql
Para ello tengo hecho esto de codigo, gracias de antemano.

Código PHP:
Ver original
  1. $conexArrayBBDD = array (
  2.  
  3.         "UID" => "UsuarioNombre",
  4.  
  5.         "PWD" => "1234567",
  6.  
  7.         "Database" => "empresa",
  8.  
  9.     );
  10.  
  11.  
  12.     $conexBBDD = sqlsrv_connect('000.000.000', $conexArrayBBDD);
  13.  
  14.     if ($conexBBDD)
  15.  
  16.         {
  17.             if(($resultado = sqlsrv_query($conexBBDD,"SELECT * FROM [dbo].[Hispamicro$Tarifa Proveedor]")) !== false)
  18.  
  19.                 {
  20.                     //Declaro las variables necesarias
  21.                    
  22.                     $tabla = '';
  23.                    
  24.                     $salida = '';
  25.                
  26.                
  27.                
  28.                     //Consigo las tablas necesarias
  29.                    
  30.                     if($tablas == '*')
  31.                    
  32.                         {
  33.                             $tablas = array();
  34.                            
  35.                             $resultado = $conexBBDD->sqlsrv_query("SHOW TABLES");
  36.                            
  37.                            
  38.                            
  39.                             while($fila = $resultado->sqlsrv_fetch_row())
  40.                            
  41.                                 {
  42.                                     $tablas[] = $fila[0];
  43.                                 }
  44.                         }
  45.                    
  46.                         else
  47.                        
  48.                         {
  49.                             $tablas = is_array($tablas)?$tablas:explode(',',$tablas);
  50.                         }
  51.                
  52.                
  53.                
  54.                     //Hago un recorrido
  55.                    
  56.                     foreach($tablas as $tabla)
  57.                    
  58.                         {
  59.                             $resultado = $conexBBDD->sqlsrv_query("SELECT * FROM " . $tabla);
  60.                            
  61.                             $numColumnas = $resultado->field_count;
  62.                    
  63.                             //$salida .= "DROP TABLE " . $tabla;
  64.                    
  65.                             $resultadoDos = $conexBBDD->sqlsrv_query("SHOW CREATE TABLE " . $tabla);
  66.                            
  67.                             $filaDos = $resultadoDos->sqlsrv_fetch_row();
  68.                    
  69.                             $salida .= "\n\n".$filaDos[1].";\n\n";
  70.                    
  71.                    
  72.                    
  73.                             for($i = 0; $i < $numColumnas; $i++)
  74.                            
  75.                                 {
  76.                                     while($fila = $resultado->sqlsrv_fetch_row())
  77.                                    
  78.                                         {
  79.                                             $salida .= "INSERT INTO " . $tabla . " VALUES(";
  80.                                            
  81.                                             for($j=0; $j < $numColumnas; $j++)
  82.                                            
  83.                                                 {
  84.                                                     $fila[$j] = addslashes($fila[$j]);
  85.                                                    
  86.                                                     //$fila[$j] = ereg_replace("\n","\\n",$fila[$j]);
  87.                                                     $fila[$j] = preg_replace("/\n/","\\n",$fila[$j]);
  88.  
  89.                                                     if (isset($fila[$j]))
  90.                                                    
  91.                                                         {
  92.                                                             $salida .= '"'.$fila[$j].'"' ;
  93.                                                         }
  94.                                                        
  95.                                                         else
  96.                                                        
  97.                                                         {
  98.                                                             $salida .= '""';
  99.                                                         }
  100.                                                        
  101.                                                                                            
  102.                                                    
  103.                                                     if ($j < ($numColumnas-1))
  104.                                                    
  105.                                                         {
  106.                                                             $salida.= ',';
  107.                                                         }
  108.                                                 }
  109.                                                
  110.                                                
  111.                                                
  112.                                                 $salida .= ");\n";
  113.                                         }
  114.                                 }
  115.                        
  116.                        
  117.                        
  118.                                 $salida .= "\n\n\n";
  119.                         }
  120.                
  121.                
  122.                
  123.                     //Guardo el archivo
  124.                    
  125.                     $referencia = fopen('historial/tabla-backup-'.time().'.sql','w+');
  126.                    
  127.                     fwrite($referencia,$salida);
  128.                    
  129.                     fclose($referencia);
  130.  
  131.  
  132.  
  133.                               } //Fin de If
  134.  
  135.  
  136.  
  137.     }//Fin de If
  138.  
  139.     else
  140.  
  141.     {
  142.         die(print_r(sqlsrv_errors(), true));
  143.     }
  #10 (permalink)  
Antiguo 08/06/2018, 07:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

OFF TOPIC en Bases de Datos.

Movido a PHP
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 08/06/2018, 09:24
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

Nota: en php también puedes escapar el $, o bien, colocar tu sentencia en apóstrofes:
Código PHP:
Ver original
  1. $sql = "SELECT * FROM `dbo`.`empresa\$Tarifas Proveedores` ";
  2.  
  3. $sql = 'SELECT * FROM `dbo`.`empresa$Tarifas Proveedores` ';
  #12 (permalink)  
Antiguo 08/06/2018, 09:40
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: conectar a tabla sql server de nombre con caracteres especiales

Gracias por responder ocp001a.

Esto de escapar el $ , etc ya lo he solucionado.

El problema lo tengo ahora con el codigo que he puesto que tengo un script que necesito que me exporte una tabla de sqlsvr a un directorio una tabla y en formato .sql

Y claro para variar no me funciona mi script.

Una manita la agradeceria mucho.

Etiquetas: bases-de-datos-general, caracteres, especiales, nombre, server, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:12.