Ik heb een insert functie waarbij naast dat er gegevens naar de database worden geschreven er ook een foto wordt geupload. Ik gebruik JQUERY/AJAX om te beoordelen of alles naar wens verloopt. Nu heb ik op dit moment het volgende in de functie:

if ( is_uploaded_file($_FILES['file']['tmp_name']) ) 
{
	$this->create_image($_FILES['file']['tmp_name'], $new_thumb_path, 320, 180, ZEBRA_IMAGE_CROP_CENTER);
	$this->create_image($_FILES['file']['tmp_name'], $new_photo_path, 640, 480, ZEBRA_IMAGE_CROP_CENTER);
	if ($insert	= $this->media->add_video($title, $description, $link, $file_name))
	{
		http_response_code(200);
		echo 'Succes.';				
	}
}

Nu is mijn vraag is dit wel de juiste benadering? Want als de foto wel word geupload naar de folder maar er gaat iets mis met de insert dan is de gehele query nutteloos en andersom het zelfde. Of zie ik het verkeerd. Hoe zouden jullie dit aanpakken?
De vraag was/is of de volgorde die ik voor ogen had in orde is.

Nou, wat gebeurt er als $this->create_image() mislukt? Wordt er dan een exception gegenereerd, en wordt de verwerking van het formulier dan gestaakt? Hier heeft dat ogenschijnlijk geen gevolgen (er worden geen return values geïnspecteerd?). De create_image() aanroepen worden uitgevoerd, en vervolgens komt daar altijd een handeling achteraan (wat doet $this->media_add_video() precies?). Zijn er daarnaast nog andere queries die uitgevoerd worden en dus eigenlijk ook gebundeld zouden moeten worden in een transactie?

Jullie denken toch niet dat ik niet check op extensies of grote van het bestand?

Dat weet ik niet, kon het iig niet opmaken uit code/bovenstaand verhaal.

Zoals ik het zie wil je iets dat een combinatie van al het bovenstaande is: eerst controleer je of alles klopt, dan probeer je alles weg te schrijven, naar bestanden of database, waarbij je altijd een back-out strategie hebt waarbij je de toestand van voor het toevoegen herstelt als er onverhoopt toch iets misgaat zodat de data die je hebt (database, bestanden et cetera) gezond en onderling kloppend is en ook blijft.

Transacties zoals @Ben beschrijft en de controles van @Jan hierboven zijn middelen daartoe, maar wat voor oplossingen je hiervoor ook verzint, je moet een soort van achterliggend plan hebben wat er *in grote lijnen* moet gebeuren om je data kloppend te houden.

En dat plan is meestal ook in blokken opgedeeld, eerst heb je meestal een formulier validatie, dan heb je allerlei andere bewerkingen en controles en tot slot heb je nog een rits aan queries die in één batch worden uitgevoerd. Als er op enig moment tijdens zo'n blok iets misgaat vindt er een totale "rollback" plaats en wordt de gebruiker teruggestuurd naar het formulier met begrijpelijke foutmeldingen zodat deze foute invoer kan herstellen en alles opnieuw kan versturen.

Ik kan zo'n volgorde in het bovenstaande niet echt vaststellen.

Reageren