Ik had een vraag aan jullie:
Wat is het moeilijkste script dat je ooit hebt gemaakt/willen maken? En waardoor was dat zo moeilijk?
Mijn moeilijkste:
Een systeempje dat een soort van digitaal gebouw maakt:
- Een gebouw van 5 bij 5 hokjes groot (1 hokje is 20x20 px) en daartussen zit steeds een muur van 5px (tenzij de muur is weggehaald, dan zit die 5px er nog wel, maar dan valt deze niet op)
(Sorry dat het plaatje zo donker is, maar bij mijn layout zie je 't wel goed)
- Je kan kamers groter en kleiner maken
- Je kan kamers ook een naam geven
- Je kan spullen in een kamer zetten
- Jij (en andere mensen) kunnen in een kamer zijn
Wat het zo moeilijk maakte:
Ik moest veel arrays gebruiken en daarmee raakte je HEEL ERG mee in de war
Ook moest je onderscheid tussen muren en kamers (de hokjes van 20x20 px) maken, wat een groot probleem maakte.
Ook was de keuze van de structuur van de DB tabel moeilijk, daarom is het ook o.a. alleen 5 bij 5 hokjes, niet meer, niet minder.
Hebben jullie ooit ook echt een script gemaakt/willen maken en dat je daarop terug dacht van: ''Pfeew... Ik ben blij dat ik er mee klaar ben' of 'Yes! Het is me gelukt!!!' ?
[edit]
Plaatje bijgevoegd voor duidelijkheid
[/edit]
Ik zie zelfs dingen die ik vroeger ook zo zou doen, maar het tegenwoordig met arrays zou aanpakken ;-)
BTW: I love arrays! Onvoorstelbaar dat ik ongeveer een kwart- tot een half jaar zonder heb gePHPd :o
Ik heb pas ook nog een script compleet verwijderd en neergezet: 'Because of an incredible age, this script died. It has to be made AGAIN, so this script can R.I.P. forever.'
[edit]
Dit was een reply op Klaasjan Boven (Ik had maar niet geQuote :P)
[/edit]
Mijn moeilijkste script
zal toch wel zijn waar ik nu mee bezig ben
een aanvalsscript voor mijn Webbased RPG =)
met een beetje geluk gaat hij volgende week in de Beta fase :D
Een online reserveringssysteem dat vooral uit procedures (pl/pgSQL) bestaat. Voorbeeldje van 1 van de vele functies:
CREATE OR REPLACE FUNCTION api.accept_invitation(IN name text, IN e_mail text, IN "password" text, IN language_iso_code text, IN invitation_code text, OUT code text) AS
$BODY$
DECLARE
formated_name text;
formated_e_mail text;
formated_password text;
formated_iso_code text;
formated_invitation_code text;
language_id integer;
primary_e_mail text;
error_string text := '';
person_id integer;
password_ok text;
invitation_ok text;
referee_ok text;
confirmation_ok text;
person_row record;
return_code text;
confirmation_code text;
update_ok text;
person_history_ok text;
permission_id integer;
history_row record;
change_ok text;
moment timestamp;
role_id integer;
is_agency_manager boolean;
agency_ok record;
set_ok record;
neighborhood_row record;
city_id integer;
state_id integer;
country_id integer;
current_city_id integer := NULL;
BEGIN
formated_name := TRIM(BOTH FROM name);
formated_e_mail := TRIM(BOTH FROM e_mail);
formated_password := TRIM(BOTH FROM password);
formated_iso_code := TRIM(BOTH FROM language_iso_code);
formated_invitation_code := TRIM(BOTH FROM invitation_code);
<<MAIN_BODY>>
BEGIN
moment := NOW();
IF (formated_name = '') THEN
error_string := '10001|name';
EXIT MAIN_BODY;
END IF;
IF (formated_e_mail = '') THEN
error_string := '10001|e_mail';
EXIT MAIN_BODY;
END IF;
IF (CHAR_LENGTH(formated_password) <> 40) THEN
error_string := '10002|password;40';
EXIT MAIN_BODY;
END IF;
IF (CHAR_LENGTH(formated_iso_code) <> 2) THEN
error_string := '10002|iso_code;2';
EXIT MAIN_BODY;
END IF;
language_id := available_language.get_id('iso_code',formated_iso_code);
IF (language_id IS NULL) THEN
error_string := '11001|'||formated_iso_code;
EXIT MAIN_BODY;
END IF;
IF (formated_invitation_code = '') THEN
error_string := '10001|invitation_code';
EXIT MAIN_BODY;
END IF;
person_row := invitation.validate(formated_invitation_code);
IF (person_row.id_person IS NULL) THEN
error_string := '25000|';
EXIT MAIN_BODY;
END IF;
primary_e_mail := person.get(person_row.id_person,'primary_e_mail');
IF (primary_e_mail <> formated_e_mail) THEN
person_id := person.get_id('primary_e_mail',formated_e_mail);
IF (person_id IS NOT NULL) THEN
error_string := '16001|'||formated_e_mail;
EXIT MAIN_BODY;
END IF;
END IF;
update_ok := person.set(person_row.id_person,'name|id_default_display_language',formated_name||'|'||language_id);
IF (update_ok <> 'ok') THEN
error_string := '10000 update_ok|'||update_ok;
EXIT MAIN_BODY;
END IF;
change_ok := person.change_person_status(person_row.id_person,person_row.id_person,'active',moment);
IF (change_ok <> 'ok') THEN
error_string := '10000 set_ok|'||change_ok;
EXIT MAIN_BODY;
END IF;
password_ok := person.set_password(person_row.id_person,formated_password);
IF (password_ok <> 'ok') THEN
error_string := '10000 password_ok|'||password_ok;
EXIT MAIN_BODY;
END IF;
invitation_ok := invitation.accept(formated_invitation_code);
IF (invitation_ok <> 'ok') THEN
error_string := '10000 invitation_ok|'||invitation_ok;
EXIT MAIN_BODY;
END IF;
referee_ok := person.new_referee(person_row.id_invitor,person_row.id_person);
IF (referee_ok <> 'ok') THEN
error_string := '10000 referee_ok|'||referee_ok;
EXIT MAIN_BODY;
END IF;
role_id := person.get(person_row.id_person,'id_role')::integer;
is_agency_manager := role.is('agency_manager',role_id);
IF (is_agency_manager IS TRUE) THEN
agency_ok := agency.activate_agency(person_row.id_person);
IF (agency_ok.ok <> 'ok') THEN
error_string := '10000|'||agency_ok.error;
EXIT MAIN_BODY;
END IF;
FOR neighborhood_row IN SELECT * FROM agency.list_neighborhoods(person_row.id_person)
LOOP
set_ok := neighborhood.set(neighborhood_row.id_neighborhood,'status|agency_status','active|with');
IF (set_ok.ok <> 'ok') THEN
error_string := '10000|'||set_ok.error;
EXIT MAIN_BODY;
END IF;
city_id := neighborhood.get(neighborhood_row.id_neighborhood,'id_city')::integer;
IF (current_city_id <> city_id) THEN
current_city_id := city_id;
set_ok := city.set(current_city_id,'status|agency_status','active|with');
IF (set_ok.ok <> 'ok') THEN
error_string := '10000|'||set_ok.error;
EXIT MAIN_BODY;
END IF;
state_id := city.get_state_id(current_city_id);
set_ok := state.set(state_id,'status|agency_status','active|with');
IF (set_ok.ok <> 'ok') THEN
error_string := '10000|'||set_ok.error;
EXIT MAIN_BODY;
END IF;
country_id := state.get_country_id(state_id);
set_ok := country.set(country_id,'status|agency_status','active|with');
IF (set_ok.ok <> 'ok') THEN
error_string := '10000|'||set_ok.error;
EXIT MAIN_BODY;
END IF;
END IF;
END LOOP;
END IF;
IF (primary_e_mail <> formated_e_mail) THEN
confirmation_code := e_mail_confirmation.generate_code(formated_e_mail);
confirmation_ok := e_mail_confirmation.new(person_row.id_person,formated_e_mail,confirmation_code);
IF (confirmation_ok <> 'ok') THEN
error_string := '10998|'||'OPS'||';'||'CONFIRMATION';
EXIT MAIN_BODY;
END IF;
return_code := confirmation_code;
ELSE
return_code := role.get(person_row.id_role,'code');
END IF;
permission_id := permission.get_api_id('api.accept_invitation(text,text,text,text,text)');
FOR history_row IN SELECT * FROM person_history.list_trigger_events(permission_id)
LOOP
person_history_ok := person_history.new_event(person_row.id_person,person_row.id_person,history_row.id_history_event_type);
IF (person_history_ok <> 'ok') THEN
error_string := '10000 person_history_ok|'||person_history_ok;
EXIT MAIN_BODY;
END IF;
END LOOP;
END MAIN_BODY;
<<FUNCTION_CLOSING>>
BEGIN
IF (error_string <> '') THEN
RAISE EXCEPTION '%',error_string;
ELSE
code := return_code;
END IF;
END FUNCTION_CLOSING;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION api.accept_invitation(IN name text, IN e_mail text, IN "password" text, IN language_iso_code text, IN invitation_code text, OUT code text) OWNER TO ***;
Ben nu bezig met een soortgelijk complex systeem. Erg leuk om te doen!
O echt? Ik vond dat zelf al wel een hele moeilijke. Ik denk dat het wel de grootste stap die je maakt is in de PHP world:
Geen PHP naar Wel PHP... best groot... Daar kunnen moeilijkheden in voorkomen ;-)
Ik heb nog geen idee wanneer de begrafenis is. Misschien als ik de andere heb gemaakt :D (nog steeds geen zin in)
O misschien ideetje voor de nieuwe versie van PHPhulp: Een té lange code (x aantal lines) laten doorverwijzen. (Dat je een link krijgt te zien naar een pagina waar deze helemaal word getoond)
Ik vraag me alleen af of dit wel mogelijk is... <-- een nieuwe voor: 'JOU moeilijkste script' :D