Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > PHP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-07-2003
gines gines is offline
Miembro
 
Registrado: jul 2003
Ubicación: Murcia
Posts: 10
Poder: 0
gines Va por buen camino
Insertar una imagen en BBDD con SQL Server y PHP

Hola a todos.

Creo estar siguiendo todos los pasos necesarios para "subir" un archivo JPG a un registro de bbdd SQl Server 2000. La función:
Código PHP:
function UploadFoto($ID)
{
  
$archivo $_FILES["archivo"]["tmp_name"];
  
$tamanio $_FILES["archivo"]["size"];
  
$tipo $_FILES["archivo"]["type"];
  
$nombre $_FILES["archivo"]["name"];
            
  if ( 
$archivo != "none" )
  {
    
$this->ConectaBBDD(); //script de acceso a la bbdd.

    
$fp fopen($archivo"rb");
    
$contenido fread($fp$tamanio);
    
$contenido addslashes($contenido);
    
fclose($fp);
    
$qry "update tb set foto = '$contenido' where IDReg = $ID";
    
$datos mssql_query($qry$this->id_conexion);
 } else print 
"No se ha podido subir el archivo al servidor";

... como es natural antes he seleccionado el archivo con un formulario debidamente codificado con enctype='multipart/form-data' y un input tipo "file".

El problema es que al intentar ejecutar el update, me da toda una secuencia de errores de los que adjunto alguno:

Warning: mssql_query() [function.mssql-query]: message: Line 8: Incorrect syntax near ')'. (severity 15) in C:\miprograma.php on line 1221


Warning: mssql_query() [function.mssql-query]: message: The identifier that starts with 'y$µwZ§ì‹ñªÃáîµâ _A³Ólôý\"k§_G½bŽ&l\0¥» ñ\'—`è¾iUÛÍjûÇןà û_õ>AÒö¿‡ìSû«òþ«µý—?d}\'ö¬ø£ñÃSøžo¾‡¤Á¨YÜ,\"xüù$EÛ\"ðJíßÐ× ¡³aÙù' is too long. Maximum length is 128. (severity 15) in C:\miprograma.php on line 1221

y no veo el origen ni la manera de solucionarlo.

¿ A alguien se le ocurre algo ?

Gracias de antemano y un saludo a todos.
Responder Con Cita
  #2  
Antiguo 08-07-2003
gines gines is offline
Miembro
 
Registrado: jul 2003
Ubicación: Murcia
Posts: 10
Poder: 0
gines Va por buen camino
Hola.

Vista la inexistencia de respuestas mucho me temo que se trate de un tema ajeno a casi todos. Por eso me he empeñado y al final creo haber conseguido solucionar el problema. Lo paso al foro por si ayuda a alguien.

- En primer lugar, el campo de la tabla SQl Server que contiene la imagen debe ser "binary" o "varbinary". Si usamos los predefinidos tipo "Image" no funciona.

- A la hora de actualizar el contenido, hay que usar la función CONVERT, que vuelca a datos binarios, de la forma:

update tabla set campobinary = convert(binary, '$contenido') where IDReg = $ID

De este modo sí funciona.

Lo que ahora no quiere funcionar, es la visualización del archivo, en mi caso jpg.

Intento lo que normalmente es correcto:

<img src='pruebas.php'>

donde pruebas.php hace un select del campo y luego un echo, precedido del correspondiente

header("Content-type: image/jpeg")

A ver si alguien puede echarme un cable con esto, aunque por las fechas que estamos parece que andemos bajo mínimos.

Gracias de nuevo y saludos.
Responder Con Cita
  #3  
Antiguo 31-05-2006
BlackFreD BlackFreD is offline
Registrado
 
Registrado: may 2006
Posts: 9
Poder: 0
BlackFreD Va por buen camino
Gines, estoy muy interesado en este tema ya que es justo lo que necesito hacer para uno de mis proyectos.

Estoy trabajando con MS SQL Server + PHP y hasta ahora tenia un directorio con permisos para usuarios anonimos donde subia las imagenes y las usaba. Pero ahroa me interesa guardar las imagenes en la bdd. Al igual que tu, ando un poco desesperado. He encontrado mucha info acerca de MySQL + PHP, pero en cuanto a SQL Server apenas encuentro nada. Se que hay que tener el formato de registro en binary en lugar de image y que hay que pasar la imagen a binario para guardarla.

Para visualizarla hay que cambiar el header antes de hacer el echo pero tampoco me funciona... Estoy en pruebas.

Quisiera saber si al fin lo lograste?

Muchas gracias!
Responder Con Cita
  #4  
Antiguo 31-05-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 22
kayetano Va por buen camino
Hola

Yo utilizao MySql y resuelvo ese problema simplemente con la función "addslashes" aplicada a contenido de la imagen.

El segundo tema, el que no te funcione el mostrar la imagen, es posible que sea por el echo de utilizar la función "convert", pienso yo, si has realizado una conversión para guardar supongo que para mostrar el contenido tendrás que hacer el paso contrario.

Prueba usar "addslashes" en vez de "convert" a ver si se soluciona el problema.

PD. "addslashes" es una función de PHP.
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente

Última edición por kayetano fecha: 31-05-2006 a las 17:30:25.
Responder Con Cita
  #5  
Antiguo 01-06-2006
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
¿Pero porque debe estar la imagen exactamente en la base de datos?, no sería mas fácil (además de ahorrarnos tiempo en la consulta) si solo guardamos la ubicación de la imagen en la base de datos, tomamos este dato con php y llamamos a la imagen despues de esto.

En general los servicios de hospedaje tienen una cantidad un tanto pequeña para las bases de datos, mientras que es todo lo contrario con el espacio en disco que ofrecen, ademas si el servidor de bd está en un equipo distinto al del servidor web, estará tardando mas tiempo en la consulta.

Saludos.
Responder Con Cita
  #6  
Antiguo 01-06-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 22
kayetano Va por buen camino
Hola

Cita:
Empezado por D-MO
¿Pero porque debe estar la imagen exactamente en la base de datos?, no sería mas fácil (además de ahorrarnos tiempo en la consulta) si solo guardamos la ubicación de la imagen en la base de datos, tomamos este dato con php y llamamos a la imagen despues de esto.
Razón tienes, yo cuando trabajo con muchas imágenes utilizo esta opción para na saturar la BBDD.

Pero gines no ha preguntado eso, y yo intento solucionar el problema en concreto, porque puede tener sus razones para hacerlo asín y oye saber algu nuevo nunca biene mal y puede servir en otras situaciones.
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente
Responder Con Cita
  #7  
Antiguo 01-06-2006
BlackFreD BlackFreD is offline
Registrado
 
Registrado: may 2006
Posts: 9
Poder: 0
BlackFreD Va por buen camino
En mi caso en concreto, el espacio utilizado por la web y sus ficheros es un espacio un tanto delicado, con alto nivel de seguridad y demás. No soy el administrador, sino uno de los empleados y se me ha pedido que los usuarios puedan subir imagenes (para noticias) de un determinado tamaño y resolución. Entonces, una opción sería generar una carpeta que tuviera permisos para usuarios anónimos aunque la segunda opción fue que las propias imagenes se almacenaran en la bdd. El administrador digamos que me recomendó (por no decir obligó) a la segunda...

El número de imagenes es muy pequeño dado que no se publican muchas noticias y no todas ellas tienen imagenes...

Gracias por todo, probaré lo dicho y os mantengo informados!

Ciao!
Responder Con Cita
  #8  
Antiguo 01-06-2006
BlackFreD BlackFreD is offline
Registrado
 
Registrado: may 2006
Posts: 9
Poder: 0
BlackFreD Va por buen camino
He seguido haciendo pruebas y no consigo nada.

El codigo del formulario es el siguiente:

Código PHP:
<form enctype="multipart/form-data" action=" <?PHP echo "alta_noticia.php?" SID;  ?>" method=post>
...
<table>
  <tr>
    <td valign="top"><input type="hidden" name="MAX_FILE_SIZE" value="1000"><span class="Estilo1">Imagen: </span></td>
    <td><input name="form_image_file" type="file" id="form_image_file"></td>
  </tr>
</table>
...
</form>
El codigo php es el siguiente:
Código PHP:
$usr_file_name $_FILES["form_image_file"]["tmp_name"]; 
$usr_file $_FILES["form_image_file"]["name"]; 
$usr_file_size $_FILES["form_image_file"]["size"]; 
$usr_file_type $_FILES["form_image_file"]["type"]; 
                                
echo 
"Info del fichero -> FileName: " $usr_file_name " File: " $usr_file " FileSize: " $usr_file_size " FileType: " $usr_file_type;

if (
$usr_file_name != "none")
{                                            
  
$fp fopen($usr_file_name"rb");
  
$img2save fread($fp$usr_file_size);
  
$img2save addslashes($img2save);
  
fclose($fp);

Conecto a la bdd y la actualizo:

$result = mssql_query("INSERT INTO Noticias (DataPubli,DataDel,Tit,Res,Desc,Img,Link) VALUES ('" . $data2publi . "','" . $data2del . "','" . $form_tit_new . "','" . $form_res_new . "','" . $form_desc_new . "','" . convert(binary, '$img2save') . "','" . $form_link_new . "')");


Cuando miro el echo de la url php me devuelve:

Info del fichero -> FileName: File: FicheroPrueba.jpg FileSize: 0 FileType:

Como podéis ver no me devuelve el nombre del fichero temporal, ni el tamaño ni el tipo mime....

No se que debo de estar haciendo mal.

Si tenéis alguna idea os lo agradeceré!

Muchas gracias!

Última edición por kayetano fecha: 01-06-2006 a las 14:55:44.
Responder Con Cita
  #9  
Antiguo 01-06-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 22
kayetano Va por buen camino
Hola
Cita:
Empezado por BlackFreD
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Lo primero y mas importante, ¿sabes que estas limitando el tamaño del archivo? ¿Que tamaño tiene el archivo que estas subiendo?

Cita:
Empezado por BlackFreD
echo "Info del fichero -> FileName: " . $usr_file_name . " File: " . $usr_file . " FileSize: " . $usr_file_size . " FileType: " . $usr_file_type;
Segundo, la info que estas mostrando es incompleta, prueba simplemente a poner
Código PHP:
print_r$_FILES 
He realizado una prueba rápida y parece que funciona, claro esta siempre y cuando subas un archivo de menos de 10Kb.

Quita el CONVERT de la consulta con el ADDSLASHES debe sobrar.
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente

Última edición por kayetano fecha: 01-06-2006 a las 13:42:09.
Responder Con Cita
  #10  
Antiguo 01-06-2006
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Cita:
Empezado por kayetano
...y oye saber algu nuevo nunca biene mal y puede servir en otras situaciones.
Pues nunca he querido decir eso, se que nunca cae mal aprender algo nuevo (y yo necesito aprender mucho), simplemente di mi punto de vista por si a BlackFreD le parece pueda tomarlo en cuenta.

Saludos.

Última edición por D-MO fecha: 01-06-2006 a las 16:55:19.
Responder Con Cita
  #11  
Antiguo 01-06-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 22
kayetano Va por buen camino
Hola

Cita:
Empezado por D-MO
Pues nunca he querido decir eso, se que nunca cae mal aprender algo nuevo (y yo necesito aprender mucho), simplemente di mi punto de vista por si a BlackFreD le parece pueda tomarlo en cuenta.
No pasa nada D-MO, lo que ocurre es que yo llevo muchos años con el tema de web y luchando con los administradores de muchos servidores y me ha pasado lo que a BlackFreD en varias ocasiones, ya sea por temas de seguridad, por temas de espacio, para que los usuarios no metan la zarpa con el ftp, por que al administrador del sistema le pasa por las pelotas, ... siempre hay una escusa para meter las fotos en la base de datos.
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente

Última edición por kayetano fecha: 02-06-2006 a las 10:41:40.
Responder Con Cita
  #12  
Antiguo 02-06-2006
BlackFreD BlackFreD is offline
Registrado
 
Registrado: may 2006
Posts: 9
Poder: 0
BlackFreD Va por buen camino
Que suerte haber encontrado este foro!!!! En breve pruebo esto y os cuento que tal me ha ido!

Muchas gracias por todo!
Responder Con Cita
  #13  
Antiguo 02-06-2006
BlackFreD BlackFreD is offline
Registrado
 
Registrado: may 2006
Posts: 9
Poder: 0
BlackFreD Va por buen camino
Hola de nuevo...

He estado haciendo pruebas...

Al parecer lo que me daba problemas era la limitación de espacio del formulario. La había puesto dado que quería limitar los ficheros a un maximo de 100kb, no 10kb. Pero bueno, de todos modos, creo que lo mejor ha sido sacar ese input y controlarlo mediante php con el size (1000 = 10kb? o 1kb?). Ahora mismo lo tengo sin el input del max size y el print_r( $_FILES ); me devuelve:

Array ( [form_image_file] => Array ( [name] => Carla.jpg [type] => image/jpeg [tmp_name] => C:\WINDOWS\TEMP\phpEF.tmp [error] => 0 [size] => 204865 ) )

Con que creo que la cosa pinta bastante bien. Por otro lado, al generar la noticia me da error. No me la guarda...

He sacado el convert y lo tengo del siguiente modo:

$result = mssql_query("INSERT INTO Noticias (DataPubli,DataDel,Tit,Res,Desc,Img,Link) VALUES ('" . $data2publi . "','" . $data2del . "','" . $form_tit_new . "','" . $form_res_new . "','" . $form_desc_new . "','" . '$img2save' . "','" . $form_link_new . "')");


donde $img2save es:

$usr_file_name = $_FILES["form_image_file"]["tmp_name"];
$usr_file = $_FILES["form_image_file"]["name"];
$usr_file_size = $_FILES["form_image_file"]["size"];
$usr_file_type = $_FILES["form_image_file"]["type"];

if ($usr_file_name != "none")
{
$fp = fopen($usr_file_name, "rb");
$img2save = fread($fp, $usr_file_size);
$img2save = addslashes($img2save);
fclose($fp);
}

Muchas gracias por todo!
Responder Con Cita
  #14  
Antiguo 02-06-2006
BlackFreD BlackFreD is offline
Registrado
 
Registrado: may 2006
Posts: 9
Poder: 0
BlackFreD Va por buen camino
Una cosa, se me acaba de ocurrir...

En la bdd tengo declarado el registro img como binary y length 50.

Claro esta que puede que sea debido a ello. Quisiera saber ese 50 a que se refiere? 50Kb, 50bytes?

Fijo que se debe a ello!

Muchas gracias de nuevo!
Responder Con Cita
  #15  
Antiguo 02-06-2006
BlackFreD BlackFreD is offline
Registrado
 
Registrado: may 2006
Posts: 9
Poder: 0
BlackFreD Va por buen camino
Acabo de ver que son bytes con que 3000 seria equivalente a 300Kb, entonces no debería tener problemas para subir una imagen de 200kb. Pero sigue pentando...

Sigo investigando...
Responder Con Cita
  #16  
Antiguo 02-06-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 22
kayetano Va por buen camino
Cita:
Empezado por BlackFreD
(1000 = 10kb? o 1kb?)
1Kb, hay que estar en todo.

Cita:
Empezado por BlackFreD
$fp = fopen($usr_file_name, "rb");
$img2save = fread($fp, $usr_file_size);
$img2save = addslashes($img2save);
fclose($fp);
yo es que soy un bruto
Código:
$img2save=addslashes( fread( fopen( $usr_file_name, "rb" ), $usr_file_size ) );
Con respecto al tema de guradar en la base de datos MSSQL no se que decirte ya que yo utilizo MySQL y defino el campo como BLOB.
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente
Responder Con Cita
  #17  
Antiguo 02-06-2006
BlackFreD BlackFreD is offline
Registrado
 
Registrado: may 2006
Posts: 9
Poder: 0
BlackFreD Va por buen camino
Ok, merci Kayetano, por lo que veo el fallo debe de estar en la bdd (SQL Server), ya que no estoy seguro pero he visto un par de webs donde comentan que el tamaño maximo de un registro binary es 8000 que se corresponde con 8Kb...

No se como podria lograr almacenar mas de 8Kb ya que las imagenes estan entre los 50 y 200 kb...

Muchas gracias por todo!
Responder Con Cita
  #18  
Antiguo 02-06-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 22
kayetano Va por buen camino
Hola

¿Y no puedes definirlo de alguna otra forma que permita mas tamaño?
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente
Responder Con Cita
  #19  
Antiguo 02-06-2006
BlackFreD BlackFreD is offline
Registrado
 
Registrado: may 2006
Posts: 9
Poder: 0
BlackFreD Va por buen camino
De todos modos, he optado por poner el registro de la bdd a 6000 (que creo que deben de ser 6KB) y he intentado subir una imagen de 3kb y nada, sigue petando... Faltara el convert?
Responder Con Cita
  #20  
Antiguo 04-06-2007
Jiro-101 Jiro-101 is offline
Registrado
 
Registrado: jun 2007
Posts: 1
Poder: 0
Jiro-101 Va por buen camino
Solucion: insertar imagenes o archivos en una base de datos MSSQL con lenguaje PHP

...Primeramente un saludo a todos.

Se que este post en el foro ya tiene hace un buen, pero recientemente me encargaron hacer un sitio web con PHP y base de datos MSSQL y se necesitaba almacenar imagenes en una tabla en la BD sin encontrar una solucion viable , aunque afortunadamente vine a dar aqui, tuve que extender mi investigacion hasta libros de PHP/MSSQL tomando en cuenta que antes no programaba en PHP y ahora que si, este ejemplo se lleva a cabo con la version "PHP 5.2.2" y MSSQL 2000, para esto encontre ciertas configuraciones previas que hay que tomar en cuenta para que esto funcione, asi que si mas preambulos ay les va la receta:

primeramente creamos la tabla en la base de datos, el nombre que gusten los campos que gusten, y para este ejemplo vamos a manejar 4 campos para almacenar las imagenes:
[foto] [text] ,
[foto_nombre] [varchar] (100) ,
[foto_kb] [varchar] (20) ,
[foto_tipo] [varchar] (20)
En donde el campo foto, es un campo de texto normal, alli es donde vamos a guardar la imagen, los demas campos contendran la informacion de la imagen.

despues... antes de empezar a programar cualquier cosa en PHP, tenemos que tomar en cuenta 2 cosas importantes que deben estar configuradas en el archivo de PHP.INI:
la primera, tener activadas las extensiones de mssql
extension=php_mssql.dll
y la segunda, como vamos a manejar imagenes las cuales vamos a convertir a texto binario largo, tenemos que tener activada esta opcion para que PHP nos permita hacerlo, esto es en las 2 siguientes lineas:
; Valid range 0 - 2147483647. Default = 4096.
mssql.textlimit = 2147483647

; Valid range 0 - 2147483647. Default = 4096.
mssql.textsize = 2147483647
aqui lo que hacemos es poner al maximo el rango valido para que PHP pueda manejar en un GET o POST la informacion que vamos a mandar a la base de datos.

ahora si... a programar.
vamos a hacerlo en 2 pasos, el upload y el download, en el upload, primeramente creamos un formulario con estas caracteristicas:
<form method="POST" enctype="multipart/form-data" action="inserta_imagen.php">
<input type="file" name="foto_a_subir" id="foto_a_subir" size="50">
<input type="submit" value=" Aceptar " name="aceptar">
</form>
despues creamos el archivo inserta_imagen.php, en donde la informacion que vamos a obtener la vamos a manejar asi:
$Imagen = $_FILES['foto_a_subir']['tmp_name'];
$FotoNombre = $_FILES['foto_a_subir']['name'];
$FotoTipo = $_FILES['foto_a_subir']['type'];
$FotoKb = $_FILES['foto_a_subir']['size'];
$Fotografia = base64_encode(addslashes(fread(fopen($Imagen, "r"), filesize($Imagen))));
las primeras 4 lineas es donde php obtiene la informacion de la imagen, primeramente la imagen, luego el nombre, tipo de archivo y la ultima linea es en donde esta el secreto de este asunto, lo que hacemos es convertir la imagen a codigo binario codificado a 64, incluyendo los slashes. esta informacion se va a guardar directamente asi tal cual, en el campo foto de la base de datos. hacemos el INSERT INTO y listo...
$Query = "INSERT INTO fotografias(id_foto, foto, foto_nombre, foto_kb, foto_tipo) VALUES(" . $Fotografia . "','" . $FotoNombre . "','" . $FotoKb . "','" . $FotoTipo . "')";
luego, para poder visualizar la imagen, es muy sencillo, simplemente tomamos la misma informacion en un SELECT, pero para esto tenemos que volver a convertir el codigo binario de 64, para eso hacemos lo siguiente, anteriormente solicitamos extraer la informacion de tipo de imagen, esto para posteriormente poder manipular el contenido a imprimir en pantalla:
$Query_fotos = mssql_query("SELECT foto,foto_nombre,foto_tipo,foto_kb FROM $Tabla WHERE $LaCondicion=$ID");
$rs_fotos = mssql_fetch_array($Query_fotos);
header("Content-type: " . $rs_fotos["foto_tipo"]);
print stripslashes(base64_decode($rs_fotos["foto"]));
aqui primeramente hacemos nuestro SELECT, traemos la info y lo ponemos en un array, luego, mandamos cambiar el header de la pagina, indicando el tipo de contenido el cual solicitamos cuando subimos la imagen, luego, convertimos el codigo binario con la funcion base64_encode y listo.

y asi es como consegui subir fotos o archivos a mi base de datos con PHP y MSSQL, sigan los pasos tal cual como se los puse aqui, y no van a tener ningun problema.

felices teclazos... hasta pronto.

Última edición por Jiro-101 fecha: 04-06-2007 a las 21:53:41.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:18:39.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi