Avatar billede zidane5 Nybegynder
07. oktober 2011 - 10:39 Der er 37 kommentarer og
1 løsning

Få følgende kode til at vise tilfældigt tekst automatisk efter xx sek

Hej. Er der nogle der kan hjælpe mig med følgende forespørgelse.

Jeg benytter php fusion, og ønsker at nedenstående kodes indhold automatisk skifter efter nogle sekunder. Jeg har lavet det så den viser tilfældige "testimonals", men kan ikke få det andet til at virke..

Nogle der kan hjælpe?

<div id="testimonials" class="fivecol last">
  <?php
$result=dbquery("
  SELECT user_id, user_name, user_status, user_testimonial 
  FROM ".DB_USERS."
  WHERE user_status = '0'
  AND user_testimonial !=''
  AND user_approve !='1'
  ORDER BY RAND() LIMIT 1
"); ?> <?php while($data = dbarray($result)): ?>
  <blockquote>
  <?php $text = nl2br(censorwords($data['user_testimonial'])); ?>
  </blockquote>
  <blockquote>
<?php echo trimlink($text, 50); ?></br></br>
  &ndash;&nbsp;<?php echo profile_link($data['user_id'], $data['user_name'], $data['user_status']); ?>  </blockquote>
<?php endwhile ?>
</div>
07. oktober 2011 - 23:29 #1
Virker din kode så langt, at du får udskrevet et tilfældigt testimonials?  Men at du gerne vil have et nyt tilfældigt testimonial efter for eksempel 5 sekunder?  Hvad med at bruge funktionen sleep(5) ?  For eksempel:

while(true)
{
  $result=dbqueq(SELECT user_id, user_name......[o.s.v. som i din kode]);
  [resten af din koden der placerer resultatet af queryen i variabler og udskriver disse];
  sleep(5);
}

Det skulle resultere i (ikke testet) at din oprindelige kode (forudsat at den virker) bliver gentaget hver femte sekund, hver gang resulterende i en ny testimonial.
Avatar billede olebole Juniormester
08. oktober 2011 - 03:26 #2
<ole>

Det kan absolut ikke anbefales, da det suger kraftigt på serveren. Mon ikke Ajax er løsningen?

/mvh
</bole>
Avatar billede zidane5 Nybegynder
08. oktober 2011 - 12:17 #3
Christian_Belgien: Jeg er ikke så meget inde i php, kan du vise hvordan koden præcist skal se ud, fordi den giver fejlmeldinger..

olebole: Hvad vil du så anbefale?
08. oktober 2011 - 15:17 #4
zidane, hvis du nu fra anden side får konkret hjælp til en bedre og mere økonomisk løsning (og jeg kikker med, for jeg er også ivrig efter at udvide mit repetoire) er der måske ingen grund til at kikke nærmere på mit forslag.

Hvis du alligevel vil kikke videre, så har jeg først et spørgsmål:

Du siger "Jeg har lavet det så den viser tilfældige testimonials, men jeg kan ikke få DET ANDET til at virke".  Jeg gik derfor ud fra, at visningen af tilfældige testimonials virker efter hensigten.  Derfor kikkede jeg ikke indeni koden.  (Der er nogle tags jeg ikke kender, velsagtens fordi jeg ikke har arbejdet med phpfusion.)  Så mit spørgsmål er, om det er korrekt, at visning af en enkelt tilfældig testimonial virker upåklageligt?  Hvis der er problemer dermed, er det naturligis disse vi skal kikke på først og foreløbigt glemme resten.

Så grunden til dit spørgsmål var (antog jeg altså,) at du gerne ville have visningen af en tilfældig testimonial gentaget hvert femte sekund. Jeg foreslog som den enkleste løsning (som ikke alle er enige i) at placere den virkende kode i en løkke og placere en 5 sekunders sleep deri.  Men jeg var doven, så jeg viste kun selve while løkken og sleep funktionen og  antog at du  selv kunne pusle syntaksen på plads, såsom med de korrekte php åbnings og slut tags.  Men jeg deler nu din kode i tre dele, hvoraf del1 = <div id="testimonials" class="fivecol last"> , del3 = </div> , og del 2 er alt derimellem. Så en måde at gøre det på er denne:

din del1

<?php
while(true)
{
?>

din del2

<?php
}
?>

din del 3

Hvis du gør således, får du så stadig fejlmeldinger? I så fald, fortæl hvilke fejlmeldinger det er.
Avatar billede olebole Juniormester
08. oktober 2011 - 16:31 #5
Fingeret streaming ved hjælp af while-løkker og sleep er noget, der fleste begyndere skal igennem - men man finder hurtigt ud af, det er en håbløs fremgangsmåde.

Situationer som denne er, hvad Ajax blev skabt til. Derfor ville det nok være en idé at kikke på Ajax, men det er ikke noget, man lærer på en eftermiddag ... eller 20  =)
09. oktober 2011 - 06:50 #6
zidane, det skal nok være rigtigt, at du og jeg er begyndere, der som led i vores udvikling skal igennem fingeret streaming og lignende, og at moden programmering gør brug af teknikker som Ajax.  For mit eget vedkommende hører Ajax til de ting jeg har i sinde at lære at beherske (men for tiden er jeg optaget af at lave componenter til joomla, noget der heller ikke kan læres på en eftermiddag eller 20.)  Så en fornuftig løsning ville uden tvivl være at du giver dig til at investere den nødvendige tid i at lære Ajax og i mellemtiden stopper dette projekt og lukker spørgsmålet (med point til dig selv.)

Hvis du på den anden side foretager det informerede valg, at du for nærværende vil bruge en php løsning, vel vidende, at der er løsninger, der suger mindre på serveren (et valg, som i så tilfælde må respekteres af alle,) så vil jeg godt være med. I så fald venter jeg på din reaktion på #4.
Avatar billede zidane5 Nybegynder
09. oktober 2011 - 12:12 #7
Jeg har gjort som du bad, og kan squ ikke længere åbne serveren. Den siger serveren er overbelastet og at jeg ska prøve på et andet tidspunkt :(
Avatar billede olebole Juniormester
09. oktober 2011 - 14:33 #8
Flot Christian! Så meget for "informerede valg"!
Avatar billede zidane5 Nybegynder
09. oktober 2011 - 14:54 #9
:(kan du ikke hjælpe olebole?
Avatar billede olebole Juniormester
09. oktober 2011 - 15:01 #10
Du er formodentlig nødt til at reboote serveren, hvis du ikke kan fjerne scriptet via FTP
Avatar billede olebole Juniormester
09. oktober 2011 - 16:01 #11
@zidane5: Normalt vil et PHP script time ud i løbet af 30 sekunder. Hvis du undlader at kalde scriptet yderligere, burde du derfor kunne fjerne det efter et halvt minut.

Ligger serveren på nettet? Hvis det er tilfældet, administrerer du den så selv, eller ligger den under et hotel?
09. oktober 2011 - 17:26 #12
zidane, dit informerede valg var baseret på mit åbenbart ikke så informerede forslag.  Det beklager jeg dybt.  Det var altså ikke måden at gøre det på.
Avatar billede zidane5 Nybegynder
09. oktober 2011 - 18:45 #13
Jeg slettede det via. phpmyadmin , det fungerer nu..

Er der ingen der kan hjælpe mig med min forespørgelse?
Avatar billede olebole Juniormester
09. oktober 2011 - 19:06 #14
Hvor mange gange skal jeg nævne Ajax?

Du kan begynde her - men det er ikke noget, du lige kaster dig ud i. Du skal være temmelig stærk i JavaScript, DOM, CSS og PHP.

Du kan sagtens læse en masse såkaldte Ajax tutorials rundt om på nettet. Problemet er bare, at der ikke er nogen somhelst garanti for lødigheden af det skrevne.

At Christian anbefaler en bestemt kode/fremgangsmåde uden at forstå virkemåden af en helt elementær while-løkke, er desværre ikke et særsyn. Det synes derimod ofte at være normen. Foreløbig har vi brugt nettet til at opbygge et tvivlsomt mix af et Informationssamfund, et Misinformationssamfund og et Undeholdningssamfund ... der er lysår, til vi når Videnssamfundet  :o|
Avatar billede olebole Juniormester
09. oktober 2011 - 19:08 #15
PS: Gå i en gigantisk bue udenom w3schools.com, hvis tutorial stort set intet har med Ajax at gøre!
Avatar billede zidane5 Nybegynder
09. oktober 2011 - 19:14 #16
hehehe ja okaay .

Men problemet er, at jeg ikke er god til nogen af de dele du nævner. Det vil jo tage en evighed for mig, så derfor har jeg skrevet her på eksperten.

Jeg sætter dog pris på Christian_Belgien hjælpsomhed og forsøg på hjælp i det mindste har han forsøgt at hjælpe en dårlig programmør! :P
Avatar billede olebole Juniormester
09. oktober 2011 - 19:25 #17
Så vil jeg nok anbefale en helt simpel iframe, der bliver opdateret med 5 sekunders interval:


<iframe id="quotesFrame" src="quotes.php" style="width:300px;height:150px;" frameborder="0"></iframe>

<script type="text/javascript">
var elmQFrame = document.getElementById("quotesFrame");
function reloadQuote() {
    elmQFrame.setAttribute("src", "quotes.php?u="+new Date().getTime());
}
setInterval("reloadQuote()", 5000);
</script>

Avatar billede zidane5 Nybegynder
09. oktober 2011 - 19:33 #18
ja okay, hvor skal jeg indsætte koden henne ? Har prøvet med nedenstående, en den kan ikke finde det.. hvad skal jeg udskifte quotes.php med ?

<iframe id="quotesFrame" src="quotes.php" style="width:300px;height:150px;" frameborder="0">
<div id="testimonials" class="fivecol last">
  <?php
$result=dbquery("
  SELECT user_id, user_name, user_status, user_testimonial 
  FROM ".DB_USERS."
  WHERE user_status = '0'
  AND user_testimonial !=''
  AND user_approve !='1'
  ORDER BY RAND() LIMIT 1
"); ?> <?php while($data = dbarray($result)): ?>
  <blockquote>
  <?php $text = nl2br(censorwords($data['user_testimonial'])); ?>
  </blockquote>
  <blockquote>
<?php echo trimlink($text, 50); ?></br></br>
  &ndash;&nbsp;<?php echo profile_link($data['user_id'], $data['user_name'], $data['user_status']); ?>  </blockquote>
<?php endwhile ?>
</div>

</iframe>

<script type="text/javascript">
var elmQFrame = document.getElementById("quotesFrame");
function reloadQuote() {
    elmQFrame.setAttribute("src", "quotes.php?u="+new Date().getTime());
}
setInterval("reloadQuote()", 5000);
</script>
Avatar billede olebole Juniormester
09. oktober 2011 - 19:50 #19
Nej, du skal skrive præcis, som jeg gjorde. Din quotes-kode skriver du i filen quotes.php
09. oktober 2011 - 20:04 #20
zidane5, tak for de venlige ord i #16.  Jeg er lettet over, at du har fået serveren til at virke igen.
Avatar billede zidane5 Nybegynder
09. oktober 2011 - 22:24 #21
Jeg kan squ ikke få det til at virke :(

Har oprettet filen og indsat nedenstående, men får følgende fejlemelding:

Parse error: syntax error, unexpected T_LNUMBER in /var/www/oddsportal.dk/public_html/administration/quotes.php on line 6

Har sat følgende ind i quotes.php:

<div id='testimonials' class='fivecol last'>
  <?php
$result=dbquery('
  SELECT user_id, user_name, user_status, user_testimonial 
  FROM '.DB_USERS.'
  WHERE user_status = '1'
  AND user_testimonial !=''
  AND user_approve !='1'
  ORDER BY RAND() LIMIT 1
'); ?> <?php while($data = dbarray($result)): ?>
  <blockquote>
  <?php $text = nl2br(censorwords($data['user_testimonial'])); ?>
  </blockquote>
  <blockquote>
<?php echo trimlink($text, 50); ?></br></br>
  &ndash;&nbsp;<?php echo profile_link($data['user_id'], $data['user_name'], $data['user_status']); ?>  </blockquote>
<?php endwhile ?>
</div>
Avatar billede olebole Juniormester
10. oktober 2011 - 14:29 #22
Prøv at vise resten af koden i quotes.php
Avatar billede olebole Juniormester
10. oktober 2011 - 14:46 #23
Du har rod i dine gåseøjne i din query. Sådan skal den se ud:


$result=dbquery("
  SELECT user_id, user_name, user_status, user_testimonial 
  FROM ".DB_USERS."
  WHERE user_status = '1'
  AND user_testimonial !=''
  AND user_approve !='1'
  ORDER BY RAND() LIMIT 1
"); ?>


- men du skal jo stadig have HTML, HEAD og BODY tags i dokumentet - ligesom du også skal have inkluderet filen med dine PHP fuktioner. Efter PHP fejlen at dømme, har du ingen af delene
Avatar billede zidane5 Nybegynder
10. oktober 2011 - 18:08 #24
Det virker stadig ikke. Får følgende fejlmelding:

Fatal error: Call to undefined function dbquery() in /var/www/oddsportal.dk/public_html/quotes.php on line 7

Har indsat nedenstående i quotes.php

<html>
<head>
</head>
<body>
<div id='testimonials' class='fivecol last'>
  <?php
$result=dbquery("
  SELECT user_id, user_name, user_status, user_testimonial 
  FROM ".DB_USERS."
  WHERE user_status = '1'
  AND user_testimonial !=''
  AND user_approve !='1'
  ORDER BY RAND() LIMIT 1
"); ?>
?> <?php while($data = dbarray($result)): ?>
  <blockquote>
  <?php $text = nl2br(censorwords($data['user_testimonial'])); ?>
  </blockquote>
  <blockquote>
<?php echo trimlink($text, 50); ?></br></br>
  &ndash;&nbsp;<?php echo profile_link($data['user_id'], $data['user_name'], $data['user_status']); ?>  </blockquote>
<?php endwhile ?>
</div>
</body>
</html>
Avatar billede olebole Juniormester
10. oktober 2011 - 20:01 #25
Ja, det er jo det, jeg skriver: "ligesom du også skal have inkluderet filen med dine PHP fuktioner". dbquery, dbarray, censorwords og profile_link er ikke defineret i koden, du viser.

Er det overhovedet kode, du selv har skrevet, eller er det noget, du har planket et eller andet sted?
Avatar billede JensPeterSvensson Nybegynder
12. oktober 2011 - 09:14 #26
Det her tager ikke 1 testimonial af gangen, men 100 og bruger Javascript til at skifte mellem det.

Fordele:
- Du undgår at alle dine brugere laver et server request hvert 5 sekund.
- Det virker.

Ulemper:
- Det ene request de laver downloader 100 testimonials, men antog disse var små, hvis du forventer at en bruger kan læse dem på 5 sekunder.
- Det virker ikke, hvis brugeren har deaktiveret javascript.
- Efter 500 sekunder, ser brugeren den første testimonial igen. (forudsat, at du har 100 eller flere testimonials.)
- Det er vigtigt at der ikke er noget blank space mellem blockquotesne indbyrdes og mellem det omkransende div tag.

<div id='testimonials' class='fivecol last'><?php
$result=dbquery('
  SELECT user_id, user_name, user_status, user_testimonial
  FROM '.DB_USERS.'
  WHERE user_status = '1'
  AND user_testimonial !=''
  AND user_approve !='1'
  ORDER BY RAND() LIMIT 100
');
$style = 'block';
while($data = dbarray($result)):
  $text = trimlink(nl2br(censorwords($data['user_testimonial'])), 50);
?><blockquote style="display:<?php $style;?>">
<?php echo $text; ?></br></br>
  &ndash;&nbsp;<?php echo profile_link($data['user_id'], $data['user_name'], $data['user_status']); ?> 
  </blockquote><?php
$style = 'none';
endwhile ?></div>
<script>
var testimonial = null;
function start_testimonials(){
  testimonial = document.getElementById('testimonials').firstChild;
  setInterval(switcher, 5000);
}
setTimeout(start_testimonials, 5000);
function switcher(){
  var n = testimonial.nextSibling;
  if(n == null){
    n = testimonial.parentNode.firstChild;
  }
  testimonial.style.display = 'none';
  testimonial = n;
  testimonial.style.display = 'block';
}
</script>
Avatar billede zidane5 Nybegynder
12. oktober 2011 - 12:23 #27
Jeg takker igen !

Sender du lige et svar med løsning :)
Avatar billede zidane5 Nybegynder
12. oktober 2011 - 12:29 #28
Men lige et spørgsmål mere. Kan jeg gøre sådan, at den ikke skifter, når mål opdaterer siden? For hver gang man gør det, så opdaterer den også..
Avatar billede JensPeterSvensson Nybegynder
12. oktober 2011 - 12:43 #29
Forstår ikke det spørgsmål.
Hvilken side og hvilket mål?

Men som udgangs punkt, hvis mål kræver at siden reloader helt kan det ikke undgåes da du så jo også reloader den kode jeg skrev.

Hvis mål opdateres bag ved via AJAX burde det ikke have nogen effekt på min kode.
Avatar billede zidane5 Nybegynder
12. oktober 2011 - 12:47 #30
Der skulle ikke stå mål hehe.. Der skulle stå man. Når man opdatere siden, fordi så kommer bliver boksen automatisk dobbelt så stor, fordi det næste testimonal stå under den..
Avatar billede JensPeterSvensson Nybegynder
12. oktober 2011 - 13:00 #31
Det lyder ikke rigtigt, og min egen test kode gør ikke det.

Det eneste problem jeg kan med mit forslag er vist du ikke har en fast størrelse på testimonials div'en. Det ville gøre at de individuelle testimonial ændrer størrelsen på elementet i sidens layout og dermed kan få alt til at rykke sig.
Avatar billede zidane5 Nybegynder
12. oktober 2011 - 13:20 #32
hmm okaay. Altså jeg måtte ændrer lidt på det du gav mig, fordi det virkede ikke. Jeg har indsat nedenstående, det virker som det skal. Det eneste er, hver gang jeg opdaterer siden, så bliver boxen dobbelt så stor, fordi det næste testimonal stå under, men efter 5 sek, får den normal størrelse igen.


<div id='testimonials' class='fivecol last'><?php
$result=dbquery("
  SELECT user_id, user_name, user_status, user_testimonial
  FROM ".DB_USERS."
  WHERE user_status = '0'
  AND user_testimonial !=''
  AND user_approve !='1'
  ORDER BY RAND() LIMIT 100
");
$style = 'block';
while($data = dbarray($result)):
  $text = trimlink(nl2br(censorwords($data['user_testimonial'])), 50);
?><blockquote style="display:<?php $style;?>">
<?php echo $text; ?></br></br>
  <font size="1">&ndash;&nbsp;<?php echo profile_link($data['user_id'], $data['user_name'], $data['user_status']); ?></font>
  </blockquote><?php
$style = "none";
endwhile ?></div>
<script>
var testimonial = null;
function start_testimonials(){
  testimonial = document.getElementById('testimonials').firstChild;
  setInterval(switcher, 5000);
}
setTimeout(start_testimonials, 5000);
function switcher(){
  var n = testimonial.nextSibling;
  if(n == null){
    n = testimonial.parentNode.firstChild;
  }
  testimonial.style.display = 'none';
  testimonial = n;
  testimonial.style.display = 'block';
}
</script>
Avatar billede JensPeterSvensson Nybegynder
12. oktober 2011 - 13:32 #33
Er der et link til denne side?
Avatar billede zidane5 Nybegynder
12. oktober 2011 - 14:05 #34
Avatar billede JensPeterSvensson Nybegynder
12. oktober 2011 - 14:17 #35
aha

prøv at rette:

<?php $style;?>

til

<?php echo $style;?>
Avatar billede zidane5 Nybegynder
12. oktober 2011 - 14:46 #36
Jeg takker igen :)

Sender du lige et svar med pointgivning ?
Avatar billede JensPeterSvensson Nybegynder
12. oktober 2011 - 14:52 #37
svar
Avatar billede olebole Juniormester
12. oktober 2011 - 15:42 #38
Husk type attributten på script-tagget: <script type="text/javascript">
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