Avatar billede jost Nybegynder
12. august 2008 - 12:07 Der 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å :-)

Er der nogen der kan hjælpe?

Mvh

Jost
Avatar billede jost Nybegynder
12. august 2008 - 12:08 #1
Øv, jeg trode jeg kunne lave HTML :-)
Så ser skemaet kun sådan ud:
|Hvornår|Hvad|Hvor|
|Kl. 17 |Kage|Her |

:-)
Avatar billede w13 Novice
12. august 2008 - 12:11 #2
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.
Avatar billede jost Nybegynder
12. august 2008 - 12:51 #3
Ø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?
Avatar billede w13 Novice
12. august 2008 - 12:59 #4
Ja, det kan du vel principielt godt. :)
Avatar billede w13 Novice
12. august 2008 - 13:07 #5
I hvilken rækkefølge skal de vises, dvs. hvordan er de sorteret?
Avatar billede jost Nybegynder
12. august 2008 - 13:29 #6
De skal vises i ID'ens rækkefølge. Havde jeg umiddelbart tænkt mig :-)
Avatar billede w13 Novice
12. august 2008 - 13:47 #7
Det er også lettest sådan.

Så skal du bare lave det sådan, at du opdaterer siden efter 10 sekunder med dette metatag:

<meta http-equiv="Refresh" content="10;url=sammeside.php?id=200">

Så skal "200" bare erstattes af postens id.

Din PHP-kode skal så hente LIMIT 1 fra databasen: WHERE id > $_GET['id'] ORDER BY id

Så skulle du få det næste id. :) Hvis der ikke hentes noget, er det fordi du er ved sidste post, og så skal du bare hente første.
Avatar billede jost Nybegynder
12. august 2008 - 16:06 #8
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";

Og hvor er det nu jeg får $_GET['id'] fra?

/Jost
Avatar billede w13 Novice
12. august 2008 - 16:08 #9
Prøv med:

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());
}
Avatar billede w13 Novice
12. august 2008 - 16:10 #10
$_GET['id'] henter id fra adressen:

sammeside.php?id=200

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:

<meta http-equiv="Refresh" content="10;url=sammeside.php?id=<?php echo $rs['id']; ?>">

Forudsat at du har lagt posten i variablen $rs.
Avatar billede jost Nybegynder
12. august 2008 - 16:39 #11
Hmm

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?

/Jost
Avatar billede w13 Novice
12. august 2008 - 16:49 #12
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.
Avatar billede jost Nybegynder
12. august 2008 - 17:10 #13
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.
Avatar billede w13 Novice
12. august 2008 - 17:26 #14
Muligvis står limit 1 forkert. Skal det ikke stå efter ORDER BY id?
Avatar billede jost Nybegynder
12. august 2008 - 17:52 #15
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.

Men hvorfor virker det andet ikke?
Avatar billede __ak Nybegynder
12. august 2008 - 21:12 #16
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:

$('#id_på_feltet_der_skal_have_indholdet').load('siden_du_vil_loade.php');
Avatar billede jost Nybegynder
15. august 2008 - 10:57 #17
Jeg fik det til at virke med php og mysql'en

Jeg skal bare sørge for at kalde info.inc.php?id=1 fra start. For ellers er  $_GET['id'] ingenting (så vidt jeg har forstået)

Nu skal jeg bare ha den til at starte forfra når den har løbet tabellen igennem.
Er der nogle der nogle forslag der?

_ak, tak for forslaget, men jeg holder mig lige til den første løsning, men jeg skal da klart kigge på det der jquery.com :-)

/Jost
Avatar billede w13 Novice
15. august 2008 - 11:23 #18
Du kan jo bare tjekke, om dit recordset fra databasen er tom. Hvis det er det, skal du hente første post med:

sql = "SELECT id,
tid,
hvad,
hvor,
dato FROM info LIMIT 1 ORDER BY id";
Avatar billede bossyboy Nybegynder
15. august 2008 - 11:46 #19
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']
Avatar billede jost Nybegynder
15. august 2008 - 13:58 #20
hmm...
jeg prøver sådan her:

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 :-)
Avatar billede jost Nybegynder
18. august 2008 - 15:59 #21
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.

Jeg er temmelig lost her.

/Jost
Avatar billede w13 Novice
18. august 2008 - 16:02 #22
Prøv at vise, hvordan du prøvede før, dvs. hele din kode. F.eks. opstår fejlen ved "return value..." og det står der intet sted i det, du har vist.

Derudover lukker du PHP med ?> her:

    ?>
// HER HENTER DEN NYHERDERNE I RÆKKE FØLGE
}
}

Men som du ser, åbner du ikke igen.
Avatar billede jost Nybegynder
18. august 2008 - 16:18 #23
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)) {
    ?>

<meta http-equiv="Refresh" content="10;url=info.inc.php?id=<?php echo $f0['id']; ?>">

<div class="style2" id="info_iframe">

<table width="100%" border="0">
  <tr>
    <td width="24%"><a href="nyinfo.php" target="_parent">Hvornår</a></td>
    <td width="55%"><div align="center"><a href="nyinfo.php" target="_parent">Hvad</a></div></td>
    <td width="21%"><div align="right"><a href="nyinfo.php" target="_parent">Hvor</a></div></td>
  </tr>
  <tr>
    <td><?php echo $f0['tid']; ?></td>
    <td align="center"><?php echo $f0['hvad']; ?></td>
    <td align="right"><?php echo $f0['hvor']; ?></td>
  </tr>
 
<?php
  }
  }  else
  {
  ?>
  <table width="100%" border="0">
  <tr>
    <td width="24%"><a href="nyinfo.php" target="_parent">Hvornår</a></td>
    <td width="55%"><div align="center"><a href="nyinfo.php" target="_parent">Hvad</a></div></td>
    <td width="21%"><div align="right"><a href="nyinfo.php" target="_parent">Hvor</a></div></td>
  </tr>
  <tr>
    <td></td>
    <td align="center">INGEN INFORMATIONER FOR ØJEBLIKKET</td>
    <td align="right"></td>
  </tr>
  <?php
  }
}
  ?>
</table>
Avatar billede w13 Novice
18. august 2008 - 16:23 #24
Du behøver ikke if-sætningen:

if (mysql_num_rows($nyheder) > 0) {

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.
Avatar billede jost Nybegynder
18. august 2008 - 16:40 #25
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.
Avatar billede jost Nybegynder
19. august 2008 - 15:51 #26
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());
}





  while ($f0 = mysql_fetch_array($nyheder)) {
    ?>

<meta http-equiv="Refresh" content="10;url=info.inc.php?id=<?php echo $f0['id']; ?>">

<div class="style2" id="info_iframe">

<table width="100%" border="0">
  <tr>
    <td width="24%"><a href="nyinfo.php" target="_parent">Hvornår</a></td>
    <td width="55%"><div align="center"><a href="nyinfo.php" target="_parent">Hvad</a></div></td>
    <td width="21%"><div align="right"><a href="nyinfo.php" target="_parent">Hvor</a></div></td>
  </tr>
  <tr>
    <td><?php echo $f0['tid']; ?></td>
    <td align="center"><?php echo $f0['hvad']; ?></td>
    <td align="right"><?php echo $f0['hvor']; ?></td>
  </tr>
 
<?php
//}
} // else
  {
  ?>
  <table width="100%" border="0">
  <tr>
    <td width="24%"><a href="nyinfo.php" target="_parent">Hvornår</a></td>
    <td width="55%"><div align="center"><a href="nyinfo.php" target="_parent">Hvad</a></div></td>
    <td width="21%"><div align="right"><a href="nyinfo.php" target="_parent">Hvor</a></div></td>
  </tr>
  <tr>
    <td></td>
    <td align="center">INGEN INFORMATIONER FOR ØJEBLIKKET</td>
    <td align="right"></td>
  </tr>
  <?php
  }
}
  ?>
</table>
----------------------

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.
Avatar billede jost Nybegynder
19. april 2009 - 14:47 #27
w13 du har hjulpet meget, så vil du have nogle points. Ellers lukker jeg bare tråden igen.

/Jost
Avatar billede w13 Novice
20. april 2009 - 11:34 #28
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester