Archief - Probleem bij image wegschrijven

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

brecko

Legacy Member
Kan iemand mij even bij het volgende stukje code?
Ik probeer een user te laten registreren, en daarbij de gebruiker zijn afbeelding te laten kiezen.

PHP:
<?php 
// Connects to your Database 
mysql_connect("localhost", "root", "root") or die(mysql_error()); 
mysql_select_db("Data") or die(mysql_error()); 

//This code runs if the form has been submitted
if (isset($_POST['submit'])) { 

//This makes sure they did not leave any fields blank
if (!$_POST['userNAME'] | !$_POST['userPASSWORD'] | !$_POST['pass2'] ) {
die('You did not complete all of the required fields');
}

// checks if the userNAME is in use
if (!get_magic_quotes_gpc()) {
$_POST['userNAME'] = addslashes($_POST['userNAME']);
}
$usercheck = $_POST['userNAME'];
$check = mysql_query("SELECT userNAME FROM tblUSERS WHERE userNAME = '$usercheck'") 
or die(mysql_error());
$check2 = mysql_num_rows($check);

//if the name exists it gives an error
if ($check2 != 0) {
die('Sorry, the userNAME '.$_POST['userNAME'].' is already in use.');
}

// this makes sure both passwords entered match
if ($_POST['userPASSWORD'] != $_POST['pass2']) {
die('Your passwords did not match. ');
}

// here we encrypt the password and add slashes if needed
$_POST['userPASSWORD'] = md5($_POST['userPASSWORD']);
if (!get_magic_quotes_gpc()) {
$_POST['userPASSWORD'] = addslashes($_POST['userPASSWORD']);
$_POST['userNAME'] = addslashes($_POST['userNAME']);
}

$target = "img/users/"; 
$target = $target . basename( $_FILES['userIMAGE']['name']);

$userimg = ($_FILES['userIMAGE']['name']);

// now we insert it into the database


$insert = "INSERT INTO tblUSERS (userNAME, userPASSWORD, userIMAGE) VALUES ('".$_POST['userNAME']."', '".$_POST['userPASSWORD']."', '$userimg')";
$add_member = mysql_query($insert);

 //Writes the photo to the server 
if(move_uploaded_file($_FILES['userIMAGE']['tmp_name'], $target)) 
{ 

//Tells you if its all ok 
echo "The data and the file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded, and your information has been added to the directory"; 
} 
else { 
//Gives and error if its not 
echo "You have selected no image."; 
} 
mysql_close($link) or die(mysql_error());

?>



?>


<h1>Registered</h1>
<p>Thank you, you have registered - you may now login</a>.</p>
<a href="index.php" class="smallLink">Return to the homepage</a>

<?php 
} 
else 
{	
?>


<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table border="0">
<tr><td>Kies een gebruikersnaam:</td><td>
<input type="text" name="userNAME" maxlength="60">
</td></tr>
<tr><td>Paswoord:</td><td>
<input type="password" name="userPASSWORD" id="registerPass1" maxlength="10">
</td><td><p id="foo"></p></td></tr>
<tr><td>Bevestig paswoord:</td><td>
<input type="password" name="pass2" id="registerPass2" maxlength="10">
</td></tr>
<tr><td>Kies een afbeelding:</td><td>
<input type="file" name="userIMAGE" />
</td></tr>
<tr><td></td><td colspan=2><input class="btnSmall" type="submit" name="submit" value="Register"></td></tr> </table>

</form>

<?php
}
?>

Wanneer ik in mijn form een afbeelding selecteer, krijg ik echter de error dat ik geen image gekozen heb. Eerder lukte het wel, maar omdat ik daar problemen had bij het wegschrijven naar mijn HD, heb ik een aantal zaken zitten aanpassen, en nu vind ik de juiste code niet meer terug!

Ziet er iemand mijn fout?

Alvast bedankt!

Zero Grav

Legacy Member
Wegens nogal verouderd en dergelijke heb ik even een variatie op uw code gemaakt.

http://pastebin.com/m57fdecaf

Code:
<?php

#Bij errors de input opslaan in een sessie
session_start();

#De instellingen voor de databank
$dbHost = "localhost";
$dbLogin = "*****";
$dbPassword = "*****";
$dbTable = "*****";

#de instellingen voor de afbeeldingen
$maxImageSize = "1"; #grootte in megabyte
$imageLocation = "img/users/";
$toegelatenExtensies = Array('image/pjpeg', 'image/jpeg'); #opzoeken via mime-type

if($_SERVER['REQUEST_METHOD'] == "POST") {
	#zorgen dat de errors die vorige keer misschien ingesteld zijn nu niet meer geldig zijn
	unset($_SESSION['registerForm']);
	#de ingevoerde gegevens opslaan in een sessie
	$_SESSION['registerForm']['data'] = $_POST;
	$_SESSION['registerForm']['file'] = $_FILES['avatar'];
	
	#datavalidatie
	if(strlen($_SESSION['registerForm']['data']['userName']) < 3) {
		$_SESSION['registerForm']['error'][] = "Je gebruikersnaam moet langer dan 3 karakters zijn";
	}
	if(strlen($_SESSION['registerForm']['data']['userPassword']) < 7 || strlen($_SESSION['registerForm']['data']['userPasswordConfirm']) < 7) {
		$_SESSION['registerForm']['error'][] = "Je wachtwoord moet minstens 7 karakters bevatten";
	}
	if($_SESSION['registerForm']['data']['userPassword'] != $_SESSION['registerForm']['data']['userPasswordConfirm']) {
		$_SESSION['registerForm']['error'][] = "Je moet tweemaal hetzelfde wachtwoord invoeren";
	}
	#afbeeldingvalidatie
	if($_SESSION['registerForm']['file']['error'] == 4) {
		$_SESSION['registerForm']['error'][] = "Je moet een afbeelding uploaden";
	}
	if(!in_array($_SESSION['registerForm']['file']['type'], $toegelatenExtensies)) {
		$_SESSION['registerForm']['error'][] = "Je afbeelding moet een jpeg zijn";
	}
	#bestandsgrootte groter dan megabytes in bytes? (1 * 1024 * 1024)
	if($_SESSION['registerForm']['file']['size'] > ($maxImageSize * 1024 * 2014)) {
		$_SESSION['registerForm']['error'][] = "Je afbeelding mag niet groter dan 1MB zijn.";
	}
	
	
	if(isSet($_SESSION['registerForm']['error'])) {
		header("Location: ".$_SERVER['PHP_SELF']);
	} else {
		#beginnen met de data op te slaan en weg te schrijven
		
		#databaseconnectie aanmaken
		$dbconn = new mysqli($dbHost, $dbLogin, $dbPassword, $dbTable);
		
		if(mysqli_connect_error()) {
			$error = "Er kon geen verbinding met de databank worden gemaakt.<br />";
			$error .= mysqli_connect_errno() . ": " . mysqli_connect_error();
		
			die( $error );
		} else {
			$qry = "SELECT COUNT(userNAME) FROM tblUSERS WHERE userNAME = ?";
			$userName = $dbconn->real_escape_string($_SESSION['registerForm']['data']['userName']);
			if($stmt = $dbconn->prepare($qry)) {
				$stmt->bind_param("s", $userName);
				
				if($stmt->execute()) {
					$stmt->bind_result( $aantal );
					$stmt->store_result();
					$stmt->fetch();
					 
				 	if( $aantal > 0) {
				 		$_SESSION['registerForm']['error'][] = "Deze gebruikersnaam bestaat al";
				 		header("Location: ".$_SERVER['PHP_SELF']);
					} else {
						#afbeelding wegschrijven
						if(!is_dir($imageLocation)) {
							mkdir($imageLocation, "0777");
						}
						#zo random mogelijke naam aanmaken, anders ga je afbeeldingen met dezelfde naam krijgen die elkaar overschrijven
						#md5 is hier ook niet bepaald de beste methode voor omdat 2 verschillende combinaties nog steeds dezelfde hash kunnen
						#kunnen hebben
						$doelNaam = md5(date("Hisu") . $_SESSION['registerForm']['file']['name'] . rand(0, 999999)).".jpg";
						if(move_uploaded_file($_SESSION['registerForm']['file']['tmp_name'], $imageLocation.$doelNaam )) {
							$qry = "INSERT INTO tblUSERS (userNAME, userPASSWORD, userIMAGE) VALUES (?, ?, ?)";
							if($stmt = $dbconn->prepare($qry)) {
								$userPassword = md5($dbconn->real_escape_string($_SESSION['registerForm']['data']['userPassword']));

								$stmt->bind_param("sss", $userName, $userPassword, $doelNaam);
								
								if($stmt->execute()) {
									unset($_SESSION['registerForm']);
									?>
									
									<h1>Registered</h1> 
									<p>Thank you, you have registered - you may now login</a>.</p> 
									<a href="index.php" class="smallLink">Return to the homepage</a> 
									
									<?php
								} else {
									echo $stmt->error();
								}
							} else {
								echo $stmt->error();
							}
						} else {
							$_SESSION['registerForm']['error'][] = "Uw afbeelding kon niet worden opgeslagen";
						        header("Location: ".$_SERVER['PHP_SELF']);
						}
					}
				} else {
					echo $stmt->error();
				}
			} else {
				echo $stmt->error();
			}
		}
	}
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Form met afbeeldingen uploaden</title>

<style type="text/css" media="all">
<!--

body {
	font-family: verdana, arial, sans-serif;
	font-size: 11px;
}

label {
	display: block;
	width: 190px;
	float: left;
}

input {
	float: left;
}

input[type=file] {
	width: 150px;
}

form {
	display: inline-block;
}

form br {
	clear:  both;
}

legend + label, legend + label + input {
	margin-top: 10px;
}

-->
</style>

</head>

<body>

<?php

if(!isSet($_POST['submit'])) {
	?>
	<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype=" multipart/form-data"> 
		<fieldset>
		<legend>Registreren met een afbeelding</legend>
		
		<label for="gebruikersnaam">Kies een gebruikersnaam:</label>
			<input type="text" name="userName" maxlength="60" value="<?php echo $_SESSION['registerForm']['data']['userName']; ?>" />
		<br />
		
		<label for="paswoord">Kies een wachtwoord:</label>
			<input type="password" name="userPassword" maxlength="10" />
		<br />
		
		<label for="paswoordConfirm">Bevestig je wachtwoord:</label>
			<input type="password" name="userPasswordConfirm" maxlength="10" />
		<br />
		
		<label for="avatar">Kies een afbeelding:</label>
			<input type="file" name="avatar" />
		<br />
		
		<input type="submit" class="btnSmall" name="submit" value="Registreren" />
		
		</fieldset>
	</form>
	<?php
	
	if(count($_SESSION['registerForm']['error']) > 0) {
		?>
		<div id="errors">
			<ul>
			<?php
				foreach ($_SESSION['registerForm']['error'] as $error) {
					echo "<li>".$error."</li>";
				}
			?>
			</ul>
		</div>
		<?php
	}
}
?>

</body>
</html>

En ook altijd gemakkelijk moest iemand het willen gebruiken, de tabel.

Code:
-- phpMyAdmin SQL Dump
-- version 3.1.3
-- http://www.phpmyadmin.net
--
-- Machine: localhost
-- Genereertijd: 22 Aug 2009 om 01:44
-- Serverversie: 5.0.67
-- PHP-Versie: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `testUpload`
--
CREATE DATABASE `testUpload` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
USE `testUpload`;

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `tblUSERS`
--

CREATE TABLE IF NOT EXISTS `tblUSERS` (
  `userNAME` varchar(60) collate utf8_unicode_ci NOT NULL,
  `userPASSWORD` varchar(32) collate utf8_unicode_ci NOT NULL,
  `userIMAGE` varchar(36) collate utf8_unicode_ci NOT NULL,
  UNIQUE KEY `userNAME` (`userNAME`,`userIMAGE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

JJT-Development

Legacy Member
de enige echte fout dat brecko gemaakt had was in zijn form het volgende vergeten:
enctype=" multipart/form-data" (zorgt er voor dat je ook bestanden kunt op sturen met de form)

maar gebruik idd maar het scriptje hierboven mij, daar zal je ene pak verder mee komen

Curahee Q

Legacy Member
En zelfs daar kan nog een verbetering aangebracht worden. Checken of een button is ingedrukt in php is fout!

if($_SERVER['REQUEST_METHOD'] == 'post') {

}

Dat is juist.

Zero Grav

Legacy Member
'k Heb het even aangepast, bedankt Curahee Q. Er zullen wellicht nog wel een paar dingen in zitten die niet erg veilig zijn, zo php-savvy ben ik niet. :)

brecko

Legacy Member
Immens bedankt ZeroGrav!
Hiermee heb ik het eindelijk aan de praat gekregen!

Waar ik nu nog wel een probleem mee heb, is de afbeelding te laten weergeven (bij de ledenlijst). In mijn oude code deed ik dit alsvolgt:

PHP:
<?php 
// Connects to your Database 
mysql_connect("localhost", "root", "root") or die(mysql_error()); 
mysql_select_db("Data") or die(mysql_error()); 
$data = mysql_query("SELECT * FROM tblUSERS") 
or die(mysql_error()); 

if($data != null)
{
echo "<div id='users'>";

while($info = mysql_fetch_array( $data )) 
{ 
echo "<div class='oneUser'>";
if ($info['userIMAGE'] != null)	{
	echo "<div class='oneUser_image'>";
	echo "<img class='thumb' src=http://localhost/img/users/".$info['userIMAGE'] .">";
	echo "</div>";}	
	
else	{
	echo "<div class='oneUser_image'>";
	echo "<img class='thumb' src='http://localhost/img/noimage.png'>";
	echo "</div>";
}
echo "<div class='oneUser_name'>".$info['userNAME'] . " </div>";
echo "</div>";
} 
echo "</div>";


}

else	{
 echo "<h2>Er werden nog geen gegevens ingevoerd..</h2>";
} 
?>

Aangezien de afbeelding nu met een random naam wordt opgeslagen,
hoe geef je die dan weer? Want zoals mijn code nu is, klopt het pad naar de afbeelding niet..


Merci alvast!!

Curahee Q

Legacy Member
Gebruik voor echo een single quote, html attributes verwachten namelijke dubbele quotes...

Dus
echo "<div class='oneUser_image'>";

wordt
echo '<div class="oneUser_image">';

brecko

Legacy Member
Ok, nu klopt de link al min of meer, enkel de extensie staat er nog niet achter!
Hoe doe ik dat op een correcte manier?

EDIT: Ik heb volgende regel aangepast:

PHP:
echo '<img class="thumb" src="http://localhost/img/users/'.$info['userIMAGE'].'.jpg">';

Nu klopt de link nochtans, maar nog steeds geen afbeelding te zien..

http://i25.tinypic.com/ok4od3.jpg

De afbeelding is nochtans goed opgeslagen.

http://i29.tinypic.com/swuzwh.jpg


EDIT 2: Fixed

Ik had te weinig characterlengte voorzien in mijn tabel :)
Daardoor werd de .jpg niet mee opgeslagen. Daarna heb ik die regel van hierboven ook terug aangepast. En nu werkt het.

Wat een achterlijke fout :)

Zero Grav

Legacy Member
Probeer wel die "http://localhost" te vermijden. Als ge die site nu op een host zoudt zetten dan zou het niet werken. Tegen als ge met een relatief pad werkt "img/users/.." kunt ge het overal gebruiken.

brecko

Legacy Member
't Is voor een schoolproject, wordt niet online gezwierd :)
Maar heel erg bedankt allemaal!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan