12. august 2008 - 12:07Der er
27 kommentarer og 1 løsning
Visning af MySQL udtræk der skifter uden refresh af skærm
Hejsa
Jeg har en skærm der bare står og er bruges som en slags infoskærm.
Der vises bl.a. et skema som ser sådan ud her: ___________________ <u>|Hvornår|Hvad|Hvor|</u> <u>|Kl. 17 |Kage|Her |</u>
Kl. 17, Kage og Her er udtræk fra en MySQL database. Men der er flere entries i databasen, som skal vises. Findes der et PHP script der gør at man kan skifte til næste entry i databasen automatisk efter ca. 10 sekunder. Der bliver løbende tilføjet og slettet i databasen, men infoskærmen bliver aldrig refreshet, så scriptet skal gerne kunne håndtere det også :-)
Nej, der findes ikke et sådan script, da PHP jo kun udføres ved sideload. Derfor ville din løsning kræve JavaScript og brug af AJAX, og den ville blive temmelig avanceret.
Øv øv :-) JavaScript kan jeg finde ud af nogen lunde, men AJAX har jeg aldrig rørt ved.
En løsning kunne være at lave et script der refresher siden og så tager en tilfældig entry og viser, men det er ikke helt holdtbart. Kan man lave et der refresher og så tager næste entry i databasen?
hmm, hvordan er det nu lige jeg erstatter de "200"?
Min kode ser sådan ud her:
sql100 = "SELECT id, tid, hvad, hvor, dato FROM info LIMIT 1 WHERE id > $_GET['id'] ORDER BY id"; $tilmeldt100 = @mysql_query($sql100); if (!$tilmeldt100) { exit('Databasefejl omkring linie 47: ' . mysql_error()); }
Hvilket giver: Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\xampp\htdocs\FO\info.inc.php on line 17
Line 17 er dato FROM info LIMIT 1 WHERE id > $_GET['id'] ORDER BY id";
sql100 = "SELECT id, tid, hvad, hvor, dato FROM info LIMIT 1 WHERE id > ".$_GET['id']." ORDER BY id"; $tilmeldt100 = @mysql_query($sql100); if (!$tilmeldt100) { exit('Databasefejl omkring linie 47: ' . mysql_error()); }
Derfor kommer den til at indeholde "200" eller hvad der nu står.
Og jeg kan ikke sige, præcis hvordan du erstatter de "200" i metatagget. Først skal du jo hente id'et fra databasen (det er vist det, du gør i den kode, du lige viste), og så kan du f.eks. indsætte det sådan her:
dato FROM info LIMIT 1 WHERE id > ".$_GET['id']." ORDER BY id";
giver
Databasefejl omkring linie 47: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id > ORDER BY id' at line 5
og hvor kommer $rs fra. Den skal da erklæres et eller andet sted?
Den fejl får du, når der ikke står ?id=noget i sidens adresse, så det må du sikre dig, der altid gør. Og $rs skal du selv lave. Det er den variable, som du skal lægge posten fra databasen over i, når sql'en bliver kørt.
Nu står der noget i i ?id :-) $rs hedder i mit tilfælde $f0
men den giver nu
Databasefejl omkring linie 47: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id > 1 ORDER BY id' at line 5
Den laver $_GET['id'] om til 1 i det her tilfælde, men den kan ikke rigtig forstå det.
Det er lidt mystisk. Jeg flyttede LIMIT og så virkede det. Men så testede jeg igen og får nu denne fejl:
Databasefejl omkring linie 47: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY id LIMIT 1' at line 5
men skriver jeg feks info.inc.php?id=2 (som filen hedder) i adresselinien så virker det og den reresher og henter næste indtil der ikke er flere. Så går den i stå. Der skal jeg lige ha den til at starte forfra.
Hvis du vil gå efter en lækker og simpel løsning, så kunne du kigge på javascript frameworket jQuery - der er mange der ikke er vilde med det fordi det ikke bruger valid javascript kode - men det virker 100% og crossbrowser. www.jquery.com
Hvis du inkluderer filerne på din side, kan du meget simpelt køre:
eller du kan hente det højeste id ud fra databasen "SELECT MAX(id) FROM info" og så enten lave en if sætning der undersøger om du netop har udtrukket den sidste record i din SELECT id, tid, hvad.... og nulstille, eller du kan lave en modulus beregning hvor du tager modulus MAX(id) af dit $rs['id']
if (mysql_num_rows($nyheder) = 0) { // LINE 18 sql = "SELECT id, tid, hvad, hvor, dato FROM info LIMIT 1 ORDER BY id"; } else {
if (mysql_num_rows($nyheder) > 0) { while ($f0 = mysql_fetch_array($nyheder)) { ?> // HER HENTER DEN NYHERDERNE I RÆKKE FØLGE } } Men siger Fatal error: Can't use function return value in write context in C:\xampp\htdocs\FO\info.inc.php on line 18
Men det vil den tydeligvis ikke være med til. Hvordan tjekker jeg om rekordsettet er tomt?
Bossyboy, Tak for indputtet, men den anden løsning viker mere simpelm, hvis jeg da kan få den til at virke :-)
Nå, jeg kan simpelthen ikke få det at virke. Så nu vil jeg prøve med det der MAX(id), men jeg ved ikke lige hvordan jeg nulstiller eller hvordan jeg laver en modulus beregning.
Det med at jeg ikke åbner PHP igen var bare en fejl i indlægget. Jeg åbner det i den rigtige kode, men det er jo selvfølgelig svært se :-)
Men her er koden som jeg har forsøgt mig med, som ikke virker og giver den overstående fejlmelding:
<?php
if (mysql_num_rows($nyheder) = NULL) {
sql = "SELECT id, tid, hvad, hvor, dato FROM info LIMIT 1 ORDER BY id"; $nyheder = @mysql_query($sql100); if (!$nyheder) { exit('Databasefejl omkring linie 47: ' . mysql_error()); }
} else {
$sql100 = "SELECT id, tid, hvad, hvor, dato FROM info WHERE id > " . $_GET['id'] . " LIMIT 1"; $nyheder = @mysql_query($sql100); if (!$nyheder) { exit('Databasefejl omkring linie 47: ' . mysql_error()); }
if (mysql_num_rows($nyheder) > 0) { while ($f0 = mysql_fetch_array($nyheder)) { ?>
Din while i næste linje kører kun, så længe der er poster. Bortset fra det har jeg lidt svært ved at se fejlen. Hvis jeg selv oplevede det problem, ville jeg bruge udelukkelsesmetoden. Dvs. fjerne nogle dele af koden og teste. Er fejlen der stadig, indsætter jeg de slettede dele igen, og prøver at fjerne noget andet.
Den siger der er fejl i denne linie: if (mysql_num_rows($nyheder) = NULL) { med fejlbeskrivelsen: Fatal error: Can't use function return value in write context in C:\xampp\htdocs\FO\info.inc.php on line 4
Jeg prøvede at slette if (mysql_num_rows($nyheder) > 0) { Det gav ikke noget. Men jeg må jo prøve at slette nogle andre ting.
Nu har jeg opdaget et par små fejl og rettet dem bl.a. lavet
if (mysql_num_rows($nyheder) = NULL) {
om til
if (mysql_num_rows($nyheder) == NULL) {
Så det ser sådan ud:
-----------------------
<?php include 'db_connect.inc.php';
if (mysql_num_rows($nyheder) == NULL) {
$sql = "SELECT id, tid, hvad, hvor, dato FROM info LIMIT 1 ORDER BY id"; $nyheder = @mysql_query($sql); if (!$nyheder) { exit('Databasefejl omkring linie 14: ' . mysql_error()); }
} else {
$sql100 = "SELECT id, tid, hvad, hvor, dato FROM info WHERE id > " . $_GET['id'] . " LIMIT 1"; $nyheder = @mysql_query($sql100); if (!$nyheder) { exit('Databasefejl omkring linie 26: ' . mysql_error()); }
Men den giver den her fejl: -------- Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\FO\info.inc.php on line 4 Databasefejl omkring linie 14: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY id' at line 5 --------- Men det er vel ikke så mærkeligt når $nyheder ikke er defineret i linie 4? Jeg har virkelige ingen anelse om hvad jeg skal gøre.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.