Skip to main content

Bygg MySQL-queries automatiskt

12/10/2008 - php, mysql, databaser, tutorial
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",
      "date:>" => "2008-10-01"
    ),
    "order" => "date desc",
    "limit" => 30,
    "group" => "member"
  );



select count(id), id, headline from articles where category = "Weblog" and date > '2008-10-01' 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
Mer i Tutorials
Uppdaterad video Nya layoutmodulen
Reset display with AppleScript
Expos  Stickies
Bygg MySQLqueries automatiskt
Mail Processing
Snygga till rubrikerna med jQuery
Min feed
Nyckelord: php, mysql, databaser or tutorial
Hur nya iPaden stller till det p webben
CSSruta igen nu med skugga
Layoutmotor fr Atlas
Bygg MySQLqueries automatiskt
Rkna tid med PHP
Flersprkigt websystem
Skapa rutor med CSS
Mixtejp
Norrsken
Kan ha "råkat" skaffa något på Sci-Fi-mässan
Recension: Steam Hotell
Rostfärg och IKEA-lampa
Create a physical book from my digital book
Survey Island
Someone is trying to sell my map!
Julkalender
Myst book updated
Recension: Yasuragi Ryokan Hanare
Recension: Ad Astra
Ny tatuering - midgårdsormen!
Minnestal till en kaffekopp
Förlovade
Sweden Rock 2023
Ny nummerskylt för huset
Fix i husbilen
Grubbelgubbe
Måla med rostfärg
Vårfix i trädgården
Jung Kook
Pappaskämt och annan humor
Bilder på spelbordet när det används
Använda laserskäraren för att skapa innehål...
Julklappar med laserskärare
Budget-Spa
Nyckelskåp
Fjällkaffe
1/20 DeLorean Time Machine
Caso Outdoor Cooler
Minikyl Coca Cola
Verktygsvagn med verktyg, 161 delar
CSS filters for background images
Huset ommålat!
Skiss för tatuering
Spelbordet klart
Laser cutting my Myst Island
We Can Do It
Batwing
Elsa
Skaffat husbil
Foton på bilen
Remarkable 2
Ny espressomaskin!
Porträtt av Emma
AtlasCMS och rådande krissituation
Ny bil! Ford Mustang Mach-E GT
Spelbordet, igen
Ny bil beställd