Hej hej wF'are!
Var ett tag sedan jag skrev här men jag hoppas att ni, som alltid annars, kan hjälpa mig.
Jag har ett nyhets/artikelscript där man kan ladda upp en bild, skriva en text och en rubrik. Problemet ligger i bilduppladdningen.
Scriptet jag använder är hämtat och jag har ändrat lite på det själv. Men iaf, det är så att när man laddar upp bilden så ändras namnet till det man skrev i rubriken. Jag vill ha så att "uppladdningsnamnet" eller namnet som bilden har lokalt på min dator är detsamma som efter att man skickat upp den, det ska alltså inte ändras. Hur gör man detta?
Och så lite kod...
<?PHP
mysql_connect("leheh", "trodde", "du"); /*Kontaktar databasen*/
mysql_select_db ("va"); /*Väljer databas */
$bildnamn = $_POST['namn'];
$pic = "bilder/".$bildnamn.".jpg";
$query = "INSERT INTO t_article (header, pic, text, av, date) values ('$_POST[namn]', '$pic', '$_POST[text]', '$_POST[av]', now())";
if (mysql_query($query)){
$image = $_FILES['bild'];
$size = getimagesize($image['tmp_name']);
$width = $size[0];
$height = $size[1];
if($width > 400 or $height > 600){
echo "Bilden är för stor! Max storleken är 400x600 pixlar.<br />";
echo "Bilden du laddade upp är <b>";
echo $width;
echo "</b>x<b>";
echo $height;
echo "</b><br />";
}
else {
move_uploaded_file($image['tmp_name'], $pic);
echo "Artikeln har laddats upp!<br>";
echo "<br /><a href='view_article.php'>kolla bilder</a>";
}
header('location: ladda_upp.php');
}
else{
print(mysql_error());
}
mysql_close();
?>
MatteMedlem sedan aug. 20002 975 inlägg $pic = "bilder/".$_FILES['bild']['name'];
Men du bör nog vänta med att spara till databasen tills du konstaterat att bilden har rätt storlek, annars sparar du en uppgift om en bild som aldrig blivit lagrad på servern.
Och varför kopiera över $_FILES['bild'] till $image?
Detta tar bara en massa extra av servern, utan att tillföra skriptet någon som helst förenkling.
Tack du!! Det blev mkt bra!
Nu till mitt andra problem...
Från början heter ju input'en för header namn och den för bilden heter bild. Men nu vill jag byta namn på dessa till header resp. pic. Men när jag byter namn på dessa två, både i koden för formuläret och i koden för uppladdning funkar inte detta...
Här nedan kan ni jämföra kod som fungerar med kod som inte fungerar.
Fungerande:
$bildnamn = $_POST['namn'];
$pic = "bilder/".$_FILES['bild']['name'];
$query = "INSERT INTO t_article (header, pic, text, av, date) values ('$_POST[namn]', '$pic', '$_POST[text]', '$_POST[av]', now())";
if (mysql_query($query)){
$size = getimagesize($_FILES['bild']['tmp_name']);
$width = $size[0];
$height = $size[1];
if($width > 400 or $height > 600){
echo "Bilden är för stor! Max storleken är 400x600 pixlar.<br />";
echo "Bilden du laddade upp är <b>";
echo $width;
echo "</b>x<b>";
echo $height;
echo "</b><br />";
}
else {
move_uploaded_file($_FILES['bild']['tmp_name'], $pic);
echo "Artikeln har laddats upp!<br>";
echo "<br /><a href='view_article.php'>kolla bilder</a>";
}
header('location: ladda_upp.php');
}
else{
print(mysql_error());
}
mysql_close();
Ej fungerande:
$bildnamn = $_POST['header'];
$pic = "bilder/".$_FILES['pic']['name'];
$query = "INSERT INTO t_article (header, pic, text, av, date) values ('$_POST[header]', '$pic', '$_POST[text]', '$_POST[av]', now())";
if (mysql_query($query)){
$size = getimagesize($_FILES['pic']['tmp_name']);
$width = $size[0];
$height = $size[1];
if($width > 400 or $height > 600){
echo "Bilden är för stor! Max storleken är 400x600 pixlar.<br />";
echo "Bilden du laddade upp är <b>";
echo $width;
echo "</b>x<b>";
echo $height;
echo "</b><br />";
}
else {
move_uploaded_file($_FILES['pic']['tmp_name'], $pic);
echo "Artikeln har laddats upp!<br>";
echo "<br /><a href='view_article.php'>kolla bilder</a>";
}
header('location: ladda_upp.php');
}
else{
print(mysql_error());
}
mysql_close();
Formulärkoden ser ut så här:
<form action="put_article.php" method="post" enctype="multipart/form-data">
<label>Rubrik:</label><input type="text" name="namn" /><br />
<label>Bild:</label><input type="file" name="bild" /><br />
<label>Text:</label><textarea name="text"></textarea><br />
<label>Publicerad av:</label><input type="text" name="av" /><br />
<input type="submit" value="Lägg till artikel" /><br />
<input type="hidden" name="MAX_FILE_SIZE" value="960000" />
</form>
Jag vill alltså byta namn på input'arna som heter namn och bild...
Någon som vet var felet ligger?
@ndersMedlem sedan juni 200032 969 inlägg På vilket sätt fungerar det inte? Felmeddelande?
I övrigt: fungerar verkligen din SQL-fråga?
Ja min SQL-fråga fungerar. Men om jag byter namn på inputarna till något annat så funkar inte dessa två... :S Dock alla andra.
Varför är du tveksam om SQL-frågan?
MatteMedlem sedan aug. 20002 975 inlägg Eftersom du har <input type="file" name="bild" />, så finns endast en $_FILES['bild'].
Ska du arbeta med $_FILES['pic'] så får du ändra till <input type="file" name="pic" />.
@ndersMedlem sedan juni 200032 969 inlägg
nummersju skrev:
Varför är du tveksam om SQL-frågan?
Antagligen är det inget fel på den, utan snarare på mina php-kunskaper, men jag tycker att det ser felaktigt ut när du har $_POST[header] (ex.) i SQL-frågan, utan att ha apostrofer runt fältnamnet header i post-arrayen.
MatteMedlem sedan aug. 20002 975 inlägg @nders.
Det är undantaget som bekräftar regeln att array-index alltid ska vara omgivna av strängbegränsare (apostrofer/citationstecken).
Tre godkända sätt att skriva samma sak:
echo "abc ".$array['index']." def";
echo "abc {$array['index']} def";
echo "abc $array[index] def";
Själv brukar jag undvika den tredje varianten då den avviker från övriga tillfällen då man använder array-index.
@ndersMedlem sedan juni 200032 969 inlägg Så trevligt, tack Matte. :)
Matte skrev:
Eftersom du har <input type="file" name="bild" />, så finns endast en $_FILES['bild'].
Ska du arbeta med $_FILES['pic'] så får du ändra till <input type="file" name="pic" />.
Ja men det är det jag menar. Att om jag även byter namn på min input till "pic" och även i den andra php-koden så fungerar det inte. Det fungerar bara om det står bild.
Vad kan vara fel?
MatteMedlem sedan aug. 20002 975 inlägg Har du name="pic" i ditt file-fält då har du också $_FILES['pic'] i koden som tar emot.
För att se vad formuläret skickar kan du köra följande kod i skriptet som tar emot formuläret:
echo '<pre>$_FILES: ';
print_r($_FILES);
echo '$_POST: ';
print_r($_POST);
echo '</pre>';
Nu fungerar allt utan problem!
Vet ej, det där med värden gick helt plötsligt att ändra. Kan ju kanske vara att jag inte hade ändrat på precis alla ställen tidigare. Men nu funkar det klockrent!
Matte (!) du nämde tidigare att jag skulle vänta med att skicka till databasen innan jag kollat att bilden är av rätt storlek... Efter lite eftertanke kom jag på att det är ganska viktigt ju :)
SKulle du kunna hjälpa mig lite på hur jag ska ändra? Försökte ändra om lite i if-satserna men fick det inte att fungera.
MatteMedlem sedan aug. 20002 975 inlägg Testa något i stil med:
$pic = '';
if (is_uploaded_file($_FILES['bild']['tmp_name'])) {
$size = @getimagesize($_FILES['bild']['tmp_name']);
if ($size === false) {
echo "Den uppladdade filen {$_FILES['bild']['name']} är ingen bild!<br />";
} elseif ($size[0] > 400 || $size[1] > 600) {
echo "
Bilden är för stor! Max storleken är 400x600 pixlar.<br />
Bilden du laddade upp är <b>$size[0]</b>x<b>$size[1]</b><br />!
";
} else {
$pic = 'bilder/'.$_FILES['bild']['name'];
move_uploaded_file($_FILES['bild']['tmp_name'], $pic);
}
}
$query = "
INSERT INTO t_article (header, pic, text, av, date)
VALUES ('$_POST[namn]', '$pic', '$_POST[text]', '$_POST[av]', NOW())
";
if (mysql_query($query)) {
echo '
Artikeln har laddats upp!<br /><br />
<a href="view_article.php">kolla bilder</a>
';
}
Tackar! Accepterar detta som slutgiltigt svar