Bygg MySQL-queries automatiskt
2008-12-10 - php, mysql, databaser, tutorial
0
Översättningar
php
När man bygger PHP-applikationer så är det inte ovanligt att man sitter och konstruerar långa databas-queries i fritext och så tappar man snabbt översikt över hur querin ser ut. Samt att om man ska göra fyra snarlika queries med endast små förändringar så måste man skriva varje för sig, och det blir lätt väldigt rörigt. Med hjälp av lite väl placerade tabbar och nyrader så brukar jag försöka strukturtera upp dem, men dom blir lätt svårhanterade ändå.
Till slut tröttnade jag på det och skrev en PHP-funktion som helt enkelt gjorde om en array till en MySQL-sträng. Den är långt ifrån komplett men hanterar basfunktionaliteten riktigt snyggt, och framförallt så kan man lätt förändra queryn och återanvända den.
Base
$query = array(     "select" => "id, headline",     "from" => "articles",     "where" => array(   "id" => 12     ) );


= select id, headline from articles where id = 12
Så här enkelt bygger man en query
Variable in-data
if ($_GET["member"]){     $query["where"]["member"] = $_GET["member"]; }


select id, headline from articles where id = 12 and member = 34
Ok, första exemplet var ju inte direkt en speciellt komplicerad query, så den hade vi ju kunnat skriva för hand. Men det fina med detta är ju om man ska förändra en query baserad på in-data till sidan, som nedan. Varning, använd aldrig $_GET och $_POST direkt så här, validera ALLTID in-datat innan du använder det. Jag använde det här för tydlighetens skull men kommer använda min validerade in-data-variable $in i fortsättningen.
Multi-table
$query = array(   "select" => array("a.id", "a.headline"),   "from" => array("articles as a"),   "where" => array(     "a.category" => "Weblog"   ) );


select a.id, a.headline from articles as a where a.category = "Weblog"


if ($in["member"]){   $query["select"][] = "m.name";   $query["from"][] = "member as m";   $query["where"]["a.member"] = "m.id";   $query["where"]["m.name"] = $in["member"]; }


select a.id, a.headline, m.name from articles as a, member as m where a.category = "Weblog" and a.member = m.id and m.name = "Sandman"
En annan bra möjlighet med detta är att förändra queryn i efterhand baserat på in-data som kräver att man kör multi-tabell selects. Notera att jag bytt ut "select" och "from" till arrayer för detta nedan. Vad som händer är alltså att queryn byggs ut med en multi-tabell select och allt hamnar på rätt ställe autmatiskt
JOIN
if ($in["member"]){     $query["select"][] = "m.name";     $query["join"]["left"] = array(       "db" => "member as m",       "on" => array("m.id" => "a.member")     );     $query["where"]["m.name"] = $in["member"];   }


select a.id, a.headline, m.name from articles as a left join (member as m) on (m.id = a.member) where a.category = "Weblog" and m.name = "Sandman"
Den här funktionen hanterar även JOIN queries om man föredrar dem
GROUP, ORDER and LIMIT
$query = array(     "select" => "count(id), id, headline",     "from" => "articles",     "where" => array(       "category" => "Weblog"     ),     "order" => "date desc",     "limit" => 30,     "group" => "member"   );


select count(id), id, headline from articles where category = "Weblog" group by member order by date desc limit 30
Funktionen hanterar givetvis grundfunktioner som GROUP, ORDER och LIMIT också.
WHERE
$query = array(     "select" => "count(id), id, headline",     "from" => "articles",     "where" => array(       "category" => "Weblog"     ),     "order" => "date desc",     "limit" => 30,     "group" => "member"   );


select count(id), id, headline from articles where category = "Weblog" group by member order by date desc limit 30
Sedan så kan man i WHERE-satsen även ange annat än "=" genom att använda ett semikolon och efter det skriva jämförtecknet, som "<", ">" eller "is", som detta till exempel
Och givetvis så escape:as all indata ordentligt för att undvika SQL injection. Nå, för att använda den här funktionen, använd dom två länkarna nedan
Lite imponerad hur mycket Apple Watch kan hålla reda på bär man simmar faktiskt
Får lite välbehövlig hjälp att fixa med elen i verkstaden
Improvisationsteater på Västmanlandsteatern. Lika delar pinsamt och skoj :)
Har ryggskott som börjar bli bättre. Nyser nu på morgonen och det hugger till i ryggen och gör ont som fan. Kollapsar på golvet, och när jag reser mig upp så har jag råkat få igång Siri som tror sig ha hört detta. Ok, det gör ont som fan, men jag är ok, Siri :)
Har en trappa hemma som måste renoveras, menrenoveringskit är dyra som tusan, tanken är att jag ska bygga eget renoveringskit, får se hur det går…
Bakbunden
Även en ordentlig geringsfräs för att kunna bygga hållbara trappnosar
Har införskaffat mig en planopress inför kommande bordsprojekt samt ett test för en trapprenovering.
Byggde en pokalhylla till dotterns alla danspokaler
Pricken över i:et :)
Bakbord
Nytt projekt på gång, bakbord till svärfar :)
“Gå och lägg dig” - ”Nej jag kollar på TV med Leia” :)
Extrabord till jul
Extrabord till julafton klart! Byggvideo kommer inom kort på min youtube :)
Weehoo, jag har en egen stämpel nu. Det ni!
Bordskiva oljad och vaxad, ben borstade och betsade. Kanske blir ett bord till slut?
Bordsskiva betsad. Ska slipas/borstas och sen oljas.
Renoverat vardagsrumsbord
Favoritbild från dansuppvisningen igår
Nattduksbord
PanPastel-porträtt
Crock Pot
PanPastel
Tron för Sigge
Road Trip Italien!
Verkstad Remake
Jonas och Jenna
Brud som chillar
Showing off
Undressing
Touch thyself
Hot Love
Profilporträtt
Resa utan kamera?
Paus
Supernöjd med folieringen!
Bilen ska folieras!
Ny såg
PHP och BankID
Jack Skellington
Verkstadsplaner
Magnettavla
Verandatak och grillhörna!
Vardagsrumsbord
Knivblock
Kökshylla
Ny ikon för karta
PC-bygge
Kerlee 35mm f/1.2
Objektivhylla
Natalie Dormer
Hållare till kattmatsskålar
Hälsningar från Norge
With a little help from my friends...
The Most Incredible Fantasy Maps You've Ever Seen
Cityfestivalen
Mitakon Speedmaster 50mm/f0,95
10 minuter vatten
Sony A7R II
Petzval 58 Bokeh Control Art Lens
Scrawlrbox
Nya skärmar till jobbet
Nikon Df - ny leksak
Boba Fett
First Order Storm Trooper
Mikisen
#inlineditbutton