Paging och optimering

Publicerat: 2013-04-29 22:38:20 | Kategori: PHP & SQL

Tro det eller ej, men paging kan vara förbaskat knepigt att få till även på ett mindre projekt. När jag tidigare skrev om att kommentarssystemet var komplext hade jag nog inte riktigt tänkt på paging. Det finns hundratals sätt olika människor har löst det på, det ena klurigare än det andra. Testa bara att googla på simpla paging-skript, det är skrämmande vad folk tycker är enkelt egentligen!

Det som gör det knepigt är egentligen inte att skriptet är långt eller invecklat i sig, men att man måste bädda in det så utomordenligt perfekt i sin egna applikation för att det ska fungera. Det krävs således att man förstår skriptet till punkt och pricka och är det då ett så kallat "enkelt skript" med "endast" 50 rader kod så är det plötsligt en mardröm. Jag hittade till slut en blogg med ett så pass enkelt paging-skript att det faktiskt gick att förstå. Ändå tog det åtskilliga timmar att konvertera php-filen för inlägg.

Här kommer ett exempel på hur sökning fungerade på hraffe.se:

$sql = "SELECT * FROM posts WHERE rubrik LIKE '%$search_string%' OR kategori LIKE '%$search_string%' OR text LIKE '%$search_string%' ORDER BY datum DESC LIMIT 10";

I princip alla databasfunktioner hade ett liknande utseende. När paging kommer in i bilden så blir plötsligt en hel del kod att blanda in i det hela. Utan optimering skulle sökningen plötsligt se ut så här:

$pages = implode(mysqli_fetch_assoc(mysqli_query($GLOBALS["___mysqli_ston"], "SELECT COUNT(id) FROM posts WHERE rubrik LIKE '%$search_string%' OR kategori LIKE '%$search_string%' OR text LIKE '%$search_string%'")));

$sql = "SELECT * FROM posts WHERE rubrik LIKE '%$search_string%' OR kategori LIKE '%$search_string%' OR text LIKE '%$search_string%' ORDER BY datum DESC LIMIT " . (($page - 1) * 10) . ", 10";

Utan att överdriva så är det väldigt mycket kod för att endast vara SQL! Med PHP och alla IF/ELSE så blir det fort mycket svårt att hålla reda på. Det jag gjorde var att jag klurade ut ett sätt så strängarna utbyter information. Detta är egentligen inte så avancerat, men absolut ingenting jag tänkte på:

$sql_statement = "WHERE rubrik LIKE '%$search_string%' OR kategori LIKE '%$search_string%' OR text LIKE '%$search_string%'";

 $pages = implode(mysqli_fetch_assoc(mysqli_query($GLOBALS["___mysqli_ston"], "SELECT COUNT(id) FROM posts $sql_statement")));

$sql = "SELECT * FROM posts $sql_statement ORDER BY datum DESC LIMIT " . (($page - 1) * 10) . ", 10";

Till synes är det mer kod, men i längden blir det mindre. $sql_statement bestämmer vad SQL-kommandot ska göra och det betyder att man med några IF/ELSE helt enkelt kan bestämma vad som ska visas på sidan. Vi kör med ännu ett exempel på hur sidan skulle se ut utan $sql_statement:

if (isset($_GET['search'])) { 
$pages = implode(mysqli_fetch_assoc(mysqli_query($GLOBALS["___mysqli_ston"], "SELECT COUNT(id) FROM posts WHERE rubrik LIKE '%$search_string%' OR kategori LIKE '%$search_string%' OR text LIKE '%$search_string%'")));

$sql = "SELECT * FROM posts WHERE rubrik LIKE '%$search_string%' OR kategori LIKE '%$search_string%' OR text LIKE '%$search_string%' ORDER BY datum DESC LIMIT " . (($page - 1) * 10) . ", 10";

} else if 
(isset($_GET['kategori'])) {
$pages = implode(mysqli_fetch_assoc(mysqli_query($GLOBALS["___mysqli_ston"], "SELECT COUNT(id) FROM posts WHERE kategori LIKE '%$search_kategori%'";

$sql = "SELECT * FROM posts WHERE kategori LIKE '%$search_kategori%'  ORDER BY datum DESC LIMIT " . (($page - 1) * 10) . ", 10"; 

} else if (isset($_GET['arkiv'])) {
$pages = implode(mysqli_fetch_assoc(mysqli_query($GLOBALS["___mysqli_ston"], "SELECT COUNT(id) FROM posts  
WHERE DATE_FORMAT(datum, '%M-%Y') = '$search_archive'";

$sql = "S
ELECT * FROM posts WHERE DATE_FORMAT(datum, '%M-%Y') = '$search_archive'  ORDER BY datum DESC LIMIT " . (($page - 1) * 10) . ", 10";
}

Det är en enda stor röra som faktiskt går att förenkla enormt även om man inte först tänker på det. Med $sql_statement som jag la till skulle denna röra bli:

if (isset($_GET['search'])) {
$sql_statement = "WHERE rubrik LIKE '%$search_string%' OR kategori LIKE '%$search_string%' OR text LIKE '%$search_string%'";

} else if (isset($_GET['kategori'])) {
$sql_statement = "WHERE kategori LIKE '%$search_kategori%'";

} else if (isset($_GET['arkiv'])) {
$sql_statement = "WHERE DATE_FORMAT(datum, '%M-%Y') = '$search_archive'";
}

$pages = implode(mysqli_fetch_assoc(mysqli_query($GLOBALS["___mysqli_ston"], "SELECT COUNT(id) FROM posts $sql_statement")));

$sql = "SELECT * FROM posts $sql_statement ORDER BY datum DESC LIMIT " . (($page - 1) * 10) . ", 10";

Plötsligt så är koden på hela sidan betydligt förenklad och ger mycket mer överblick! Det är precis såhär man måste tänka när man kodar en hemsida. Jag vet inte hur andra tänker, men själv så har jag tidigare lagt krutet på att optimera PHP-koden och lämnat SQL-strängarna orörda.

Det här är alltså verkligen inte en guide till hur paging fungerar, men hur man ska tänka och hur man ska få det lättare att tillämpa paging. Jag rekommenderar att titta på Aspektas blogg för att hitta koden jag utgick ifrån.


Kommentera

Kommentarer och annat

Publicerat: 2013-04-28 21:37:49 | Kategori: Uppdateringar

Efter att ha suttit några dagar så kan jag äntligen säga att det har tillkommit lite nya funktioner:

En så liten sak som kommentarssystemet blev fort väldigt komplext med väldigt många funktioner som jag inte är speciellt duktig på, men det löste sig. wink

 

Uppdateringar 2013-04-28 kl. 21:18
Jag kände inte direkt för att göra en ny post för att skriva vad som har hänt sen sist, men visst har det blivit ett par uppdateringar även idag. smiley

Jag gjorde som sagt en rejäl miss med databasen. Jag hade glömt att skapa en tabell för kommentarerna på min Raspberry PI. Det gick tack och lov fort att ordna när jag väl såg det.

Stödet för Internet Explorer 9 och lägre har varit riktigt uselt, men efter många om och men är det i princip fullt fungerande. Det jag har gjort är att skapa en speciell CSS-fil för IE9 och lägre, IE10 använder däremot samma stilmall som Chrome, FireFox och alla andra webbläsare. Det är faktiskt så bra att sidan ser helt ok ut i IE6 även fast man absolut inte ska använda det gamla skräpet. Nedan är en bild av kompabilitetsläget för IE6 i IE10. Riktiga IE6 kan inte visa genomskinliga bilder så bilden på Raspberry PI i headern ser lite annorlunda ut. Annars är det ganska likt verkligheten. smiley

 


Kommentera

MySQL till MySQLi

Publicerat: 2013-04-24 17:51:58 | Kategori: PHP & SQL

För endast några dagar sedan så uppmärksammade jag att MySQLi eller "MySQL improved" är en ny standard mer eller mindre. Detta lät väldigt intressant och jag valde att läsa vidare och googla runt lite på ämnet. Många verkar ha haft problem att konvertera sina sidor, men jag märkte fort att det nog är bland det enklaste man kan göra. Det går lätt att göra manuellt genom att söka reda på motsvarigheterna mellan standarderna. Inte blir det knepigare av att de oftast heter samma sak i princip, t ex "mysql_fetch_assoc" och "mysqltng_fetch_assoc". Jag hittade även en enkel guide med de flesta skillnaderna.

Även om det är ganska enkelt så finns det ett betydligt enklare alternativ... "MySQL ext/mysq Converter Tool​"! Det är Oracles egna konverteringsskript som helt enkelt gör hela processen mer eller mindre automatisk. Jag konverterade hraffe.se fort och lätt med skriptet och ingenting kan ju egentligen gå fel om man har sparat en backup.

Det är enklast att köra skriptet lokalt på sin egen dator så man slipper problem med rättigheter till mappar och allt vad det kan vara. För att göra det så laddar man ner zip-filen härifrån och packar upp den i www-mappen.

För att förenkla läget avsevärt rekommenderar jag att man kopierar mappen man vill konvertera till "MySQLConverterToolGUI​".

För att sedan starta skriptet så öppnar man valfri webbläsare och går till "http://localhost/MySQLConverterTool/GUI/" eller var det nu installerades. Nu är det mesta en barnlek och det är bara att följa instruktionerna. Först får man välja om man vill konvertera en mapp, en fil eller bara en kodsträng. Har man en stor sajt så är det klart man väljer det första alternativet.

Nästa steg är att skriva in vilken mapp man vill konvertera. Det bästa hade ju varit om man kunde skriva in hela adressen med localhost, men det verkar vara i relation till själva skriptet. På grund av detta är det absolut lättast att som innan rekommenderat att kopiera mappen man vill konvertera till GUI-mappen.

När det kommer till filändelser är det bara att lägga till de som saknas. Frågan om att uppdatera filerna ska man såklart svara ja på. Krysslådan om man vill spara en bakup är egentligen ganska onödig att ha ikryssad om man redan har kopierat mappen med allt innehåll. Sen är det bara att starta!

Det man bemöts av nu är hur konverteringen gick. Några varningar kan man vänta sig, men det är först när man får ett riktigt "error" som det är något som har gått helt åt fanders. I mitt fall klarade jag mig med två relativt snälla varningar om att skriptet inte riktigt förstod sig på min kod. I vilket fall är nästa steg att testa att gå in på hemsidan och surfa runt lite! Med lite tur så fungerar precis allting och då behöver man inte göra mer. Ifall det är något som har gått fel så vet man i och med rapporten i skriptet precis var som felet ligger. För att avhjälpa det specifika problemet rekommenderar jag Googlesmiley


Kommentera

MySQLi och bilder

Publicerat: 2013-04-24 00:49:44 | Kategori: Uppdateringar

Äntligen! Nu går det att ladda upp bilder!

Uppdateringar:


Kommentera

CSS-fel

Publicerat: 2013-04-23 09:27:35 | Kategori: Uppdateringar

Det verkar som att jag var grymt duktig idag och lyckades radera en del rader i CSS-filen, så hemsidan ser lite skum ut. Tyvärr har jag sparat backupen i hemmets ljuva vrå, så det kommer att dröja tills ikväll för att fixa detta. sad


Kommentera

Fix Internet Explorer 9

Publicerat: 2013-04-22 20:20:16 | Kategori: Uppdateringar

Då var det dags igen! På jobbet idag så uppmärksammade jag att hemsidan såg helt förskräcklig ut i Internet Explorer 9! Det blev att sitta nästan en timma med CSS-filen för att lyckas åtgärda det något sånär. Logotypen ser ännu hemsk ut, men i övrigt ser sidhuvudet äntligen bra ut. Ändringarna är enligt nedan:

.Logo2 {
 position:relative;
 top:-90px;
 margin-bottom: -90px;
 height: 100%;
 opacity:0.5;
 filter:alpha(opacity=50);
 background-image: url('images/rpi2.png');
}

IE9 lägger uppenbarligen till en rejäl marginal längst ner om man sätter ett toppvärde. Inte nog med det, höjden var ännu fel om man angav det i pixlar så det blev att ändra till procent. Sist men inte minst så hamnade bakgrundsbilden helt galet, så det blev att beskära den precis perfekt. cheeky

Andra uppdateringar:

Dvs endast administrationsuppdateringar, men de behövs kan jag lova!


Kommentera

Logotyp och Arkiv

Publicerat: 2013-04-22 00:15:15 | Kategori: Uppdateringar

Nu var det dags för en kvällsuppdatering. Ett antal uppdateringar är gjorda enligt nedan:

Det kommer mycket snart att komma ett inlägg om hur arkivet kodades. ;)


Kommentera

«« Äldre inlägg