Dez 23 2019

Von einem gewissen Standpunkt aus bin ich heute nicht gefahren…

Zumindest wenn man betrachtet wo mein Auto gestern zum Schlafen stand und wo es heute steht.
Tatsächlich hab ich es zumindest ein kleines bisschen bewegt, wenn auch lediglich ca 30km.
Nachdem ich ausgiebig und gemütlich Kaffee gekocht und gefrühstückt hatte ging es erstmal ein wenig daran das Auto aufzuräumen.
Ein wenig ist gut, aufgestanden bin ich um 9, fertig mit Frühstücken war ich um 10 (oder halb elf, wer weiß das schon so genau) und nach dem Aufräumen war es dann plötzlich 12. Angefangen hab ich damit Zeug aus dem Auto zu räumen damit ich den HiLift und den Dieselkanister ebenfalls raus und in ihre entsprechenden Halter verfrachten konnte. Nachdem das geschafft war ein bisschen Werkzeug und Kisten hin und her schieben und dabei noch zwei leere Kartons finden, die wurden dann später mit anderen Müll zusammen an der nächsten Tankstelle in den Container geworfen.
Da ich am Dienstag vor der Abfahrt zwar noch zwei Auffahrrampen als Sandblech Ersatz gekauft hab, auf die schnelle aber keine Halterung für auf den Dachträger mehr fertigen konnte müssten diese wohl oder übel auf der Rückbank bzw im Fußraum davor Platz finden… Jetzt liegen sie wenigstens ordentlich im Fußraum und die Rückbank ist nichtmehr in drei Schichten voll sondern nur in einer halben, Innenraum kann also auch mehr oder weniger genutzt werden (zumindest Füße hoch legen ist kein Problem).
Nach so einem produktiven Vormittag wurde es dann auch Zeit den Motor zu starten und eine Runde zu drehen. Zuerst auf die andere Seite der Autobahn (ja ich stehe quasi neben der Autobahn) um bei der Tankstelle wie angesprochen den Müll zu entsorgen und dann zur Stadt Tabernas hoch und von dort ein wenig in die Richtung dessen was auf der Karte als „Wüste von Tabernas“ eingezeichnet ist, vielleicht findet sich ja ein schönerer Stellplatz… Nach ca 15km und einigen Blicken auf diverse Karten und Apps wurde klar, hier finde ich (zumindest auf entspannte Art und Weise) nichts, also Retoure.Ausblick auf die TabernasZumindest die Aussicht ist toll

Und da das deutsche Pärchen gestern gesagt hast dass sie einen Platz etwas weiter die Rambla entlang anfahren wollen der nicht so windig ist und es letzte Nacht schon sehr geschüttelt hat war das die nächste Idee, also rein in die Rambla und solange ich die Spuren des Mercedes gesehen hab immer hinterher. Leider habe ich die Spuren dann verloren und auch keinen erkennbar guten Standplatz gesehen also blieb nur ein weiteres mal wenden und zurück zum Ausgangspunkt.Mein Bus in der RamblaIn der Rambla

Zurück an meinem Ausgangspunkt wurde erstmal aus den Resten vom gestrigen Abendessen ein neues (mehr oder weniger) Mittagessen gezaubert und dann einfach das schöne Wetter (strahlender Sonnenschein und irgendwas um die 20°C) genossen.
Als dann langsam aber sicher die Sonne begann unterzugehen noch kurz ein Foto gemachtSonnenuntergangSo

Und dann ein wenig für morgen bzw die nächsten Tage Pläne geschmiedet, aber dazu dann mehr wenn es soweit ist.


Dez 22 2019

Eine kurze und doch recht eindrucksvolle Fahrt

Nachdem die Nacht an der Alhambra mit 31,05€ bei weitem nicht die günstigste (und dafür gab es weder Strom, noch sonstige Ver- bzw. Entsorgungsmöglichkeiten), aber dafür wenigstens schön ruhig war sollte es heute auch ruhig weiter gehen.

Geplant war ja erstmal die Fahrt nach Motril die auch nach einer guten Stunde erledigt war. In Motril dann erstmal schauen wie weiter und schnell war klar: das Tagesziel wird wohl eher Tabernas sein.

Da die Spanier wohl nicht sonderlich viel von Sonntagen halten hab ich aber noch ein paar Kleinigkeiten im Supermarkt besorgt bevor ich mich wieder auf den Weg mache. Das Navi führt zuverlässig durch Motril und zufälligerweise direkt am Hafen entlang. Dort sehe ich: ich könnte auch von hier aus nach Marokko übersetzen, die Fahrt dauert ca 7h, Preise konnte ich auf die schnelle aber nicht finden. Obwohl ich kurz darüber nach gedacht habe folgte ich dann doch den Navi die Küstenautobahn entlang Richtung Almeria.

Aus Blogs und vlogs hatte ich schon davon gehört, aber die ca 100km von Motril nach Tabernas selbst zu fahren ist doch etwas anderes.

Quasi die ganze Strecke geht es entlang der „Los Plasticos“, semi-permanente Gewächshäuser in denen all das Gemüse das wir so gern kaufen wächst.

Los Plasticos entlang der Autobahn

Sieht dann so ungefähr aus

Natürlich wissen wir alle das über Supermarktgemüse nicht unter freiem Himmel wächst, aber das so zu sehen ist schon übel. Auf der ganzen Fahrt gab es einige Gelegenheiten den Schildern Richtung „Costa“ zu folgen, aber Lust dazu hatte ich aufgrund des Anblicks nicht, schöner wird das auch nicht wenn man nicht auf der Autobahn fährt.

Zwischendurch sieht man übrigens auch immer wieder was mit so einem Gewächshaus passiert wenn es ausgedient hat, es endet als großer Haufen Plastik der in der Landschaft rumliegt.

Dafür war ich nach nicht ganz 2h und damit weniger als drei Stunden gesamt Fahrzeit heute, meinem Ziel ganz nahe: einem Platz an dem man in den Ausläufern der Wüste von Tabernas in Ruhe stehen kann.

Tja, aber auch nur fast am Ziel… Da ich falsch abgebogen war (bzw das Navi der Meinung war ich wäre jetzt am Ziel) bin ich erstmal eine Straße weiter gefahren bis ich an einer Zufahrt zu einer „Rambla“ also einem mehr oder weniger ausgetrockneten Flussbett war. Naja was soll’s, kann man sich ja mal anschauen, vielleicht führt es ja auch zu einem schönen Platz für den Rest des Tages und die Nacht wenn der eigentliche Platz schon nicht mehr existiert (das deutete das Internet bzw die App an).

Auf der Fahrt durch das Flussbett bis ungefähr zu der Stelle an der ich das Navi ausgeschaltet hatte gab es zwar einige an sich schöne Flecken, aber nichts was für eine Übernachtung geeignet wäre. Dann zweigte allerdings wieder eine „Ausfahrt“ ab, der ich auch eine Chance gab und damit prompt an dem eigentlich geplanten Zielpunkt angekommen war.

Begrüßt werde ich hier nach dem Einparken von einem älteren Herren der gerade von einer Wanderung zurück ist und mir erklärt dass das befahren der Rambla eigentlich nicht gestattet ist, aber trotzdem zwei Orangen aus eigenem ökologischen Anbau schenkt.

Kurz darauf kommt erst ein ATV mit deutschem Kennzeichen und kurz darauf ein Reise-LKW ebenfalls mit deutschem Kennzeichen vorbei und wir unterhalten uns ein wenig. Das Pärchen hat die letzten Tage auf einem höheren gelegenen Punkt verbracht und will nun wegen des Windes zu einem Punkt ein Stück die Rambla entlang der sehr ruhig sein soll. Viel Erfolg wünschend richte ich mich weiter häuslich ein…

Mein Bus am Schlafplatz

So gefällt mir das schon eher.

Schlafplatz in die andere RichtungDa kam ich aus der Rambla gefahren

Den Rest des Tages hab ich jetzt in der Sonne sitzend mit Stricken und anschließend mit Kochen verbracht.

Nun sehe ich durch die Dachluke schon einen Haufen Sterne und werde mich wohl demnächst schon ausgiebig meinen Kopfkissen zuwenden.

Leider ist es zum Abend jetzt etwas windiger geworden, aber noch lange kein Vergleich zu vor ein paar Tagen, ich denke hier kann ich die Nacht gut verbringen und morgen schau ich dann ob ich etwas weiter in die Wüste fahren oder zum Beispiel die Rambla noch etwas erkunden soll…


Dez 22 2019

Von der Hauptstadt zu DER Sehenswürdigkeit

Nachdem ich gestern einen eher kurzem Fahrtag (nur ca 250km) gemacht hab hatte ich den gesamten Nachmittag frei.

Was macht man an so einem freien Nachmittag? Genau, da man im Randbezirk von Madrid ist schnappt man sich logischerweise ein Ticket für die Metro und fährt richtig in die Stadt rein.

Nach kurzem Fußmarsch zur Haltestelle und ca 40 Minuten in der Metro war dann auch „Sol“ erreicht. Laut Internet der Platz überhaupt in Madrid…

Madrids Hauptplatz Sol

Vielleicht liegt es an mir, aber mir war es hier zu voll und zu uninteressant, also bin ich einfach eine der abzweigenden Gassen entlang gewandert, auch in der Hoffnung etwas Essbares zu finden.

Zuerst wurde ich lange Zeit enttäuscht, viele Läden in denen man bestimmt vorzüglich shoppen könnte, ein Haufen Franchise Buden oder Restaurants mit für meinen Geschmack zu hohen Preisen.

Gebrochen wurde das Bild von einem Carrefour Express in dem ich mir zumindest mal etwas zu trinken holen konnte. Und 20 Minuten später, ca 7 Straßen und 5 Ecken weiter war plötzlich ein wunderbarer kleiner Laden in dem sich Arbeiter kurz ihr Mittagessen holen. Von Paella über alle möglichen Fleisch- und Nudelgerichte bis hin zu einem Haufen Gebäck gab es alles. Auch wenn ich ein großer Tortilla Fan bin gab es dann doch drei Empanadas für mich, lässt sich einfach besser auf die Hand nehmen.

So gestärkt und mit Blick auf den auch zuziehenden Himmel trat ich auch schon den Rückweg zum Campingplatz an, das war auch deine gute Idee, sonst wäre ich noch nasser geworden.

Am Platz angekommen war auch klar dass es eine gute Entscheidung was erst nach dem Besuch der Stadt zu duschen… denn die warme Dusche hätte ich jetzt so oder so gebraucht und hab ich dann auch sehr genossen.

Die Nacht war dann (abgesehen von viel viel Regen) ruhig so dass ich heute nach ein paar weiteren Recherchen und Überlegungen Recht früh aufbrechen konnte.

Die Überlegungen haben ergeben dass ich nicht nach Marokko fahre sondern mir Spanien (oder zumindest einen Teil davon) gemütlicher anschaue. Daher stand für den Tag als Ziel auch nicht Algeciras, sondern Granda auf dem Plan (wobei das sehr lange die gleiche Strecke ist).

Granada sind von Madrid aus ca 430km, sollte sich also gut in 5h und somit mit Ankunft im hellen machen lassen… Sollte… Wäre da nicht unterwegs 16km Stau auf der Autobahn. Hört sich erstmal nicht soooo Wild an, darum weiß ich auch nicht wieso ich damit ganze drei Stunden verbracht hab, Ankunft dann natürlich wieder im dunklen.

Weil ich dadurch schon wieder Laune hatte (Schlafplatz suchen ist mit Licht einfach viel angenehmer) durfte das Navi die Suche übernehmen und es sollte ein Campingplatz werden… Cool, direkt was gefunden, nicht zu sehr drin, Supermarkt in der Nähe, passt also los. Da angekommen ist das Tor zu, ist auch besser so, denn dahinter verbirgt sich nur Baustelle. Nun gut, nächste App und die nach einem evtl sogar Wildcamp Spot befragt. Nur drei KM weiter soll ein WoMo-Platz sein, also los… Denkste, das Navi kommt damit nicht klar dass Granada gefühlt eine einzige Einbahnstraße ist und die Straßen die keine Einbahnstraßen sind dürfen fast nur von Taxis und Bussen befahren werden.

Schon halb am verrückt werden die nächste Navi-App gestartet die zumindest beim Wandern schon gute Dienste geleistet hat. Zielsicher führt die auch zum Platz, nervig nur etwas das in der gratis Version der Bildschirm nicht an bleibt.

Nun gut der Platz ist gefunden, kostet zwar auch, aber ist dafür wenigstens schön groß und eben. Und nebenbei nur einen Steinwurf von der Alhambra entfernt.

Alhambra bei NachtUnd so kam ich doch noch zum Sightseeing und konnte zumindest von außen einen Blick auf dieses Bauwerk werfen. Schon ziemlich beeindruckend das ganze und ich bin ziemlich froh das um diese Zeit (halb 10 abends) kaum noch Leute unterwegs sind, ich glaube hier ist sonst richtig viel los.

Und nun hau ich mich aufs Ohr und schau mal ob es morgen nach Motril (70km) oder darüber nach Tabernas (dann 200km) geht und wie das fahren dann klappt.


Dez 19 2019

Einmal Spanien bitte…

Ahoi,

Da ich gerade vom Wind wach gehalten werde kann ich auch mal ein wenig berichten…

Da noch ein kleiner Haufen Urlaubstage übrig war hab ich kurzerhand beschlossen den ohnehin über Weihnachten/Neujahr genommenen Urlaub etwas auszuweiten. Raus gekommen sind ganze 26 Tage… Und was macht man mit so viel Zeit?

Genau, man setzt sich ins Auto und kommt auf dumme Gedanken.

Meiner war: ich könnte eigentlich in die Wüste fahren, also einmal quer durch Europa bis an den Südzipfel von Spanien und dann nach Marokko in die Erg Chebbi.

Soweit so gut, also vorgestern ins Auto gesprungen und ab dafür.

Streckenplanung
Geplante Strecke bei Abfahrt

Die erste Nacht verbrachte ich dann auf einem P+R Parkplatz in der Nähe von…

Wegen des Windes gab es hier nochmal einen Umzug von fast 30km…

… Saint-Rémy. Nicht der beste Platz, aber immerhin ganz OK.

Gestern ging es dann ein ganzes Stückchen weiter über verschiedenste kleine und große Straßen bis nach Albi (das eigentlich laut Routenplan umfahren werden sollte) in dem ich es mir auf dem großzügigen, kostenfreien WoMo-Platz hinter dem Friedhof gemütlich gemacht habe.

Schlafplatz in Albi
Auch im Dunkeln noch ganz ansehnlich

Nach einer hervorragenden und vorallem ruhigen Nacht hab ich mir beim Frühstück auch etwas mehr Zeit gelassen, inkl. Kaffee kochen, Stoopwaffel auf dem Kaffee weich werden lassen und ein paar Scheiben Brot

Frühstück aus dem Baukasten
Bisschen Baukasten

Beim herausfahren aus Albi recht bald festgestellt das es eigentlich ein ganz hübscher Ort ist der bestimmt auch ein gutes Nachmittagsprogramm abgeben würde. Ein paar Ecken weiter auf einer Brücke sogar die Möglichkeit gefunden ein Foto aus dem Fenster zu knipsen

Albi aus dem Fenster

Den Rest des Tages ging es bei sehr viel Wind (vorallem von vorne oder der Seite, leider nur selten von hinten) gefühlt die Hälfte der Zeit bergauf. Bei Steigungen bis 10% hat Grisu dabei schon schwer zu schleppen, hat sich aber tapfer durchgebissen.

Vorallem in den Pyrenäen hat man das ordentlich gemerkt. Eigentlich hatte ich geplant so 13 Uhr rum Mittagspause zu machen, da es aber nur noch ca 60 km bis nach Spanien waren und das Wetter ob der Berge immer schlechter wurde dachte ich mir ich verschiebe das auf nach der Grenze… Kurz vor der Grenze (besser gesagt vor dem Grenztunnel) sah es dann so aus:

Vor dem Grenztunnel nach Spanien

Die Hoffnung dass es auf der anderen Seite des Tunnels besser ist war gering und so war die Enttäuschung über den Regen auch nicht so groß.

Wird eben erst gegessen wenn die Straße wieder trocken ist… Guter Gedanke aber schlimmer Fehler, nach der Grenze zieht sich das alles noch wunderbar, vorallem auch die Steigungen. Knapp 60km waren es bis die Straßen wieder trocken wurden. Wie man sich denken kann war nun schon so viel Zeit vergangen das das Mittagessen auch ganz ausfallen konnte und direkt zum Abendessen gemacht werden sollte.

Gesagt getan und einen potentiellen Schlafplatz raus gesucht. Prompt erstmal Verfahren, dann plötzlich auf einem Acker gestanden gab ich auf und wollte zur Autobahn zurück. Auf dem Weg in die Richtung durch Zufall den Platz dann von der anderen Seite angefahren, Resultat siehe ganz oben… auch wenn der Platz eigentlich ganz schön war, bei dem Wind leider keine Option.

Und nun bin ich in Calatayud und hoffe das ich hier eine ordentliche Mütze Schlaf kriege.

In diesem Sinne gute Nacht

P.S. das mit den Bildern klappt nicht so ganz, werden nachgereicht


Mai 1 2017

Styling

This one I used to push away again and again, but now I think it’s time to start adding some looks and feel to the whole.

To start this off I’ll take care of the landing page (which might not be the best idea as this might need the most styling…) and to get a feeling for those css-magic I first went with expanding/collapsing the comment-sections with pure css.

So getting it going I added a style-section to the html-head and added some classes for the comment section, its header and body and the label of the checkbox which is used to achieve the toggling.
Yes, I went with the hidden-checkbox for toggling the comment-section-body-div as this is the easy way of achieving the toggle without the usage of JavaScript. Still I’m thinking about other solutions that don’t include JavaScript but work with a real link as I think the hidden-checkbox is inaccessible on screen readers (actually I have to grab my mouse to use this and can’t just use the follow-link command of my vim-browser-plugin). Yes I haven’t optimized the page for screen readers so far, but hey, this might be an additional goal.
A short trip around the mighty interwebs just left me thinking about replacing the checkbox with a span, div or something more suitable equipped with aria-roles. As I try to not use JavaScript this is unfortunately not an option as the checked-state has to be processed.
Also I might need to set up a screen reader for testing…

Let’s move the focus back to the real topic…
As writing css can easily lead to huge files with tons of repetitions I decided to go with SASS using the SCSS-syntax.

As it’s hard to write about writing css/sass I think that’s it for today.

So long,
Sven


Apr 23 2017

Landing page – What about comments?

So last time a basic landing page was created, but (besides the styling) there was something missing.
The comments
Available comments wouldn’t be shown AND there was no possibility of commenting on articles, this is about to be changed.

As there already is the getPosts-function this should be today’s starting point, so let’s get us another function that fetches the comments.
The new function is named getCommentsForArticle and takes exactly one parameter which is the articleId. All comments for the given articleId are fetched by simply joining the comments- and articlecomments-tables together. The result of this select will be stored in the article-array as comments.

Next the landing page must be enhanced to display the comments (if there are any).
So the foreach-loop in the main-section will receive some work…
First of all the number of comments is counted and a new div is added to the article-section(s).
If there are comments the count is displayed here, if there are none there should be a link that allows the users to leave a comment.

Not much of a fuss so far, let’s go on by really displaying the existing comments.
So I’m adding another foreach-loop in the else-branch of the comment-section which will simply loop over all available comments and display them.
No matter if there are comments or not, the Leave a comment-area should be displayed, so this (or at least a dummy) will be added next.
If someone comments at least a comment and a nickname should be given, so on the creation page these two values will be checked first and the user will be prompted an error message if those are not set, else the comment will be added to the database and if the add is successful the new comment is linked to the article.
Now there is one thing left to add, which is a captcha.
As I do want to use as little javascript as possible the widely used reCaptcha is no alternative which means I might have to write my own…

The captcha is a generated white png with a random string with length seven put into the image. The random string is also saved in a session variable so that we can check for equality.

So long
Sven


Apr 17 2017

Creating the landing page

Some time ago I already wanted to begin creating the actual blog page (which I will refer to as landing page as it’s most likely the first page a visitor will see), but had to drop on that because there were some parts missing, first of all the settings, which again lead me to error-handling.

As of now I feel ready to start creating the landing page and so I opened up my editor with a new file index.php. Writing some lines I lost myself in reading some blog-posts about HTML5, sometimes it’s just better to re-read some stuff before diving head first into writing some new code…

Ok, so what’s to be happening on the landing page?
– Parts of the page should be displayed according to the settings (e.g. title)
– The user should be able to switch the languages
– The articles should be displayed (obvious)
– Categories should be displayed
– additional links should be displayed
– a footer should be visible

Displaying the page according to the settings
As the settings can be displayed and changed in the admin-panel all we need here is already in existence, so I can start writing right away.
First I’ll fetch the settings from the database using the getSettings-function. As of now the settings are not sorted or somehow organized by name in the array returned by that function, so I’m (for now) going to iterate over that settings array and explicitly check for the setting names and save each of them to a dedicated variable… this might should get changed in the future as it’s ugly, hardcoded and therefore not easy to maintain.
For now there are only three settings in use, which are title, subtitle and default language. Title will be used both for the browser title and the main-title in the HTML5 header-element, subtitle is also used in the header-element.

Switching languages
The user can switch from one language to another simply by clicking the respective language entry in the header-navigation, so the page should be able to display the articles in the selected language.
Upon startup the default language will be fetched from the settings and all articles with content for that language will be retrieved from the database and displayed in the main-section of the page.
I introduced a new function getArticlesForLanguage to the Connection-class which is used just for this part. Right now the function first gets all articles (using the getArticles function) and afterwards fetches for each of those articles the content for the currently selected language (if any is in existence).
This is surely not the best approach, as all articles are fetched and passed to the page where the final selection which articles will be displayed is performed by checking if there is any content given.
Worst case scenario: Plenty of data is fetched from the database and returned to the page but none is displayed as no article has content for the selected language.
This went straight to my ToDo-List as I’m planning on fetching only the articles that will be displayed and falling back to default language if an article has no content for the selected language but for the default language.

Displaying the categories
The categories are somewhat not directly related to the content, so they will be placed inside of an aside-element and should be displayed somewhere most likely on the right end of the screen.
Retrieving the categories is again nothing new as there already is the getCategories-function.
Each category will be added as a link inside of a nav-element in the aside-area.

Additional links and footer
As there are no additional links or any footer right now I’ll leave this one open for today.

So what does it look like right now?
Landing page, draft


Apr 9 2017

Improving error handling – Implementation

I already told that error handling needs to be improved and that I started out by printing huge amounts of PDO::errorInfos which still left me with corrupted database entries and therefor wasn’t even checked in on the repository. I left the changes dangling on the system until today when the first thing I did was a simple git checkout on the changed files.

So a fresh start…
First of I created a new file exceptions.php with just a single
class SQLException extends Exception {}
in it. Yes, this is not necessary and could’ve been done on the connection-class within the dbconnect.php file, but in favor of separation of concerns I decided to give it an own file.
Maybe the SQLException will get enhanced sometime in the future, but for now it’s ok as it is.
Another reason for exceptions.php-file is that I might add some other exceptions in the future with some fancy implementation details.

Next step was going through the methods of the connection-class and replacing the old „error handling“ (which was return false or return $errors) with throw new SQLException().
A side-effect of this was that I could get rid of all that overhead code for aggregating error-messages on loops, several returns and variables I didn’t need in the first place – so I’ll get cleaner code with this too.

Ok, now the methods of the connection class either return data, true or throw an exception, which leads me to
adding try-catch-blocks on pretty much every other file.
So going through all the create_-files I started wrapping sql-related code-blocks inside the try-part of a try-catch-block and adding a catch-block which takes care of the SQLExceptions and prints its error message.
Next I added a $connection->begin() to the beginning and an $connection->commit() to the end of the try-block and the corresponding $connection->rollback() on the catch-block of the code parts where multiple relating sql-calls occur.
As the relating connection-function calls where nested in several if-else-loops the benefit of the exceptions is that I can now eliminate most of these loops as the next sql-call will not be reached if the preceding failed.

With these changes the need for data-classes is currently not longer present, still I'm thinking about implementing these classes as that would add another layer of abstraction that might come in handy sometime.

So long
Sven


Mrz 26 2017

Improving error handling – The beginning

For now there is not much error-handling implemented for all those database related functions, which is really bad.

Say I want to create a new blog post with content in German and English which is also associated to the category „General“, this results in three sql-statements that have to be triggered and are partly dependent on the results of each other.
First we create a new article in the database, for creating the content we need the ID of the new article and for creating the association of article and categories we also need the articleId. But do we want to create parts of all this if other parts fail or do we want to see an error message and no changes on the database.

At the moment there is literally no error handling. If the execution of a statement fails the following statements are not executed and the user will see a simple message that states that there was an error while trying to do that statement.
I tried to improve this by returning the error message which is returned from PDO::errorInfo; while implementing this I realized that this will work fine if there are no dependent queries or return value is boolean for success but in every other case I’ll still run into problems…

One problem is that I haven’t utilized transactions in the first place and therefore I might leave the database with obsolete, redundant and/or incomplete data.
To change this I added transactions for the parts of the code where I do have those dependent queries. This is alright as I keep my database a little cleaner, but as a trade off I now have a PDO::beginTransaction right before I try to execute the first query and one PDO::rollBack in each error-case (which typically is part of an if-else) plus an additional PDO::commit if every query was successful.
For the first case where I started to implement this the result was having one beginTransaction, one commit and three rollBack-statements. Furthermore returning the error-messages from errorInfo for this case meant switching most of the queries from returning data in the success-case and a boolean on errors to returning data on success AND data (error messages are strings too) on errors too.

First thought: Switch from associative arrays to objects for the return values of the database-queries. Well, this is an approach, but I still got to check for the return value type on each error-case and still keep those redundant rollBacks.
Then a sudden realization occurred: Why on earth am I not using exceptions?

Yeah, that could have been taken into account previously, but I just didn’t think about it earlier and, as the last PHP Version I was working with was PHP4, I didn’t even knew there are exceptions in PHP. Funny things occur, the previous day I read an article on PDO which featured some examples with exceptions.

So I threw away the changes I made today, which was not much of code, and will be redo this with exceptions and maybe also with objects for the return values.

Cheers
Sven


Mrz 19 2017

Some settings

Today I wanted to start creating the actual blog-site, so what a visitor will see when entering the blog.

Opening vim and adding a new index.php file for editing I realized, just after inserting the opening and closing php-tags that I might create something like a settings-page on the admin-panel first.
Why? one could ask. Well, first of all is also first thing that came to my mind when thinking about the index-page: the blog-title.
Yeah, I kind of forgot all that settings stuff until now, including such simple things like the blog-title, a blog-description and similar stuff. I haven’t figured out yet what should be part of the settings, but I’ll start it simple and keep adding parts whenever I feel they need to be in there…

So I decided to drop the index.php and go on with doing just that and create that one part first and yes, this also includes a little database work because I have to store the settings somewhere.

Let’s begin with that db part. As I’m actually writing this post while coding and figuring out the bits and pieces some parts might seem a little confusing, sorry for that.
If I’m using a settings table, what should the structure be?
Hammering on my keyboard without pre-thinking I ran into the first „problem“ after typing
CREATE TABLE IF NOT EXISTS `settings` ( `title` which really isn’t that much.
But right here comes my problem that stopped me from hammering in the next columns, e.g. „description“.
Yes, the problem is right there in that sentence, it’s the columns… If I keep going with that approach I’ll need to update the table-structure every time I want to add a new setting and also the table wouldn’t hold more than one entry – ugly.
As there is a running WordPress-instance here I decided to take a look at how the settings are handled here. Opening the database it was pretty obvious that the table I’m looking for is wp_options, which has four columns, namely option_id, option_name, option_value and autoload. As of now I don’t know what the autoload-column is used for, id, name and value are pretty self-explanatory.
I think I’ll just take the WordPress approach and go for a table of that structure but with an additional display-column in which the name of the column for the settings-page will be stored (yes, it’s actually more of a description).

Fast and easy, so next I’ll create two new methods, getSettings and setSettings on the Connection class.
I think there is nobody who needs explanation what the getSettings-method is doing, even the setSettings leaves no doubt what it’s doing.
For the set I went with a INSERT-statement, but with an added ON DUPLICATE KEY UPDATE, so I can use the same statement for adding as well as updating the settings.

As the settings-table has a display-column the settings-page can be created mostly within a simple loop.
So I fetch all available settings from the database and create a new line inside of a form for each entry where the fields name will be the settingId, display will be used as label and the value will be inserted.
Add a surrounding form-tag, a submit- and dismiss-button and we’re good to go.

On the processing script the incoming values will look something like:

1: Random Title
2: since 2017
4: This is a blog about coding

where the key is the settingId and the value is the value (obviously…)
So I’ll loop over the contents of $_POST (which feels ugly and somehow wrong) and append an array with id and value to a settings array.
The settings-array is then passed to the setSettings function and the user will be redirected to the admin-panel.

As the database-structure changed (and there are some changes that were just described) here is an updated graph of it:
Current database-schema

Last but not least I did some cleanup on the ConnectionSELECT-statements with PDO::lastInsertId and switched some other SELECTs from PDO::prepare to PDO::query as there’ve been some where the prepare just doesn’t make any sense.

Cheers
Sven