webForumDet fria alternativet

Hämtar inte sista/första posten i databasen

Databaser & SQL

5 svar · 1 793 visningar · startad av Inferis

Medlem sedan sep. 2000667 inlägg
Frågan#1

Hej!
Vill någon själ förklara för mig varför jag inte får fram den första resp sista posten i databasen?

mysql_query("SET NAMES 'utf8'");

 $sql = mysql_query("select * from aktiviteter WHERE Datum > now() ORDER BY Datum ASC LIMIT 4");
 $row=mysql_fetch_array($sql);

while($row=mysql_fetch_array($sql))
 {

 $titeln=$row['Titel'];
 $id=$row['ID'];
 $msg=$row['Innehall'];
 $datumet=$row['Datum'];
 $adressen=$row['adress'];

$time  = strtotime($datumet);
$day   = date('d',$time);
$month = date('m',$time);
$year  = date('Y',$time);

echo "<li><div class='entry-meta'>";
echo "<span class='date'>$day</span><span class='month'>";
echo "$month";
echo "</span></div>";
echo "<h6><a href='aktiviteter.php?id=$id'>$titeln</a></h6>";
echo "<span class='place'>$adressen</span>";
echo "</li>";

}
Medlem sedan jan. 2005953 inlägg
#2

Mellan anropet till mysql_query och din while-loop så anropar du mysql_fetch_array(). Det gör att du hämtar första raden i resultatet. Sen gör du ingenting med den raden, utan kör din while-loop där du hämtar nästa rad i resultatet.

P.S. mysql-funktionerna i PHP är deprecated vilket betyder att de kommer att försvinna i någon framtida version av PHP. Att använda sig av dessa funktioner är alltså inte att rekommendera. Titta gärna på mysqli eller pdo istället. D.S.

Medlem sedan sep. 2000667 inlägg
#3

Tack för svar.
Hur skulle det se ut med mysqli istället då?

Medlem sedan jan. 2005953 inlägg
#4

Med mysqli kan du välja att jobba antingen objektorienterat eller procedurellt.

Objektorienterat:

$mysqli = new mysqli("localhost", "user", "password", "database");
$res = $mysqli->query('SELECT * FROM aktiviteter WHERE Datum > now() ORDER BY Datum ASC LIMIT 4');
while ($row = $res->fetch_assoc()) {
    echo $row['Titel'], '<br />';
}

Procedurellt:

$mysqli = mysqli_connect("localhost", "user", "password", "database");
$res = mysqli_query($mysqli, "SELECT * FROM aktiviteter WHERE Datum > now() ORDER BY Datum ASC LIMIT 4");
while ($row = mysqli_fetch_assoc($res)) {
    echo $row['Titel'], '<br />';
}

Själv gillar jag PDO väldigt mycket, det är då enklare om man i framtiden vill byta till en annan typ av databas, t.ex. postgreSQL. Med PDO är det objektorienterat som gäller :)

PDO:

$pdo = new PDO('mysql:dbname=database;host=localhost', 'user', 'password');
$sql = 'SELECT * FROM aktiviteter WHERE Datum > now() ORDER BY Datum ASC LIMIT 4';
foreach ($pdo->query($sql) as $row) {
    echo $row['Titel'], '<br />';
}

Både mysqli och pdo har stöd för prepared statements vilket hjälper till att skydda mot sql injections.

Medlem sedan juni 20006 031 inlägg
Medlem sedan sep. 2000667 inlägg
#6

Tack för ett väldigt utförligt svar, metalboy! Och tack Pedda för länken!

257 ms totalt · 3 externa anrop · v20260731065814-full.767b4345
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)