Gå til innhold

PHP query - ignorere nyeste raden


Anbefalte innlegg

Hei!

 

Jeg har en kode hvor jeg ønsker å ignorere nyeste resultatet. Dvs. nyeste "nyheten" i databasen. Slikt at koden viser nest nyeste nyheten og alle bakover men ikke den nyeste. Dette grunnet jeg har en slags "se på meg" div rund den nyeste hvor dem fremheves.

 

Akkurat nå er det løst slikt:

 

$query = " SELECT * FROM nyhet " .

" WHERE NOT nyhet_kategori = '3' ORDER BY nyhet_id desc LIMIT $offset, $rowsPerPage";

$result = mysql_query($query) or die('Error, query failed');

 

Da er nyheten som fremheves lagt i en egen kategori. Men dette er for tungvindt nå som vi publiserer nyheter daglig.

 

Håper noen kan hjelpe meg her :)

Lenke til kommentar
Videoannonse
Annonse

Du vil hente ut fra databasen på bakgrunn av hvordan det skal vises? Vanvittig galt!

Uansett, følgende spørring vil hente ut alt med unntak av raden med høyest ID.

 

SELECT * FROM nyhet ORDER BY nyhet_id DESC OFFSET 1

Edit: For å spesifisere litt; du kan bruke CSS til å fremheve første nyhet.

Endret av Jonas
Lenke til kommentar

Takk for svar, skal teste det.

 

Men hvordan ville du personlig gjort det da?

 

--

 

Edit:

 

 

$query = " SELECT * FROM nyhet " .

" ORDER BY nyhet_id DESC OFFSET 1 desc LIMIT $offset, $rowsPerPage";

$result = mysql_query($query) or die('Error, query failed');

 

Query Failed

Endret av uranus
Lenke til kommentar
Men hvordan ville du personlig gjort det da?

Jeg ville, som sagt, brukt CSS. Ta en titt på :first-child. Satt sammen et simpelt eksempel.

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>News n stuff y0</title>
	<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
	<style type="text/css">
		* {
			margin: 0;
			padding: 0;
		}
		#content {
			width: 400px;
		}
			#content .news {
				float: left;
				width: 200px;
				margin-top: 10px;
			}
				#content .news:first-child {
					width: 400px;
				}
	</style>
</head>
<body>
	<div id="content">
		<div class="news">
			<h1>Lorem Ipsum</h1>
			<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
		</div>
		<div class="news">
			<h1>Phasellus</h1>
			<p>Nulla nec tortor quis elit facilisis tincidunt. Proin sed velit lorem, quis pulvinar massa.</p>
		</div>
		<div class="news">
			<h1>Duis gravida</h1>
			<p>Suspendisse mollis ante ac diam sodales in molestie quam euismod.</p>
		</div>
		<div class="news">
			<h1>Cum sociis</h1>
			<p>Donec velit nisi, dapibus sit amet hendrerit pretium, dictum vel enim.</p>
		</div>
		<div class="news">
			<h1>Nunc eu</h1>
			<p>Morbi arcu metus, sollicitudin et eleifend et, malesuada quis sem.</p>
		</div>
	</div>
</body>
</html>

 

Hvis du finner det umulig å bruke :first-child, noe som kan være tilfelle, så er det ikke værre enn å printe ut første nyhet med en spesiell class e.l.

 

$query = " SELECT * FROM nyhet " .

" ORDER BY nyhet_id DESC OFFSET 1 desc LIMIT $offset, $rowsPerPage";

$result = mysql_query($query) or die('Error, query failed');

Spørringen feiler fordi OFFSET er definert to ganger. Dette er vel ikke tilfeldigvis en del av et pagination-script?

Endret av Jonas
Lenke til kommentar

Føler jeg gjentar meg litt nå - men bruk CSS! Slutt å tenke på at første nyhet skal vises annerledes, bare print de ut. Evt. gi den første en unik id/klasse. Dersom du absolutt vil hente ut første nyheten på den siden og resten hver for seg, så er det ikke verre enn å plusse på offset med én.

 

$query = 'SELECT * FROM nyhet ' .
'ORDER BY nyhet_id DESC LIMIT ' . ( $offset + 1 ) . ', ' . ( $rowsPerPage - 1 );
$result = mysql_query($query) or die('Error, query failed');

Endret av Jonas
Lenke til kommentar

Ok, vel - det offset nettopp gjør er å ignorere rader frem til det tallet. Du har allerede implementert OFFSET i koden din som en del av pagination, så ved å legge til én til OFFSET og trekke fra row count med én, så har du effektivt ignorert den første raden du i utgangspunktet skulle få ut. Alternativt så kan du hoppe over den første nyheten i det du printer de ut, hvorav måten er litt avhengig av hvordan du printer de ut.

 

<?php

$query = 'SELECT * FROM nyhet ' .
'ORDER BY nyhet_id DESC LIMIT ' . $offset . ', ' . $rowsPerPage;
$result = mysql_query($query) or die('Error, query failed');

// Ved å kalle mysql_fetch_array før while-løkken, så vil du hoppe over første resultat
mysql_fetch_array ( $result );
while ( $nyhet = mysql_fetch_array ( $result ) )
	print_r ( $nyhet );

?>

<?php

$query = 'SELECT * FROM nyhet ' .
'ORDER BY nyhet_id DESC LIMIT ' . ( $offset + 1 ) . ', ' . ( $rowsPerPage - 1 );
$result = mysql_query($query) or die('Error, query failed');

// Her har man hoppet over første resultat via SQL
while ( $nyhet = mysql_fetch_array ( $result ) )
	print_r ( $nyhet );

?>

Endret av Jonas
Lenke til kommentar

I where-loopen som echoer innholdet har du en $i som økes en per gang loopen går. Definer denne før loopen starter. Inne i while-loopen kjører du en if-statement som spørr om $i == 0, hvis den er det betyr det at loopen henter frem den første nyheten.

 

$i = 0;
while ....
{
if ($i == 0)
{
	  echo "første nyhets-design her!";
 }
 else
 {
	  echo "vanelige nyheter her =)";
  }
  $i++;
}

Lenke til kommentar

Hadde du hatt en decent array-like struktur som inneholder radene kunne du enkelt gjort dette i templatene dine (pdo / PDOStatement->fetchAll evt lage en array av radene i while-løkka):

<?php
// i controller
$entriesCollection = Entry::findAll();

// i template
$firstEntry = array_shift($entriesCollection);

// special template for $firstEntry

foreach ($entriesCollection as $entry) {
 // normal template
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...