Foros del Web » Programando para Internet » PHP »

Recoger path de un Upload para almacenarla en mysql

Estas en el tema de Recoger path de un Upload para almacenarla en mysql en el foro de PHP en Foros del Web. Hola, Esoy creando una base de datos nueva y unos sistemas de upload de archivos y de datos a mysql. la cosa es que eun ...

  #1 (permalink)  
Antiguo 16/02/2006, 18:51
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
Exclamación Recoger path de un Upload para almacenarla en mysql

Hola,

Esoy creando una base de datos nueva y unos sistemas de upload de archivos y de datos a mysql.

la cosa es que eun formulario en el que meto datos a una tabla, tambien debo subir un archivo que es una foto. y para el archivo (la foto) quiero almacenar en la base de datos el path a la foto. pero no se como hacerlo...

yo tengo este codigo para subir archivos (que luego implementare con el que lee las variables del fomulario que sube todos los datos a la base de datos)
Código PHP:
<?php
$userfile 
$HTTP_POST_FILES['userfile']['tmp_name'];
$userfile_name $HTTP_POST_FILES['userfile']['name'];
$userfile_size $HTTP_POST_FILES['userfile']['size'];
$userfile_type $HTTP_POST_FILES['userfile']['type'];
$userfile_error $HTTP_POST_FILES['userfile']['error'];
if (
$userfile_error 0)
{
echo 
'Problem: ';
switch (
$userfile_error)
{
case 
1:  echo 'File exceeded upload_max_filesize';  break;
case 
2:  echo 'File exceeded max_file_size';  break;
case 
3:  echo 'File only partially uploaded';  break;
case 
4:  echo 'No file uploaded';  break;
}
exit;
}
if (
$userfile_type != 'text/plain')
{
echo 
'Problem: file is not plain text';
exit;
}
$upfile '/uploads/'.$userfile_name;
if (
is_uploaded_file($userfile)) 
  {
     if (!
move_uploaded_file($userfile$upfile))
     {
        echo 
'Problem: Could not move file to destination directory';
        exit;
     }
  } 
  else 
  {
    echo 
'Problem: Possible file upload attack. Filename: '.$userfile_name;
    exit;
  }
echo 
'File uploaded successfully<br /><br />'
  
$fp fopen($upfile'r');
  
$contents fread ($fpfilesize ($upfile));
  
fclose ($fp);
 
  
$contents strip_tags($contents);
  
$fp fopen($upfile'w');
  
fwrite($fp$contents);
  
fclose($fp);
// show what was uploaded
  
echo 'Preview of uploaded file contents:<br /><hr />';
  echo 
$contents;
  echo 
'<br /><hr />';

?>
lo que no se es que de donde sacar el path y almacenarlo en la base de datos....

alguna orientacion please
  #2 (permalink)  
Antiguo 16/02/2006, 19:04
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
ahora veo que esto:
Código PHP:
$upfile '/uploads/'.$userfile_name
es donde yo elijo el directorio y ademas el nombre del archivo con lo cual creo que la variable $upfile recogeria algo asi por ejemplo: "/uploads/fotodemanolete.jpg"

Me equivoco???

en caso de NO equivocarme... ¿como es recomendable como paso el valo de esa variable a la base de datos?

y por cierto... si tengo que subir datos de texto (manuales... imputs normales) y ademas el archivo... y almacenar el path una vez el archivo este subido... cual seria el oden a seguir en el el proceso php... es que me surgen mil dudas:

¿primero subir archivo y una vez este subido almacena path y los otros datos del formulario? ¿¿¿o como va la vaina???

saludos
  #3 (permalink)  
Antiguo 17/02/2006, 06:24
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
mmmm alguien me orienta un poco please?
  #4 (permalink)  
Antiguo 17/02/2006, 08:11
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
mmmmmm he probado y no me sale.... como almaceno la ruta de el archivo en la base de datos???

que follon
  #5 (permalink)  
Antiguo 17/02/2006, 08:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
No indicas el formulario que usas actualmente ..

Pero, en principio para subir archivos (datos "binarios") y otros datos (de texto plano: tus "inputs" normales que comentas). Tan sólo debes usar un formulario HTML común con codificación "multiparte". (seguramente esto ya lo haces):

Código:
<form enctype="multipart/form-data" action="nose.php" method="POST">
tus campos .. normales
el/los de tipo "file"
botón enviar ...
</form>
http://www.php.net/manual/en/features.file-upload.php

Almacenar esa "ruta" que ya sabes donde obtenerla (la tienes en una variable) junto con las otras que te llegaran en $_POST['nombre_variable_formulario'] .. tan sólo se trata de hacer tu "INSERT" a tu BBBD:

Código PHP:
<?
$sql
="INSERT INTO tabla (id,archivo,dato,otrodato) VALUES ('','".$path."','".$_POST['dato']."','".$_POST['otrodato']."'");
Por supuesto esto implica que tu crees tu tabla en tu BBD .. crees tus campos .. etc .. y que ejecutes tu consulta SQL creada:

www.php.net/mysql

En todo tutorial de PHP siempre hay un capítulo sobre manejo de Mysql con PHP .. revisalos si no controlas ese tema concreto.


Un saludo,
  #6 (permalink)  
Antiguo 17/02/2006, 09:02
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
Cita:
Iniciado por Cluster
No indicas el formulario que usas actualmente ..

Pero, en principio para subir archivos (datos "binarios") y otros datos (de texto plano: tus "inputs" normales que comentas). Tan sólo debes usar un formulario HTML común con codificación "multiparte". (seguramente esto ya lo haces):
Si el tema de los formularios html esta solucionado. en esto no tengo dudas.

Cita:
Iniciado por Cluster
Almacenar esa "ruta" que ya sabes donde obtenerla (la tienes en una variable) junto con las otras que te llegaran en $_POST['nombre_variable_formulario'] .. tan sólo se trata de hacer tu "INSERT" a tu BBBD:

Código PHP:
<?
$sql
="INSERT INTO tabla (id,archivo,dato,otrodato) VALUES ('','".$path."','".$_POST['dato']."','".$_POST['otrodato']."'");
Por supuesto esto implica que tu crees tu tabla en tu BBD .. crees tus campos .. etc .. y que ejecutes tu consulta SQL creada:

www.php.net/mysql

En todo tutorial de PHP siempre hay un capítulo sobre manejo de Mysql con PHP .. revisalos si no controlas ese tema concreto.


Un saludo,
Claro que tengo la base de datos y todo eso... el problema en si es que no tengo claro el procedimiento del upload y de la carga de datos en MySQL. veamos:

Yo creo que debo acoplar el script de upload para que si todo es ok, pase a ejecutar el script que carga los datos (imputs varios y ruta del archivo) en la base de datos... es decir juntar el script de upload del archio y el de la inseccion de datos a MySQL en uno solo.

Esa es mi duda... ¿se hace asi o va en otro orden y por separado?

perdona pero es que aveces me cuesta expersarme... me falta terminologia o lenguage mas tecnico digamos
  #7 (permalink)  
Antiguo 17/02/2006, 09:36
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues es el script que indicas en tu "action" del formulario donde indicas tu archivo a subir (campo file) y otros el que recbie los datos el que tiene que hacer todo el proceso de ubicación física de tu archivo donde corresponda (el "move_uploaded_file()") el que debe tomar esos datos que ya conoces (el $path y demás) el que ejectuará tu sentencia SQL como te puse en el ejemplo.

Un saludo,
  #8 (permalink)  
Antiguo 17/02/2006, 09:53
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
vaya... yo pensaba que podria centralizar la subida de los datos a mysql y el upload en un solo archivo.

¿¿y como paso la variable que recoge el $path a el php que introducira los datos en la tabla??

de todas formas he probado el script de upload solo y me da este error:
Cita:
Warning: move_uploaded_file(): open_basedir restriction in effect. File(/fotos/Fontela.JPG) is not within the allowed path(s): (/home/mindpani/:/usr/lib/php:/usr/local/lib/php:/tmp) in /home/mindpani/public_html/artistas/upload.php on line 63
Problem: Could not move file to destination directory
Al parecer no mueve el archivo temporal al destino final.. ¿por que?
  #9 (permalink)  
Antiguo 17/02/2006, 10:03
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
vale era cuestion de que metia mal la ruta completa. ahora ya funciona el upload... bueno ahora vamos haber si puedo arreglar todo.

saludos
  #10 (permalink)  
Antiguo 17/02/2006, 10:18
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
No dije que no se podría centralizar todo en un sólo script.

Justamente te dije que eso es lo que debes hacer .. en el mismo script que procesa tu upload del archivo .. por donde dices "echo 'File uploaded successfully<br /><br />';" .. ahí es donde ya sabes que tu archivo lo tienes, se pudo ubicar en su destino definitivo y está todo OK. Es en ese punto donde ejecutaras tu consulta SQL de "INSERT" como te mostré para almacenar en un campo de esa tabla que uses ese dato de tu archivo con su ruta


(Opinión/consejo: Sería mejor sólo almacenar el nombre del archivo .. ¿que pasará el día que muevas tu aplicación o esos datos a otro sitio?.
Las rutas que son "fijas" se usan como variabels o constantes a la hora de ir a "buscar" a tu archivo .. )

Un saludo,
  #11 (permalink)  
Antiguo 17/02/2006, 10:35
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
mmmm ya pero si solo almaceno el nombre... luego como puedo mostrar por ejemplo esas fotos con querys a la base de datos... ¿¿anteponiendo una ruta al volcado del query??

saludos y gracias cluster me estas ayudando mucho!
  #12 (permalink)  
Antiguo 17/02/2006, 11:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por MindPaniC
mmmm ya pero si solo almaceno el nombre... luego como puedo mostrar por ejemplo esas fotos con querys a la base de datos... ¿¿anteponiendo una ruta al volcado del query??

saludos y gracias cluster me estas ayudando mucho!
Si. Sería algo tipo:

Código PHP:
<?
$ruta
="ruta/";
?>
<img src="<? echo $ruta.$row['imagen_nombre'?>">
Además piensa una cosa .. ¿que sentido tiene organizar archivos en directorios cuando ya usas una base de datos para gestionar sus nombres? .. sólo necesitas "clasificar" esos datos como guestes .. El hecho que estén todos los archivos en un sólo directorio tal vez te complique ver los archivos si entras por "FTP" a ese directorio, pero piensa que el objetivo NO es entrar por "FTP" a "tocar" esos archivos .. todo el manejo de esos archivos será controlado por tus scripts PHP que manejan tu BBBDD.

Un saludo,
  #13 (permalink)  
Antiguo 17/02/2006, 11:53
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
perfecto ya casi lo tengo.. es mas sencillo de lo que pensaba... ahora estoy liado con el campo de mysql fecha... tiene el tipo DATETIME. editado: eso ya esta tratado en otro lado.. gracias cluster
  #14 (permalink)  
Antiguo 17/02/2006, 12:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por MindPaniC
perfecto ya casi lo tengo.. es mas sencillo de lo que pensaba... ahora estoy liado con el campo de mysql fecha... tiene el tipo DATETIME. editado: eso ya esta tratado en otro lado.. gracias cluster
Y ya te dí mi opinión al respecto .. hay que usar SQL .. cuanto más mejor!. Se simplifican muchas cosas y se hace más independiente el trabajo con datos del lenguaje de programación que uses: PHP en estos casos.

Un saludo,
  #15 (permalink)  
Antiguo 17/02/2006, 12:36
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
no me funciona..

he probado y siempre me da el mismo fallo:
Cita:
Fatal error: Call to undefined function: now() in /home/mindpani/public_html/artistas/upload.php on line 84
Este es el Formulario:
Código HTML:
<h1>Introduce correctamente los datos del Artista</h1>
  <form enctype="multipart/form-data" action="upload.php" method="post">
  		<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
  		Upload this file: <input name="userfile" type="file">
     <table border="0">
      <tr>
        <td>Nombre Artistico</td>
         <td><input type="text" name="artnombre" maxlength="30" size="30"></td>
      </tr>
      <tr>
        <td>Biografia</td>
        <td><textarea name="artbio" cols="30" rows="10"></textarea></td>
      </tr>
      <tr>
        <td colspan="2"><input type="submit" value="Enviar Datos"></td>
      </tr>
    </table>
  </form> 

Esta es la parte correspondiente del script Upload.php:

Código PHP:
mysql_select_db('xxxxxxxxx');
  
$query "insert into artistas values 
            ('"
.$artnombre."', '".$artbio."', '".$userfile_name."', '".NOW()."')"
  
$result mysql_query($query);
  if (
$result)
      echo  
mysql_affected_rows().' Datos subidos con exito a la base de datos.'
al parecer... no he puesto bien el tema de la inserccion de datos en mysql... ¿como deberia ser?

saludos
  #16 (permalink)  
Antiguo 17/02/2006, 12:59
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Te dije que NOW() no es una función de PHP .. es de Mysql .. por ende no sé por qué la pones concatenada (con los .NOW(). .. así te haces referencia a función de PHP) o entre comillas .. NO es ni función PHP ni dato PHP ...

Código PHP:
<?
$query 
"insert into artistas values 
            ('"
.$artnombre."', '".$artbio."', '".$userfile_name."',NOW())"
  
$result mysql_query($query) or die (mysql_error());
Un saludo,
  #17 (permalink)  
Antiguo 17/02/2006, 13:10
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
CONSEGUIDOOOOOOO!!! genial .

Muchisimas gracias cluster por tu ayuda. el script funciona a la perfección.

saludos
  #18 (permalink)  
Antiguo 17/02/2006, 13:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
No estaría de más poner el código completo como te quedó para el que le pueda interesar.

Un saludo,
  #19 (permalink)  
Antiguo 17/02/2006, 13:55
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
ok este es el codigo para subir datos de texto junto con una imagen y guardar la info en una tabla en MySQL en este caso.

Formulario:
Código HTML:
<html>
<head>
  <title>Introduce un Nuevo Artista Colaborador</title>
</head>
<body>
  <h1>Introduce correctamente los datos del Artista</h1>
  <form enctype="multipart/form-data" action="upload.php" method="post">
  		<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
  		Upload this file: <input name="userfile" type="file">
     <table border="0">
      <tr>
        <td>Nombre Artistico</td>
         <td><input type="text" name="artnombre" maxlength="30" size="30"></td>
      </tr>
      <tr>
        <td>Biografia</td>
        <td><textarea name="artbio" cols="80" rows="20"></textarea></td>
      </tr>
      <tr>
        <td colspan="2"><input type="submit" value="Enviar Datos"></td>
      </tr>
    </table>
  </form>
</body>
</html> 
Scrip que hace upload y guarda los datos en MySQL
Código PHP:
<?php

  
// $userfile is where file went on webserver 
  
$userfile $HTTP_POST_FILES['userfile']['tmp_name'];

  
// $userfile_name Es el nombre original del archivo 
  
$userfile_name $HTTP_POST_FILES['userfile']['name'];

  
// $userfile_size Tamaño de en bytes
  
$userfile_size $HTTP_POST_FILES['userfile']['size'];

  
// $userfile_type controla el tipo mime ej: image/gif
  
$userfile_type $HTTP_POST_FILES['userfile']['type'];

  
// $userfile_error is any error encountered
  
$userfile_error $HTTP_POST_FILES['userfile']['error'];
  
// datos correspondientes a datos de texto para almacenar en mysql
  
$artnombre=$HTTP_POST_VARS['artnombre'];
  
$artbio=$HTTP_POST_VARS['artbio'];
  if (!
$artnombre || !$artbio)
  {
     echo 
'No has introducido todos los detos requeridos.<br />'
          
.'Por favor vuelve atras y rellena todas las casillas.';
     exit;
  }

  if (
$userfile_error 0)
  {
    echo 
'Problema: ';
    switch (
$userfile_error)
    {
      case 
1:  echo 'El archivo excede el: upload_max_filesize';  break;
      case 
2:  echo 'El archivo excede el: max_file_size';  break;
      case 
3:  echo 'El arcivo no se ha subido al completo';  break;
      case 
4:  echo 'No file uploaded';  break;
    }
    exit;
  }
// otro checkeo más: tiene el archivo el tipo MIME correcto?
  
if ( ($userfile_type != 'image/jpeg') AND ($userfile_type != 'image/gif') AND ($userfile_type != 'image/png') )
  {
    echo 
'Problema: El archivo no tiene el formato adecuado (jpeg, jpg, gif o png)';
    exit;
  }

// pon el archivo donde quieras
  
$upfile '/home/mindpani/public_html/artistas/fotos/'.$userfile_name;

// is_uploaded_file y move_uploaded_file añadido para la version 4.0.3 de php
  
if (is_uploaded_file($userfile)) 
  {
     if (!
move_uploaded_file($userfile$upfile))
     {
        echo 
'Problema: No se ha podido mover el archivo a el directorio de destino';
        exit;
     }
  } 
  else 
  {
    echo 
'Problema: Posible ataque en el upload. Archivo: '.$userfile_name;
    exit;
  }
  
  
$artnombre addslashes($artnombre);
  
$artbio addslashes($artbio);
  
$userfile_name addslashes($userfile_name);

  @ 
$db mysql_pconnect("localhost","tu_base_de_datos","tu_password");

  if (!
$db)
  {
     echo 
'Error: Could not connect to database.  Please try again later.';
     exit;
  }

  
mysql_select_db('tu_base_de_datos');
  
$query "insert into artistas values 
            ('','"
.$artnombre."', '".$artbio."', '".$userfile_name."',NOW())"
  
$result mysql_query($query);
  if (
$result)
      echo  
mysql_affected_rows().' Datos subidos con exito a la base de datos.'

?>
eso es todo... si me veis alguna vulnerabilidad o algo avisarme
  #20 (permalink)  
Antiguo 17/02/2006, 14:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Por mi parte veo algunos detallitos:

Deberías usar los arrays superglobales: $_POST .. $_FILES .. etc en lugar de los "no superglobales" $HTTP_XXX_XXX .. (es sólo cambiar el nombre .. y ganas en portabilidad del código e independencia de cierta configuración de PHP: register_globals .. dará igual si lo usas a ON o a OFF).

El tema de la validación del tipo de archivo (MIME) me agrada más la opción por usar un array y la función in_array():

Código PHP:
<? 
$mime_archivo
=$_FILES['archivo']['type']; 
$mimes_aceptados=array('image/jpeg','image/gif','image/png'); 
if (!
in_array($mime_archivo,$mimes_aceptados)){ 
   die (
"Tipo archivo no aceptado"); 
}
Por qué usas conexiones persistentes?:
@ $db = mysql_pconnect(...);

Si no está justificado .. es un gasto de consumos extra .. Las conexiones persistentes no son ilimitadas .. Ten cuidado! .. usa simplemente: mysql_connect() (conexiones no persistentes).


Esto es útil cuando no usas "magic_quote_gpc" a ON (como suele estar PHP por defecto):

$artnombre = addslashes($artnombre);
$artbio = addslashes($artbio);
$userfile_name = addslashes($userfile_name);

es decir .. añadir o "escapar" caracteres que podrían ocasionar problemas en SQL (inyección y demás).

Mejor usar la función:

mysql_real_escape_string()
http://www.php.net/mysql_real_escape_string

Revisa esta función .. tienes ejemplos para "asegurar" y protegerte de "inyección SQL" ..

Pregunta (como para ir mejorando el sistema):
¿Que haces si el registro no se pudo crear en tu BBDD? .. el archivo seguiría en tu servidor (por qué subió correctamente) .. Sería bueno en caso de error de conexión a tu BBDD . .de ejecución de tu sentencia SQL .. etc .. ahí eliminar el archivo (unlink()) o bien tener alguna otra forma de identificar el archivo (para evitarte volver a realizar el proceso de "upload" y poder asociarlo al registro que se tenga que crear).

Un saludo,
  #21 (permalink)  
Antiguo 17/02/2006, 14:34
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
mmmmmmm en realidad la mayoria del codigo lo he sacado de un libro que tengo (Desarrollo Web con PHP yMySQL) y bueno he ido copiando de aqui y de alli... al parecer deber ser algo antiguo y por eso aparecen esos arrays.. segun el libro para evitar posibles fallos en versiones antiguas o mal configuradas.

entonces seria asi no??
$HTTP_POST_FILES = $_FILES
$HTTP_POST_VARS = $_POST

y respecto a lo de addslashes() lo cambiare lo he leido y me ha dejado asustado el ejemplo de ataque de inyeccion que ponen.

Para el tema de si el registro se pudo o no crear en la base de datos solo me indica si se registraron... pero no si se registraron los datos... hay ya me has dejado K.O... ni idea de como comprobar si se han grabado correctamente o no... seria con esto verdad= mysql_affected_rows()

y bueno ya he modificado lo de la conexion permanente... estaba asi en el libro...
  #22 (permalink)  
Antiguo 17/02/2006, 14:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Para el tema de si el registro se pudo o no crear en la base de datos solo me indica si se registraron... pero no si se registraron los datos... hay ya me has dejado K.O... ni idea de como comprobar si se han grabado correctamente o no... seria con esto verdad= mysql_affected_rows()
Todas las funciones de Mysql son "booleanas" osea .. que devuelven un "false" si no se pueden ejecutar. Por ejemplo un mysql_connect() devuelve un "false" si no pudo conectarse .. mysql_select_db() lo mismo si no puede seleccionar la BBDD, .. mysql_query() idem pero para indicar que no se pudo ejecutar la consulta.

El mysql_affected_rows() podría servir para verificar cuantas "filas" fueron afectadas .. Como tu haces un "INSERT" .. teóricamente ahí siempre dirá "1" o "0" .. Pero antes pasa por la mismisima ejecución de mysql_query() .. así que para cuando llegues tu a ver con "_affeted_" .. lo más probable es que ya tengas un error antes. Esa función es útil cuando por ejemplo haces cosas como un "DELETE" a vários registros y quieres saber o comparar: "si intenté borrar N" .. que se "borranon N" .. no menos que eso.

A su vez el "@" se usa para elmininar los posibles mensajes de error que pueda original el código. No el error .. sino el "mensaje" .. el cual suele dar "pistas" sobre rutas de scritps y demás datos que no nos interesa que el usuario final vea (pero en "desarrollo" debemos ver para localizar problemas).

Por ende .. puedes hacer cosas como por ejemplo:

Código PHP:
<?
if (@mysql_connect(....))){
   if (!@
mysql_select_db(.....))){
      echo 
"No se puede seleccionar la BBDD";
      
// Y borras tu archivo con unlink() .. o ahí veras tu ... pero el archivo te quedará rondando por el servidor sin relación alguna con tu BBDD.
   
} else {
      if (@!
mysql_query(...)){
         echo 
"No se pudo ejecutar la consulta ... ";
         
// Y borras el archivo ...
      
}
   }
}
Más o menos sería eso .. Controlar gracias a que es un "boolean" que cada función se ejecute .. y si no se ejecuta, como subistes el archivo correctamente ya .. mejor borrarlo y que se repita el proceso de "upload" completo. Así no te quedaran colgando archivos en el servidor sin relación en tus BBDD.

Un saludo,
  #23 (permalink)  
Antiguo 17/02/2006, 17:06
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
Bueno este es el script final despues de arreglar lo que me acaba de mencionar Cluster. ahora esta comprobado y si algo falla despues del proceso de subida elimina el archivo.
Código PHP:
<?php

  
// $userfile is where file went on webserver 
  
$userfile=$_FILES['userfile']['tmp_name'];
  
// $userfile_name Es el nombre original del archivo 
  
$userfile_name=$_FILES['userfile']['name'];
  
// $userfile_size Tamaño de en bytes
  
$userfile_size=$_FILES['userfile']['size'];
  
// $userfile_type controla el tipo mime ej: image/gif
  
$userfile_type=$_FILES['userfile']['type'];
  
// $userfile_error is any error encountered
  
$userfile_error=$_FILES['userfile']['error'];
  
// datos correspondientes a datos de texto para almacenar en mysql
  
$artnombre=$_POST['artnombre'];
  
$artbio=$_POST['artbio'];
  if (!
$artnombre || !$artbio)
  {
     echo 
'No has introducido todos los detos requeridos.<br />'
          
.'Por favor vuelve atras y rellena todas las casillas.';
     exit;
  }
  if (
$userfile_error 0)
  {
    echo 
'Problema: ';
    switch (
$userfile_error)
    {
      case 
1:  echo 'El archivo excede el: upload_max_filesize';  break;
      case 
2:  echo 'El archivo excede el: max_file_size';  break;
      case 
3:  echo 'El arcivo no se ha subido al completo';  break;
      case 
4:  echo 'No file uploaded';  break;
    }
    exit;
  }
// otro checkeo más: tiene el archivo el tipo MIME correcto?
  
$userfile_type_aceptados=array('image/jpeg','image/jpg','image/gif','image/png');
  if (!
in_array($userfile_type,$userfile_type_aceptados))
  {
        echo 
'Problema: El archivo no tiene el formato adecuado (jpeg, jpg, gif o png)';
        exit;
  } 

// pon el archivo donde quieras
  
$upfile '/ruta/donde_quieres/dejar/tu/arcivo/'.$userfile_name;

// is_uploaded_file y move_uploaded_file añadido para la version 4.0.3 de php
  
if (is_uploaded_file($userfile)) 
  {
     if (!
move_uploaded_file($userfile$upfile))
     {
        echo 
'Problema: No se ha podido mover el archivo a el directorio de destino';
        exit;
     }
  } 
  else 
  {
    echo 
'Problema: Posible ataque en el upload. Archivo: '.$userfile_name;
    exit;
  }
  
$artnombre mysql_real_escape_string($artnombre);
  
$artbio mysql_real_escape_string($artbio);
  
$userfile_name mysql_real_escape_string($userfile_name);
//conectamos a la base de datos
  
$db mysql_connect("localhost","tu_base_de_datos","tu_password");
//comprobamos conexion a la base de datos
  
if (!$db)
  {     
     
unlink($upfile);    
     echo 
'Error: Could not connect to database. Please try again later.';
     exit;
  }
  
mysql_select_db('tu_base_de_datos');
if (!@
mysql_select_db('tu_base_de_datos'))
  {
      
unlink($upfile);
     echo 
'Error: Could not select to database.  Please try again later.';
     exit;
  }
  
$query "insert into artistas values 
            ('','"
.$artnombre."', '".$artbio."', '".$userfile_name."',NOW())"
  
$result mysql_query($query);
  if (!
$result)
  {
      
unlink($upfile);
     echo 
'Error: El query ha fallado.  Please try again later.';
     exit;
  } 
     echo  
mysql_affected_rows().' Datos subidos con exito a la base de datos.'

?>
saludos

Última edición por MindPaniC; 19/02/2006 a las 07:43
  #24 (permalink)  
Antiguo 18/02/2006, 14:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
mysql_select_db('tu_base_de_datos');
if (!@mysql_select_db('tu_base_de_datos'))
{

Eso es "redundante" .. estas seleccionando la BBDD dos veces .. usa la función en concreto que ya tienes en tu "if()" .. Como te comenté antes, si se consigue ejecutar esa función hará su proceso (devolviendo un "true") y si no .. un "false") actuando tu "if()" condicional en ese caso.

Un saludo,
  #25 (permalink)  
Antiguo 18/02/2006, 16:34
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
mmm no me habia fijado... muchas gracias cluster, ya lo he solucionado.

Última edición por MindPaniC; 19/02/2006 a las 07:47
  #26 (permalink)  
Antiguo 19/02/2006, 07:50
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
Por cierto me acabo de dar cuenta de que hay un problema, los datos pueden duplicarse en la BBDD y quiero evitar que se puedan duplicar ya que me puede ocasionar problemas al hacer querys y volcados.

¿como puedo comprobar si los datos que deseo introducir desde el formulario estan actualmente en la base de datos?

me parece que tengo que realizar primero la comprobacion de las variables pasadas por $_POST sobre los datos actuales de la BBDD y despues seguir el proceso de subida de archivo y luego grabar datos en BBDD... como se comprueban duplicidades de datos??

saludos
  #27 (permalink)  
Antiguo 20/02/2006, 06:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Las "duplicidades" es un concepto que tu defines en tu aplicación .. es decir .. par tí "doble" sería tener un nombre de archivo igual .. o un título .. o una descripción ..

En base a eso .. tan sólo debes hacer una consulta SQL prévia y ver si te arroja resultados o no.

Por ejemplo algo tipo:

Código PHP:
<?
$sql
="SELECT COUNT(*) FROM tabla WHERE campo='".$_POST['dato']."'";
$resultado=mysql_query($sql) or die (mysql_error());
$total=mysql_result($resultado,0);
if (
$total 0){
die (
"Registro duplicado ..."); // die("mensaje") es igual a echo "mensaje" + exit ...
}
Usando los operadores lógicos SQL (AND/OR) puedes ir componiendo tu validación en función de los campos que valides.

A todo esto se puede sumar como "seguridad" en la estructura de tus tablas de tus BBDD la propiedad a los campos "UNIQUE" .. con eso si un dato se duplica (exactamente igual) .. Mysql dará un bonito mensaje de error y no dejará ingresar el dato. En ese caso, la validación no sería por "contar" registros con esas coincidencias sino la de detectar ese tipo de error (que arroja un código característico) ..

Por mi parte prefiero "contar" registros (tralala xD) y por seguridad usar el "UNIQUE" .. sabiendo que por lo menos con mis scripts PHP nunca se debería producir dicho error (Por duplicado) pero si "meto" mano por "detras" a la BBDD por lo menos ahí me valida el motor de BBDD para que no meta la pata.

Un saludo,
  #28 (permalink)  
Antiguo 20/02/2006, 09:15
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
perfecto..

ahora solo me queda el configurar como mostrar los datos en pantalla en un principio seria mostrar los nombre de cada artista como links y luego al pulsar en ellos ver la ficha y foto de cada uno de ellos..

pero yo en esto tengo dudas ya que si se mostrar datos mediante querys, pero el tema de centralizar todo en una misma pagina y y que luego al seleccionar un artista genere una direccion dinamica mostrando la ficha de cada artista no se muy bien como va.

esta la lista de artistas, luego si pinchas encima de aluno de los artistas puedes ver su ficha.

si la direccion es por ejemplo artistas.com/artistas.php

y pulsas en manolito que tiene en la base de datos la id 4 como conseguiria esto?

artistas.com/artistas.php?id=4

Hay si que me pierdo.
  #29 (permalink)  
Antiguo 20/02/2006, 12:03
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues artistas.php lo que hace es recibir tu variable de "filtrado" y ejecutar tu sentencia SQL tipo:

Código PHP:
<?
$sql
="SELECT * FROM tabla WHERE id='".$_GET['id']."'";
Pero para eso antes generas tu listado de esa tabla con los links de esa forma:

Código PHP:
<?
$sql
="SELECT * FROM tabla";
$resultado=mysql_query($sql) or die (mysql_error());
while(
$row=mysql_fetch_array($resultado)){
  echo 
"Titulo: ".$row['campo']."<br>";
  echo 
"<a href=\"artistas.php?id=".$row['id']."\">Ver ficha</a><br>";
}
Un saludo,
  #30 (permalink)  
Antiguo 20/02/2006, 13:08
MindPaniC
Invitado
 
Mensajes: n/a
Puntos:
vale me genera la lista de artistas y al pichar encima de ellos aparece la direccion con el id de cada registro, pero al pinchar se queda donde esta.

ahora como planteo el resto del script. lo que busco es que genere todo en una misma pagina.

por ahora muestra la lista pero claro pulsas y no muestra nada por que no hay variables relacionadas con los campos de la base de datos... si pongo esas variables no se relacionarlas con una id... no me sale


dame alguna pista que ya me he quedao atascado.
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 23:57.