Thread: thumbnailer bij edit in cms
-
28-06-2010, 14:41 #1
thumbnailer bij edit in cms
Hey iedereen
Ik zit met een klein probleem i.v.m. de edit-functie in mijn CMS-script.
Eerste en vooral : ik heb php geleerd door zelf veel uit te vinden, te zoeken, te lezen etc. Mijn manier van werken en schrijven zal dus waarschijnlijk enkele mensen grijs haar bezorgen
PHP Code:
/* Edit huidige actie berichten */
if($action == "edit") {
$resultaat = mysql_query("SELECT * FROM ".$table." WHERE ID=".$id."");
while ($row = mysql_fetch_object($resultaat)) {
$edit_naam = "".$row->auteur."";
$edit_titel_nl = "".$row->titel_nl."";
$edit_datum = "".$row->datum."";
$edit_bericht_nl = "".$row->bericht_nl."";
$edit_status = "".$row->status."";
$edit_img_omschrijving = "".$row->fotoalt."";
$edit_foto = "".$row->foto."";
}
if($_SERVER["REQUEST_METHOD"] == 'POST') {
/* Variables voor textarea en textfields */
$titel_nl = escape_quotes($_POST['titel_nl']);
$auteur = $_SESSION['s_gebruiker'];
$datum = escape_quotes($_POST['datum']);
$bericht_nl = escape_quotes($_POST['bericht_nl']);
$status = $_POST['status'];
$img_omschrijving = escape_quotes($_POST['img_omschrijving']);
/* Variables voor file upload */
$bestand_naam = $_FILES['bestandsnaam']['name'];
$bestand_grootte = $_FILES['betandsnaam']['size'];
$bestand_temp = $_FILES['bestandsnaam']['tmp_name'];
$bestand_type = strrchr($bestand_naam,'.');
$extensie = strtolower($bestand_type);
$map = "uploads/acties/";
$thumbm = "thumbs/";
$doelmap = $map.basename( $_FILES['bestandsnaam']['name']);
$thumbmap = $map.$thumbm.basename( $_FILES['bestandsnaam']['name']);
$max_grootte = 2097152;
$toegestane_bestandsextensies = array('.jpg','.jpeg','.gif','.png','.PNG','.JPEG','.GIF',);
$th_breedte = 200;
$th_hoogte = 200;
$thumb_extensies = array(".jpg",".png",".jpeg",".bmp");
$kwaliteit = 75;
/* Errors voor textarea en textfields */
if(empty($titel_nl)) { $error = "<p class=\"warning\">Gelieve een juiste titel voor dit bericht in te geven.</p>"; }
if(empty($datum)) { $error .= "<p class=\"warning\">Gelieve een datum voor dit bericht te kiezen.</p>"; }
if(empty($bericht_nl)) { $error .= "<p class=\"warning\">Gelieve de inhoud voor dit bericht in te geven.</p>"; }
if(!isset($status)) { $error .= "<p class=\"warning\">Gelieve aan te duiden of dit bericht een kladversie is of het gepubliceerd mag worden.</p>"; }
if(empty($error)) {
if(empty($bestand_naam)) {
$sql = mysql_query("UPDATE ".$table." SET titel_nl ='".$titel_nl."', auteur ='".$auteur."', datum ='".$datum."', bericht_nl ='".$bericht_nl."', status='".$status."', fotoalt='".$img_omschrijving."' WHERE ID='".$id."'") or die(mysql_error());
$error = "<p class=\"berichtOK\">Uw actie werd aangepast.</p>";
header("Location: index.php?page=".$page."&sub=".$sub."");
}else{
thumbnailer($bestand_temp, $extensie, $th_breedte, $th_hoogte, $thumbmap, $kwaliteit, $thumb_extensies);
$image_location = "uploads/acties/";
$thumbs_location = "uploads/acties/thumbs/";
// $name = $row->naam;
$thumb_name = $edit_foto;
// $deldoel = realpath ("".$images_location.$name."");
$deldoel_thumb = realpath ("".$thumbs_location.$thumb_name."");
// if (file_exists($deldoel)) unlink($deldoel);
if (file_exists($deldoel_thumb)) unlink($deldoel_thumb);
$sql = mysql_query("UPDATE ".$table." SET titel_nl ='".$titel_nl."', auteur ='".$auteur."', datum ='".$datum."', bericht_nl ='".$bericht_nl."', status='".$status."', fotoalt='".$img_omschrijving."', foto='".$bestand_naam."' WHERE ID='".$id."'") or die("<p class=\"warning\">De gegevens konden niet worden gewijzigd. Indien dit een blijvend probleem is, neem contact op via bram@bubblefish.be</p>");
$error = "<p class=\"berichtOK\">Uw actie werd aangepast.</p>";
header("Location: index.php?page=".$page."&sub=".$sub."");
}
}
}
}
Het probleem :
Bij het invoeren van een nieuwe actie is het mogelijk om info en een afbeelding in te voegen. Dit lukt allemaal. Als ik echter de ingevoerde info en afbeelding wil wijzigen loopt het script vast bij de thumbnailer functie. Als het input veld voor de afbeelding leeg blijft, geen probleem. Dan blijft gewoon de oude foto. Wordt er een nieuwe foto opgegeven, moet hij dus een thumbnail maken van de nieuwe foto en de oude foto verwijderen. Hij doet alles behalve de thumbnail functie toepassen. Neem ik de functie weg, werkt alles perfect, behalve de herschaling natuurlijk.
De thumbnailer functie werkt, want ik gebruik ze ook bij het nieuw ingeven van een actie. Kan de plaatst in het script verkeerd zijn?
Iemand die raad weet?
Alvast bedankt!{Designing your digital home} bubblefish.be {Design and illustration}no votes
-
-
29-06-2010, 21:00 #2
opgelost
Probleem ondertussen opgelost. Met een 'frisse kop' er nog eens op gezocht :
Er was een conflict tussen 2
eenmaal in mijn edit en eenmaal in mijn gewone upload.PHP Code:if($_SERVER["REQUEST_METHOD"] == 'POST') {
toegevoegd aan de gewone upload en alles werkt...PHP Code:if(!isset($action)) {
Bedankt aan wie de tijd heeft genomen om de code even te lezen.{Designing your digital home} bubblefish.be {Design and illustration}no votes
-
29-06-2010, 21:19 #3
Ik heb PHP ook geleerd door zelf te doen en te lezen maar toch wil ik dingen aanhalen die in mijn ogen toch ECHT foutief zijn.
Nummer 1
Volgende code slaagt echt op niks
Je zegt toch ook nietPHP Code:$edit_naam = "".$row->auteur."";
Beter is het gebruik van mysql_fetch_assoc() omdat deze sneller is en dus niet mysql_fetch_object(). *_assoc() geeft een array terug dus die code zou wordenPHP Code:$naam = "" . "little" . "";
PHP Code:$edit_naam = $row['auteur'];
Nummer 2
Waarom maak je je variabelen aan in een while-lus? De naam while lus is een lus en zegt dus zelf al dat het een lus is. Bedoelt om meerdere keren doorlopen te worden. Aangezien jij maar 1 resultset terugkrijgt wordt de code als volgt.
Beter zou ook zijn om hetvolgende te schrijvenPHP Code:$resultaat = mysql_query("SELECT * FROM ".$table." WHERE ID=".$id);
$row = mysql_fetch_assoc($resultaat);
$edit_naam = $row['auteur'];
$edit_titel_nl = $row['titel_nl'];
$edit_datum = $row['datum'];
$edit_bericht_nl = $row['bericht_nl'];
$edit_status = $row['status'];
$edit_img_omschrijving = $row_fotoalt;
$edit_foto = $row['foto'];
Nummer 3PHP Code:<?php
if($_SERVER["REQUEST_METHOD"] == 'POST') {
$action = $_GET['action'];
if(isset($action) && $action == "edit") {
// al uw code
}
}
?>
Beter is om rond een lap tekst single quotes te gebruiken in plaats van dubbele quotes. Hierbij doel ik bijvoorbeeld op
Als je single quotes gebruikt moet jePHP Code:$error = "<p class=\"warning\">Gelieve een juiste titel voor dit bericht in te geven.</p>";
a) Niet escapen
b) Werkt sneller omdat PHP in single quotes geen variabele omzet naar zijn waarde. Als je hier niet snapt wat ik bedoel en het je echt interesseert vraag je het maar, geen zin om alles uit te typen op dit moment
.
Dus de code wordt bijgevolg
PHP Code:$error = '<p class="warning">Gelieve een juiste titel voor dit bericht in te geven.</p>';
no votes
-
29-06-2010, 22:37 #4
Curahee, bedankt voor de reactie en de tips.
bij nummer 1 :
Ik heb een lange tijd mysql_fetch_assoc() gebruikt , maar ben dan overgestapt naar mysql_fetch_object() omdat dit gebruikt werd in een cms dat ik toenmalig gebruikte. Maar blijkbaar is mysql_fetch_assoc() toch een betere keuze. Zal ik zeker onthouden voor de toekomst.
bij nummer 2 :
De bedoeling is dat ik de waarden uit de db haal. Als ik dit zonder een while lus zou moeten doen, wat moet ik dan wel gebruiken? ( for ? )
bij nummer 3 :
volledige akkoord. Ik weet dat dit niet de beste manier , maar dat is zo iets dat blijft plakken
. Ik keer altijd terug op deze manier van schrijven. 'Slechte' macht der gewoonte vrees ik...
{Designing your digital home} bubblefish.be {Design and illustration}no votes
-
29-06-2010, 22:42 #5
nummer 1
*_assoc() is inderdaad beter dus gebruik die maar. Als ze het bij een cms gebruiken werk er dan even mee omdat het 'moet' maar meer ook niet.
nummer 2
Waarom in godsnaam een lus willen gebruiken? Je haalt toch maar 1 record op dus moet je helemaal GEEN lus gebruiken.
Dit is dus de correcte code.
Bij je query kun je nog discussieren. Een * om alles op te halen gebruik je eigenlijk best nooit. Je wilt nooit ALLE data ophalen maar meestal maar enkele kolommen. Gebruik in dat geval geen * maar enkel de kolomnamen die je wilt hebben.PHP Code:$resultaat = mysql_query("SELECT * FROM ".$table." WHERE ID=".$id);
$row = mysql_fetch_assoc($resultaat);
$edit_naam = $row['auteur'];
$edit_titel_nl = $row['titel_nl'];
$edit_datum = $row['datum'];
$edit_bericht_nl = $row['bericht_nl'];
$edit_status = $row['status'];
$edit_img_omschrijving = $row_fotoalt;
$edit_foto = $row['foto'];
Je selecteert op id, welke uniek is, maar toch zet ik daar steeds LIMIT 1 achter. Niet echt noodzakelijk maar dan is het voor andere duidelijk waarom je geen while-lus gebruikt omdat er toch maar 1 record is.
Komt je id trouwens van een URL? Indien de gebruiker deze kan manipuleren, kijk je deze na of het wel hetgene is wat je wenst door te krijgen? Aangezien het een numiereke waarde is zet je dus ook bestPHP Code:$resultaat = mysql_query("SELECT * FROM ".$table." WHERE ID=" . $id . " LIMIT 1");
Enkel nodig indien deze uit een url of dergelijke komt.PHP Code:$id = $_GET['id'];
if(!ctype_digit($id)) {
$id = 1; // een default waarde
}
no votes
