Avatar billede compac Seniormester
12. marts 2012 - 15:44 Der er 11 kommentarer og
1 løsning

PHP-arrays i javascript

Jeg forsøger at lave et lysbilledeshow, hvor input skal komme fra en mysql-database.
Jeg kan imidlertid ikke få det aktiveret. Der sker intet når jeg trykker på knapperne. Valget af id fra databasen fungerer udmærket.
Problemet ligger sikkert i javascriptkoden.
Her er koden:

<?php
$idtur = $_GET['gpstur'];
session_start();
include("gpsadmin/conn.php");

$sql = "select * from $udflugter where id = '$idtur'";
$result=mysql_query($sql) or die(mysql_error());

while($row=mysql_fetch_array($result)){
            $date = date('d-M-Y',strtotime($row['dato']));
                $titel = $row['titel'];
            $gpxfile = $row['sted'];
            $fotoxml = $row['fotoxml']; 
            $dir = $row['mappe'];                 
              $tur = $dir."/".$gpxfile;   
        }
$files = array();
foreach (scandir($dir) as $f)    {
        if  (strcasecmp(substr($f, strlen($f) - 4), ".jpg") == 0)  {
              $files[] = $f;
              //find antal billeder i mappe
              $i = ($i++);
              }           
  }   
?>
<HTML>
<HEAD>
<TITLE>Et pænt lysbilledshow...</TITLE>
<SCRIPT LANGUAGE = "JAVASCRIPT">
var VisBillede = new Array("<?php echo implode('","',$files)?>");
AktueltBillede = 0; AntalBilleder = VisBillede.length -1;

StartStopStatus = 0;

function SkiftBillede(Retning) {
if (AktueltBillede <= AntalBilleder) {
AktueltBillede = AktueltBillede + Retning;
if (AktueltBillede > AntalBilleder) {
AktueltBillede = 0;
}

if (AktueltBillede < 0) {
AktueltBillede = AntalBilleder;
}
Lysbillede.src = VisBillede[AktueltBillede];
}
}

function AutoAfspil() {
if (StartStopStatus == 1) {
startstop.src = "StartKnap.jpg"
tilbage.src ="TilbageKnap.jpg"
frem.src="FremKnap.jpg"
StartStopStatus = 0;
clearInterval(Pause);

}
else if (StartStopStatus == 0) {
startstop.src = "StopKnap.jpg"
tilbage.src ="TilbageKnapGraa.jpg"
frem.src="FremKnapGraa.jpg"
StartStopStatus = 1;
Pause = setInterval("SkiftBillede(1)", 1000);
}
}
</SCRIPT>
</HEAD>
<BODY>
<p align="center"><font face="Arial" size="3">Brug knapperne til at navigere mellem billederne</font></p>
<div align="center"><center>
<table border="1" width="10%" bordercolorlight="#FFFFFF"
bordercolordark="#FFFFFF">
<tr>
<td><a href="java script:SkiftBillede(-1)"><img border="0" img src="TilbageKnap.jpg" name="tilbage"></td>
<td><a href="java script:AutoAfspil()"><img border="0" img src="StartKnap.jpg" name="startstop"></td>
<td><a href="java script:SkiftBillede(1)"><img border="0" img src="FremKnap.jpg" name="frem"></td>
</tr>
</table>
</center>
</div>
<p align="center">
<img src="11.jpg" name="Lysbillede">
<div align="center">
</BODY>
</HTML>
Avatar billede michael_stim Ekspert
12. marts 2012 - 16:13 #1
Du mangler i hvert fald et ; her:

var VisBillede = new Array("<?php echo implode('","',$files)?>");

Skal være:

var VisBillede = new Array("<?php echo implode('","',$files);?>");
Avatar billede olebole Juniormester
12. marts 2012 - 16:52 #2
<ole>

@michael_stim: Nej, der mangler ikke et semikolon. Det må gerne stå der - men det er ingenlunde nødvendigt  =)

@compac: Prøv at vise os en kopi af din JS-kildekode fra browseren.

Du skriver i øvrigt en ret bedaget kode. Du mangler en DTD før HTML tagget - og så er det mange år siden, language attributten blev deprecated på SCRIPT tagget. Brug i stedet:

<script type="text/javascript">

Prøv også at læse denne guide om prepared statements. Din MySQL-kode er forældet og yderst usikker. Denne guide om fejlmeddelelser kunne du også have godt af at læse  =)

/mvh
</bole>
Avatar billede compac Seniormester
12. marts 2012 - 17:34 #3
<SCRIPT LANGUAGE = "JAVASCRIPT">

var VisBillede = new Array("P1030446.jpg","P1030447.jpg","P1030450.jpg","P1030453.jpg","P1030454.jpg","P1030459.jpg","P1030463.jpg");



AktueltBillede = 0; AntalBilleder = VisBillede.length -1;



StartStopStatus = 0;



function SkiftBillede(Retning) {

if (AktueltBillede <= AntalBilleder) {

AktueltBillede = AktueltBillede + Retning;

if (AktueltBillede > AntalBilleder) {

AktueltBillede = 0;

}



if (AktueltBillede < 0) {

AktueltBillede = AntalBilleder;



}

alert(VisBillede[AktueltBillede]);

Lysbillede.src = VisBillede[AktueltBillede];

}

}



function AutoAfspil() {

if (StartStopStatus == 1) {

startstop.src = "StartKnap.jpg"

tilbage.src ="TilbageKnap.jpg"

frem.src="FremKnap.jpg"

StartStopStatus = 0;

clearInterval(Pause);



}

else if (StartStopStatus == 0) {

startstop.src = "StopKnap.jpg"

tilbage.src ="TilbageKnapGraa.jpg"

frem.src="FremKnapGraa.jpg"

StartStopStatus = 1;

Pause = setInterval("SkiftBillede(1)", 1000);

}

}

</SCRIPT>
Jeg prøvede at indsætte en alert  og den viser filnavnet.
Avatar billede michael_stim Ekspert
12. marts 2012 - 18:44 #4
#2
Hmm olebole, må ærligt indrømme at jeg var lidt tvivlsom til dine udtalelser om manglende semikolon. Men jeg testede det lige og minsandten om du ikke har ret. Det anede jeg faktisk ikke, men man lærer sig noget nyt hver dag. Der har altid stået i mine php-bøger at man ALTID skal afslutte med ;
Avatar billede DeeDawg Nybegynder
12. marts 2012 - 20:11 #5
@michael_stim: Det gør der, fordi det altid er en god idé at sætte det der. Begynder du at blive vandt til, ikke at sætte dem, så vil der være gode chancer for at du ville glemme det på andre tidspunkter, hvor det netop er nødvendigt.

Kan kun lade sig gøre her, fordi der ikke angives andet kode, end den ene linje. :)
Avatar billede olebole Juniormester
12. marts 2012 - 21:36 #6
@DeeDawg: Ikke helt præcist  =)

Det har ikke som sådan noget at gøre med antal af linjer. Man kan sagtens skrive kode over flere linjer uden de skal adskilles af semikolon:

<?php
$foo = 'en tekst'
    . ' og lidt mere';

$bar = 'noget helt andet';
?>

Reglen siger, at i PHP skal statements adskilles af semikolon - hvad enten de står på én eller flere linjer. Dog opfattes lukke tagget altid som et semikolon.

Du kan derfor godt skrive:

<?php
$foo = 'en tekst'
    . ' og lidt mere';
$bar = 'noget helt andet'
?>

- selvom det ikke er klogt  =)

Da lukke tagget er valgfrit, kan du også skrive:

<?php
$foo = 'en tekst'
    . ' og lidt mere';
$bar = 'noget helt andet';

- mens dette vil fejle:

<?php
$foo = 'en tekst'
    . ' og lidt mere';
$bar = 'noget helt andet'

- fordi der hverken er semikolon eller lukke tag.

Personligt udelader jeg kun semikolon, når jeg har åbne og lukke tags med et statement imellem stående på én linje ... men der udelader jeg det til gengæld også (næsten) altid  =)
Avatar billede olebole Juniormester
12. marts 2012 - 21:52 #7
@compac: Dit JavaScript er oldgammelt og kan ikke fungere i moderne browsere. Jeg har skrevet din kode lidt om, men det er stadig noget semiskod:

<?php
$idtur = $_GET['gpstur'];
session_start();
include("gpsadmin/conn.php");

$sql = "select * from $udflugter where id = '$idtur'";
$result=mysql_query($sql) or die(mysql_error());

while($row=mysql_fetch_array($result)){
            $date = date('d-M-Y',strtotime($row['dato']));
                $titel = $row['titel'];
            $gpxfile = $row['sted'];
            $fotoxml = $row['fotoxml']; 
            $dir = $row['mappe'];                 
              $tur = $dir."/".$gpxfile;   
        }
$files = array();
foreach (scandir($dir) as $f)    {
        if  (strcasecmp(substr($f, strlen($f) - 4), ".jpg") == 0)  {
              $files[] = $f;
              //find antal billeder i mappe
              $i = ($i++);
              }           
  }   
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Et pænt lysbilledshow...</title>
<script type="text/javascript">
var VisBillede = new Array("<?php echo implode('","',$files)?>");
var AktueltBillede = 0;
var StartStopStatus = 0;
var Lysbillede = null;
var startstop = null;
var tilbage = null;
var frem = null;
var Pause = null;
AntalBilleder = VisBillede.length -1;

function SkiftBillede(Retning) {
    if (AktueltBillede <= AntalBilleder) {
        AktueltBillede = AktueltBillede + Retning;
        if (AktueltBillede > AntalBilleder) {
            AktueltBillede = 0;
        }
   
        if (AktueltBillede < 0) {
            AktueltBillede = AntalBilleder;
        }
        Lysbillede.setAttribute("src", VisBillede[AktueltBillede]);
    }
}
   
function AutoAfspil() {
    if (StartStopStatus == 1) {
        startstop.src = "StartKnap.jpg"
        tilbage.src ="TilbageKnap.jpg"
        frem.src="FremKnap.jpg"
        StartStopStatus = 0;
        clearInterval(Pause);
    }
    else if (StartStopStatus == 0) {
        startstop.src = "StopKnap.jpg"
        tilbage.src ="TilbageKnapGraa.jpg"
        frem.src="FremKnapGraa.jpg"
        StartStopStatus = 1;
        Pause = setInterval("SkiftBillede(1)", 1000);
    }
}
window.onload = function() {
    Lysbillede = document.getElementById("Lysbillede");
    startstop = document.getElementById("startstop");
    tilbage = document.getElementById("tilbage");
    frem = document.getElementById("frem");
    Pause = document.getElementById("Pause");
}
</script>
</head>
<body>

<p align="center"><font face="Arial" size="3">Brug knapperne til at navigere mellem billederne</font></p>
<div align="center">
    <center>
    <table border="1" width="10%" bordercolorlight="#FFFFFF"
    bordercolordark="#FFFFFF">
    <tr>
        <td><a href="java script:SkiftBillede(-1)"><img border="0" src="TilbageKnap.jpg" id="tilbage"></td>
        <td><a href="java script:AutoAfspil()"><img border="0" src="StartKnap.jpg" id="startstop"></td>
        <td><a href="java script:SkiftBillede(1)"><img border="0" src="FremKnap.jpg" id="frem"></td>
    </tr>
    </table>
    </center>
</div>
<p align="center">
    <img src="11.jpg" id="Lysbillede">
<div align="center">



</body>
</html>

Du bør virkelig prøve at tjekke op på din MySQL-kode. Din database er lige til at smadre for enhver newbie, der måtte synes, den slags er sjovt!
Avatar billede DeeDawg Nybegynder
12. marts 2012 - 22:01 #8
Det var sådan set også det jeg mente, olebole. Men det tror jeg nu også godt du vidste. ;)
Avatar billede compac Seniormester
13. marts 2012 - 17:16 #9
Jeg vil gennemgå de artikler du henviser til olebole.

Der er nu kun et problem tilbage før denne kode virker.
Billederne i lysbilledeshowet bliver ikke vist. Det skyldes at  javascript-koden ikke får læst $dir = $row['mappe'] fra databasen.
Billederne ligger i mappen $row['mappe'].
Hvordan skal koden se ud så den kan få fat i billederne fra $dir=$row['mappe'] ?
Det er vel et stinavn der skal indføjes et sted.
Avatar billede olebole Juniormester
13. marts 2012 - 17:27 #10
Det må være noget i stil med:

foreach (scandir($dir) as $f)    {
    if  (strcasecmp(substr($f, strlen($f) - 4), ".jpg") == 0)  {
        $files[] = $dir.'/'.$f;
        //find antal billeder i mappe
        $i = ($i++);
    }           
}

Hvis det ikke virker, så prøv at kikke i kildekoden og ret PHP-scriptet til, så det passer med det, du skal bruge.
Avatar billede compac Seniormester
13. marts 2012 - 18:14 #11
Det var lige det der skulle til.
Tak for hjælpen og for dine råd undervejs.
Jeg har lagt mærke til at du ikke tager mod point.
Avatar billede olebole Juniormester
13. marts 2012 - 18:31 #12
Selvtak - og du har helt ret med hensyn til point  =)
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