Ik heb een tabel met meldingen en datums erbij:


CREATE TABLE `notifications` (
  `noteID` int(11) NOT NULL AUTO_INCREMENT,
  `content` text,
  `time` int(11) NOT NULL,
  PRIMARY KEY (`noteID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Nu wil ik alle meldingen met dezelfde datum bij elkaar zetten, als volgt:

23 september 2015
melding X
melding X

28 september 2015
melding X
melding X
melding X

12 oktober 2015
melding X

Hoe doe ik dat? Welke query moet ik dan uitvoeren?
Met `time` int(1) NOT NULL voor de datum en tijd gaat dat niet lukken.

Is dit de databasestructuur die je echt gebruikt of heb je die voor de vraag vereenvoudigd?
Nee, dit INT is 11 inderdaad... typfoutje...
Aanname: je gebruikt een timestamp als datum? (waarom gebruik je niet gewoon DATETIME of TIMESTAMP ipv INT?)

Je moet dus een nieuw kopje maken als we in een andere dag terecht komen.

<?php
$current = '';

// Hier een query die sorteert op datum en tijd!
$query = "SELECT * FROM notifications ORDER BY `time` DESC";
$result = mysqli_query($con, $query);

while($row = mysqli_fetch_assoc($result))
{
if($current != date('%d %F %Y', $row['time']))
{
$current = date('%d %F %Y', $row['time']);
echo '<h4>' . $current . '</h4>';
}

echo $row['content'] . '<hr>';
}
?>
Ik krijg een foutmelding op lijn 9, maar ik zie niet wat er precies fout....
haakje vergeten :-)
gebruik een php editor! (bijv. Netbeans)

[size=xsmall]Toevoeging op 17/06/2016 20:02:33:[/size]

en aangepast.
Dank!
Het vreemde is dat er drie testresultaten in de database staan, en de code geeft niets weer...
Kan het zijn dat er iets niet klopt aan de code?

Op een andere normale manier krijg ik de resultaten er wel uit...
- Je moet nog wel even connecten met de database host.
<?php
$con = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");

if(!$con)
{
echo "Error: Unable to connect to MySQL." . PHP_EOL;
echo mysqli_connect_error() . PHP_EOL;
exit;
}
?>


- zet PHP foutmeldingen aan door het volgende boven in je script te plaatsen:
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
?>
Nog even wat ophelderen: er is geen functioneel verschil tussen int(1) of int(11) of whatever je maar zou willen doen. Het getal staat voor padding, niet voor de grootte van het veld. Om ruimte in je database te besparen kun je het beste altijd de padding zo klein mogelijk houden.
Ben van Velzen op 17/06/2016 22:06:57

Nog even wat ophelderen: er is geen functioneel verschil tussen int(1) of int(11) of whatever je maar zou willen doen. Het getal staat voor padding, niet voor de grootte van het veld. Om ruimte in je database te besparen kun je het beste altijd de padding zo klein mogelijk houden.

Het kan zijn dat ik het verkeerd lees, maar in je laatste zin lijk je te suggereren dat een int(11) meer opslagruimte zou kosten dan een int(1).

Voor de duidelijkheid: een integer kost altijd 4 bytes, ongeacht of het een int(1) is of een int(256). Die breedte/padding is alleen voor display-doeleinden, en eigenlijk nog het meest nuttig in combinatie met de optie zerofill. Het ontwikkelteam van MySQL zit er zelfs over te denken om die lengteaanduiding en de zerofill-optie deprecated te verklaren, omdat ze bij teveel gebruikers voor verwarring zorgen.
Als er een like knop onder jouw bericht zat dan zou je er een like bij hebben Willem. :-)

Reageren