Hej,
sitter och småpillar lite med pdo, och har stött på ett lite problem som jag inte lyckats hitta någon lösning på. Jag behöver hämta ut en komplett lista över böcker. Så långt är allt ok. Men jag vill också kunna begränsad lista beroende på om man valt författare eller bokserie/gruppering och det är där det hela strular till sig. Den hämtar ingenting istället.
Jag hade hoppats på att det skulle gå att fixa på nedanstående vis:
$where = null;
if(!empty($get_id)) $where = " WHERE ".$get_type."_id = ".$get_id;
$query = $db->prepare("SELECT id, title FROM tbl_books ?");
$query->execute(array($where));
$row = $query->fetchAll();
Men det gjorde det inte.
Jag skulle kunna lösa det med:
$query = $db->prepare("SELECT id, title FROM tbl_books ".$where);
Men skulle helst vilja slippa göra det på det sättet om det går. Det känns inte helt rätt, typ. Nån som har nån ide eller kan bekräfta att det inte att fixa på nåt liknande sätt? :)
aasahMedlem sedan mars 20034 471 inlägg Hm... Kan du inte göra en ifsats av om man valt det ena eller det andra? Typ:
if($get_type == 'författare' &&!empty($get_id))
$query = $db->prepare("SELECT id, title FROM tbl_books WHERE författar_id = ?");
elseif($get_type == 'bokserie' &&!empty($get_id))
$query = $db->prepare("SELECT id, title FROM tbl_books WHERE bokserie_id = ?");
$query->execute(array($get_id));
$row = $query->fetchAll();
Eller:
$query_f = $db->prepare("SELECT id, title FROM tbl_books WHERE författar_id = ?");
$query_b = $db->prepare("SELECT id, title FROM tbl_books WHERE bokserie_id = ?");
if($get_type == 'författare' &&!empty($get_id))
$query = $query_f;
elseif($get_type == 'bokserie' &&!empty($get_id))
$query = $query_b;
$query->execute(array($get_id));
$row = $query->fetchAll();
Jo, visst skulle jag kunna lösa det med en if-sats, men det känns inte riktigt som den smidigaste lösningen ändå.
Är $get_id tom ska den inte använda WHERE alls i frågan så då måste jag lägga in en if/if else för det med. :)
Börjar misstänka att den smidigaste vägen kan vara:
$where = null;
if(!empty($get_id)) $where = " WHERE ".$get_type."_id = ".$get_id;
$query = $db->prepare("SELECT id, title FROM tbl_books".$where);
Har även klurat ut att pdo gärna lägger till ' runt alla strängar som man stoppar in genom execute() eller bindParam/bindValue, vilket givetvis gör saker lite knepigare.
SPiNMedlem sedan mars 20007 896 inlägg Du vet väl att du tänjer lite på säkerheten med prepared statements när du gör såna här sträng-konkatenering? Och det är ju egentligen ingen vits med att köra PDO::prepare() när du redan har frågan klar. En lite bättre lösning skulle vara:
$where = null;
if(!empty($get_id)) $where = " WHERE ".$get_type."_id=:myID";
$query = $db->prepare("SELECT id, title FROM tbl_books".$where);
$query->bindParam(":myID", $get_id);
PDOStatement::bindParam() ska inte kasta någon exception om nyckeln inte finns, trots att det ser lite sämre ut att sätta ett värde till något som inte finns. Däremot skyddar du dig lite mot SQL-injektioner på detta sätt. Se bara till att ha koll på variabeln $get_type!
Ah, tack. Det där fungerade.
Jo, är medveten om att det inte är så jättebra säkerhetsmässigt.
Bästa lösningen i detta fall kanske är en if-sats ändå, beroende på vad för parametrar som ska in?
Filtrerar alltid alla variablar som kommer utifrån rätt tidigt i filerna.
Första gången jag "på riktigt" satt mig ner med PDO, för att lära mig det. Bara sneglat lite på det tidigare. :)