Memorizzare un'immagine in db mysql

  • Creatore Discussione Creatore Discussione vodka
  • Data di inizio Data di inizio
ciao
scusate, ma ho riletto tutti i post e c'è qualcosa che non mi torna
inizialmente parlate di header per visualizzare le immagini e, se non erro, utilizzate per visualizzarla
echo $row['immagine'];
poi nel prosequio utilizzate
....<img src="'.$row['immagine']......
nel primo caso si "dovrebbe" visualizzare l'immagine se l'immagine (i bit) sono contenuti nel relativo campo (ma non vedo un campo di tipo blob),
nel secondo ci dovrebbe essere l'eventuale percorso e nome del file immagine (infatti vedo solo campi tipo varchar)
ma puo darsi che le ultime libagioni mi abbiano offuscato:cool:
 
faccio un pò di chiarezza e posto un pò tutto il codice ke ho a disposizione... l'immagine viene salvata non in un campo blob ma in un campo text dove salvo il suo percorso..(non sò se l'ho salavato correttamente il percorso)

qui io spedisco i dati x la memorizzazione dei dati:
PHP:
<?php
	$emaildestinatario=$_POST['email'];
	if ($_POST['nome']!="" && $_POST['cognome']!="" && $_POST['email']!="")
	{
		if (@!ereg("^[^@ ]+@[^@ ]+\.[^@ \.]+$", $emaildestinatario)) 
		{
			echo "<script langage=\"Javascript\">window.alert('Questa $emaildestinatario non è una mail valida!');</script>";
			header ("Location: registrazione.php");
		}	
		else
		{
			echo "<script langage=\"Javascript\">window.alert('Registrazione avvenuta con successo!');</script>";
			include_once "E:\Program Files\EasyPHP-5.3.2i\apache\phpmailer\class.phpmailer.php"; 
			$Emailmessaggio = new PHPmailer(); 
			$Emailmessaggio->SetLanguage('it','language/');
			$Emailmessaggio->IsSMTP();  // send via SMTP 
			$Emailmessaggio->Host     = "smtp.tre.it";
			$Emailmessaggio->IsHTML(true);
			$Emailmessaggio->FromName= $_POST['nome']; 
			$Emailmessaggio->From='rocco.lillo1@gmail.com'; 
			$Emailmessaggio->AddAddress($_POST['email']);
			$Emailmessaggio->Subject='Registrazione';
			$Emailmessaggio->Body=stripslashes('Registrazione effettuata con successo!');
			if(!$Emailmessaggio->Send()){ //errore di trasmissione
				echo $Emailmessaggio->ErrorInfo; }
		}
	}
	else
	{
		echo "<script langage=\"Javascript\">window.alert('Registrazione fallita Completare tutti i campi!');</script>";
		header ("Location: registrazione.php"); 
	}
?>
<FORM enctype="multipart/form-data" METHOD="POST" ACTION="memorizzazione.php">
<fieldset>
<legend>Iscrizione ad un esame</legend>
<TABLE>
<BR>
<TR>
	<TD>Nome</TD><TD><INPUT TYPE="text" NAME="nome"></TD>
</TR>
<TR>
	<TD>Cognome</TD><TD><INPUT TYPE="text" NAME="cognome"></TD>
</TR>
<TR>
	<TD>Matricola</TD><TD><INPUT TYPE="text" NAME="matricola"></TD>
</TR>
<TR>
	<TD>Anno di iscrizione</TD><TD><INPUT TYPE="text" NAME="dataiscr"></TD>
</TR>
<TR>
	<TD><INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" value="1024000">
	<input type="file"  name="file_name" ></TD>
</TR>
<TR>
	<TD><INPUT TYPE="submit" value="Spedisci"></TD>
</TR>
</TABLE>
</fieldset>	
</FORM>

memorizzo i dati:
PHP:
<html>
	<head>
		<title>Memorizzazione del file sul server</title>
	</head>
	<FORM METHOD="POST" ACTION="visualizzadati.php" name="visualizzadati">
	<body>
	<?php

			$host='127.0.0.1';
		$user='mionome';
		$password='miapassword';
		$database='iscrizione_utente';
		$db=mysql_connect($host, $user, $password) or die ("Impossibile connettiersi al server $host!");
		mysql_select_db($database, $db) or die ("Impossibile connettersi al database $database!");

		$stringa_c=
		"CREATE TABLE IF NOT EXISTS foto (
			id_foto int(10) NOT NULL auto_increment,
			nome text not null , size text not null , type text not null, immagine text not null, PRIMARY KEY (`id_foto`))";
			
		mysql_query($stringa_c) or die (mysql_error());  

		@include 'upload.php';
		if (isset($_FILES['file_name']))
		{
		  upload();
		}

		mysql_close();
	
		//header ("Location: visualizzadati.php"); 

	if ($_POST['nome']!="" && $_POST['cognome']!="" && $_POST['matricola']!="" && $_POST['dataiscr']!="" )
	{
		$nome=trim($_POST['nome']);
		$cognome=trim($_POST['cognome']);
		$matricola=trim($_POST['matricola']);
		$dataiscr=trim($_POST['dataiscr']);

		$host='127.0.0.1';
		$user='mionome';
		$password='miapassword';
		$database='iscrizione_utente';
		$db=mysql_connect($host, $user, $password) or die ("Impossibile connettiersi al server $host!");
		mysql_select_db($database, $db) or die ("Impossibile connettersi al database $database!");

		$query= "INSERT INTO datiutente( nome, cognome, matricola, data_iscr) VALUES ('$nome', '$cognome', '$matricola', '$dataiscr')";
		mysql_query($query) or die (mysql_error()); 
		mysql_close($db);
		echo "<script langage=\"Javascript\">window.alert('Iscrizione avvenuta con successo, dati salvati!');</script>";

	}
	else
	{
		echo "<script langage=\"Javascript\">window.alert('Iscrizione fallita Completare tutti i campi!');</script>";
		header ("Location: iscrizione.php"); 
	}



	?><BR>
	</body>
	</FORM>
</html>

questa è la funzione upload:

PHP:
<?php
		function upload()
		{
		  $result = false;
		  $immagine = '';
		  $size = 0;
		  $type = '';
		  $nome = '';
		  $max_size = 300000;
		  $result = is_uploaded_file($_FILES['file_name']['tmp_name']);
		  if (!$result)
		  {
		
			echo "Impossibile eseguire l'upload.";
			return false;
		  }else{
			$size = $_FILES['file_name']['size'];
			if ($size > $max_size)
			{
			  echo "Il file è troppo grande.";
			  return false;
			}
			$type = $_FILES['file_name']['type'];
			$nome = $_FILES['file_name']['name'];
			$url="E:\Program Files\EasyPHP-5.3.2i\www" . "$_FILES['file_name']['name']";
			$immagine = $url;
			@include 'config.php';
			$sql = "INSERT INTO foto (nome, size, type, immagine) VALUES ('$nome','$size','$type','$immagine')";
			$result = mysql_query ($sql) or die (mysql_error());
			return true;
		  }
		}
?>

e con questo script dovrei visualizzare gli ultimi dati inseriti :

PHP:
<html>
	<head>
		<title>I tuoi dati</title>
	</head>
	<body>
		<div><H2>I DATI DA TE INSERITI:</H2><BR></div>
		<?php
				$host='127.0.0.1';
				$user='mionome';
				$password='miapassword';
				$database='iscrizione_utente';
				$db=mysql_connect($host, $user, $password) or die ("Impossibile connettiersi al server $host!");
				mysql_select_db($database, $db) or die ("Impossibile connettersi al database $database!");

				
				$ricevuta = mysql_query("SELECT * FROM datiutente ORDER BY id");

				$numero_record = mysql_num_rows($ricevuta);
				mysql_data_seek($ricevuta, $numero_record - 1);
				 
				$row = mysql_fetch_assoc($ricevuta);
				echo '<B>Nome:</B> ', $row['nome'], "<BR>\r";
				echo '<B>Cognome:</B> ', $row['cognome'], "<BR>\r";
				echo '<B>Matricola:</B> ', $row['matricola'], "<BR>\n";
				echo '<B>Anno:</B> ', $row['data_iscr'], "<BR><BR>\n";
				
				
				$ricevuta = mysql_query("SELECT * FROM foto ORDER BY id_foto");

				$numero_record = mysql_num_rows($ricevuta);
				mysql_data_seek($ricevuta, $numero_record - 1);
				 
				$row = mysql_fetch_assoc($ricevuta);
				var_dump($row['immagine']);
				echo "<B>La tua foto:</B> <BR><BR> <img src=\"{$row['immagine']}\" height=\"300\" width=\"100\" alt=\"immagine\" />";
				
				mysql_close($db);

	?>
	</body>
</html>

un'altro problema è ke ora alla pagina memorizzazione.php mi visualizza una pagina bianca.
Ho fatto un pò di confusione..Grazie se riuscite ad aiutarmi.
 
ciao
ho cominciato a dare un occhio e, secondo me ho wisto un errore dove usi l'url

nel file di upload

$url="E:\Program Files\EasyPHP-5.3.2i\www" . "$_FILES['file_name']['name']";
$immagine = $url;

dato che www è una cartella dovresti scrivere
$url="E:\Program Files\EasyPHP-5.3.2i\www\" . "$_FILES['file_name']['name']";

in questo modo nel campo 'immagine' ti ritrovi la stringa (es.)
"E:\Program Files\EasyPHP-5.3.2i\www\mia_immagine.jpg"
cioè il nome dell'immagine con il suo percorso

quindi quando la richiami con

echo "<B>La tua foto:</B> <BR><BR> <img src=\"{$row['immagine']}\" height=\"300\" width=\"100\" alt=\"immagine\" />";

non dovresti avere problemi in quanto $row['immagine'] contiene il nome dell'immagine con il suo percorso.

due osservazioni
1. perchè usi i percorsi assoluti? se poi carichi in remoto le pagine devi correggerli tutti
es.
se i file php sono nella root del sito (cartella www) e le immagini nella cartella immagini per l'url basta scrivere
$url="immagini/" . "$_FILES['file_name']['name']";

2. perchè ogni volta cerchi di creare la tabella del db, verificando che esista o no?
usualmente si fa una pagina apposita per creare tutte le tabelle necessarie e, una volta create le tabelle soprattutto in remoto, la pagina viene eliminata

prova a fare queste correzioni e poi sappimi dire
 
ho modifiicato il percorso ma ora alla pagina memorizzazione.php lo script si ferma e viene visualizzata una pagina bianca...può esserci un errore di invio dati dal dorm iscrizione.php?
 
la funzione upload non capisco xk ma nn veniva inclusa con @include 'upload.php', quindi ho incluso io direttamente il codice nel file ma al percorso dell'immagine mi dà errore:
$url = "E:\Program Files\EasyPHP-5.3.2i\www\" . "$_FILES['file_name']['name']";
Parse error: syntax error, unexpected T_VARIABLE in E:\Program Files\EasyPHP-5.3.2i\www\memorizzazione.php on line 72

anke mettendo il percorso relativo come mi hai suggerito mi dà errore.

Poi ho provato a forzare diciamo il percorso (scrivendolo direttamente io per intero es."E:\Program Files\EasyPHP-5.3.2i\www\mia_immagine.jpg") per provare se comunque poi l'immagine me la visuallizzava e invece i dati nel db li salva ma l'immagine poi non la visualizza comunque.
 
ciao
prima di tutto togli quella chiocciola (silent). non mi stancherò di dirlo ma (soprattutto in fase di prova) non vedi quali errori php ti restituisce
include 'upload.php';

poi, a parte il db; la foto viene caricata? anche se da quello che mi dici semprerebbe di sì
quale è la riga 72?
togli quelle virgolette
$url = "E:\Program Files\EasyPHP-5.3.2i\www\" . $_FILES['file_name']['name'];
 
mi dà errore nel modo in cui mi hai suggerito (Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in E:\Program Files\EasyPHP-5.3.2i\www\memorizzazione.php on line 72
) si la linea 72 sarebbe quella dell'url, se invece come ho detto prima forzo il percorso in modo ke lo scrivo io per testare se l'immagine la visualizza, quest'ultima viene caricata sul db ma nn visualizzata e mi compare sempre il riquadro con la x rossa
 
ciao, dimenticavo
hai fatto il copia/incolla di brutto di tutto il codice?, guarda che quella è una funzione quindi se copi tutto il codice da function upload() { sino a } dove devi usare la funzione devi mettere

PHP:
//....
$quello_che_da_il_return=upload();
//....
 
a giusto ma il problema resta il percorso ke mi dà errore come ti ho postato prima
 
ciao
stavo riguardando più approfonditamente i vari script. toglimi una curiosità: "ma dove li hai pescati?"
oltre ad altre cose non vedo dove carichi le foto, la funzione upload() verifica che l'immagina sia stata caricata in una cartella temporanea (e sin li non ci piove), ma poi dovresti avere qualcosa del genere
PHP:
$tmp_name = $_FILES['file_name']['tmp_name'];
$name = $_FILES['file_name']['name'];//oppure dargli un altro nome
//e la cartella dove salvi la foto se diversa
move_uploaded_file($tmp_name, "$uploads_dir/$name");
il tutto senza contare che non c'è qualcosa che leghi l'utente alla sua foto. quello che stai facendo (cioè selezionare) usando ORDER BY id e ORDER BY id_foto va bene (forse) solo se TUTTI gli utenti inseriscono assieme ai loro dati una foto, ma se un utente non mette una foto o (per xy motivi) elimini un utente ti può accadere che i due id non collimino più

io ripartirei da zero (ma può darsi che sbagli)
 
ho cercato un pò sul web qlk script x visualizzare l'immagine dal db xk è ciò ke nn riuscivo a fare il resto è ciò ke ho scritto io
 
ciao
ripartiamo da zero (cerco di capire cosa vuoi fare).
1. vuoi registrare degli utenti e ogni utente questo deve inserire
nome
cognome
numero di matricola (deve essere un valore unico?)
anno di iscrizione
una sua foto (solo una o più di una?)
2. l'utente visualizza i dati inseriti e se giusti li conferma
3. se confermati ti viene inviata una email con i dati e questi vengono registrati in un db
4. vuoi vedere (tu o l'utente) i dati inseriti

se sin qui è giusto fammi sapere.

p.s.
sarebbe opportuno che l'utente dovesse inserire anche il suo indirizzo email e una password (a meno che tu non voglia attribuire al numero di matricola la funzione di password)
 
diciamo ke è più o meno ciò ke hai detto tu ti spiego io meglio..

nella prima pagina inserisce nome cognome ed email per registrarsi (xkè altrimenti non può iscriversi) se la mail è giusta ed ha inseirto nome e cognome gli arriva una mail di conferma di registrazione e così può iscriversi immettendo nome cognome nr. di matricola (dell'università perckè sto simulando l'iscrizione all'università), anno di iscrizione e foto.

dopo aver inserito quindi i dati dell'iscrizione (nome cognome, nr. matricola, anno di nascita e foto) salva tutto ciò in un database e nella pagina successiva vengono riportati i dati inseiriti dall'utente compresa la visualizzazione della sua foto.


La foto da inserire deve essere una e la matricola deve essere semplicemente un numero.
 
Lasciando perdere tutto il funzionamento di questi script nel loro complesso, ciò ke mi interessa è estrarre un'immagine dal db.
Quindi vorrei sapere, avendo memorizzato il percorso del file nel db nel campo foto quindi ad es. C:\Users\Public\Pictures\Sample Pictures\io.jpg quali istruzioni devo scrivere per poter visualizzare questa immagine?
 
Devi fare una cosa del genere:
PHP:
<?php
// ti connetti al database
mysql_connect('localhost', 'root') or die(mysql_error());
mysql_select_db('database') or die(mysql_error());

// esegui la query SQL
$sql = 'SELECT foto FROM tabella';
$query = mysql_query($sql) or die(mysql_error());

// estrai i dati in $row
$row = mysql_fetch_assoc($query);

// visualizzi l'immagine
echo "<img src=\"{$row['foto']}\" />";
?>
Ovviamente devi aggiungere alla query una condizione WHERE in modo che estrapoli solamente una riga dal database. In questo modo visualizzerà l'immagine del primo record.
 
non mi visualizza l'immagine neanke così e nn mi dà nessun errore...mi visualizza solo un piccolo riquadro con un'immagine spezzata.
 

Discussioni simili