PDA

Ver la Versión Completa : Insertar una imagen en BBDD con SQL Server y PHP


gines
03-07-2003, 20:49:27
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:

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.

gines
08-07-2003, 18:10:38
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.

BlackFreD
31-05-2006, 15:08:17
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!

kayetano
31-05-2006, 18:27:10
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.

D-MO
01-06-2006, 07:23:13
¿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.

kayetano
01-06-2006, 09:58:08
Hola

¿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.

BlackFreD
01-06-2006, 11:24:47
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!

BlackFreD
01-06-2006, 14:16:14
He seguido haciendo pruebas y no consigo nada.

El codigo del formulario es el siguiente:


<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:

$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!

kayetano
01-06-2006, 14:38:08
Hola
<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?

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
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.

D-MO
01-06-2006, 17:52:55
...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.

kayetano
01-06-2006, 19:13:40
Hola

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.

BlackFreD
02-06-2006, 11:10:16
Que suerte haber encontrado este foro!!!! En breve pruebo esto y os cuento que tal me ha ido!

Muchas gracias por todo!

BlackFreD
02-06-2006, 12:14:59
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!

BlackFreD
02-06-2006, 12:19:04
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!

BlackFreD
02-06-2006, 12:33:02
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...

kayetano
02-06-2006, 13:19:27
(1000 = 10kb? o 1kb?)
1Kb, hay que estar en todo.


$fp = fopen($usr_file_name, "rb");
$img2save = fread($fp, $usr_file_size);
$img2save = addslashes($img2save);
fclose($fp);
yo es que soy un bruto
$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.

BlackFreD
02-06-2006, 13:32:17
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!

kayetano
02-06-2006, 13:37:34
Hola

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

BlackFreD
02-06-2006, 13:39:09
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?

Jiro-101
04-06-2007, 22:40:09
...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 :confused:, 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: :cool:

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 mssqlextension=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.:D

wcarval
11-04-2011, 22:58:17
buen día, he leído este post y es el único mas o menos referenciado con mi problema.

Resulta que necesito extraer una imagen desde sql server 2005, desde un campo tipo "image".... esto lo hago desde php, pero no lo he logrado, la salida es parcial y nunca completa la imagen.

he intentado infinidad de métodos según los que he conseguido y nada todavía.

estoy desarrollando una aplicación de integración remota de datos y necesito tomar esa imagen para insertarla en una base de datos mysql, o convertirla en un archivo físico para después trasladarla por ftp, lo que ya hago normalmente.

la verdad tengo bastante experiencia en php pero no he logrado dar con la solución, siempre me saca parcialmente la imagen, he intentado por odbc.... y ahora ya tengo configurado php con conexión directa a mssql y nada.

agradecería cualquier ayuda para la extracción de la imagen y su escritura en físico, o inserción en la base de datos...

gracias por su aporte, espero alguna noticia.

feliz dia

juliamo28
15-04-2011, 21:55:41
Súper util este tema, muchas gracias a todos por sus aportes.
Saludos.