Avatar billede optur Novice
02. juni 2010 - 14:11 Der er 21 kommentarer og
1 løsning

Php galleri loop

Jeg er ved at prøve at lave et galleri som henter filnavnet ud fra en database. Jeg vil gerne have at den har en række med 3 billeder som så køre i loop, men problemet er at det er 3 ens billeder den smide ud. Hvordan kan jeg lave dette på en simpel måde så den tager en ny selv om jeg køre med en loop på 3?

kode:
<table id="tableid" cellpadding="0" cellspacing="0">
<tr><td colspan="3"><h2>Billedegalleri</h2></td></tr>
<?php
$resultat = mysql_query("SELECT * FROM $table ORDER BY id DESC");
while ($row = mysql_fetch_array($resultat)) {
extract($row);
echo '<tr>
<td><a href="images/'.$filename.'" rel="shadowbox" title="Billedegalleri"><img src="images/'.$filename.'" height="67" width="100" alt="Galleribillede" /></a></td>
<td><a href="images/'.$filename.'" rel="shadowbox" title="Billedegalleri"><img src="images/'.$filename.'" height="67" width="100" alt="Galleribillede" /></a></td>
<td><a href="images/'.$filename.'" rel="shadowbox" title="Billedegalleri"><img src="images/'.$filename.'" height="67" width="100" alt="Galleribillede" /></a></td>
</tr>';
}?>
</table>
</div>
Avatar billede public2 Nybegynder
02. juni 2010 - 14:24 #1
Jeg er ikke helt med på hvorfor du bruger extract($row); og efter det indhenter du en variable $filename som jeg ikke kan se hvor bliver sat, men mit bud på din fejl er, at din variable $filename bliver sat til det ene billede og så bliver det jo bare gentaget.

Men hvorfor ikke bruge:
while ($row = mysql_fetch_array($resultat)) {

<td><a href="images/'.$row['filename'].'" rel="shadowbox" title="Billedegalleri"><img src="images/'.$row['filename'].'" height="67" width="100" alt="Galleribillede" /></a></td>
Avatar billede repox Seniormester
02. juni 2010 - 14:30 #2
Jeg ville prøve noget ala dette:
<table id="tableid" cellpadding="0" cellspacing="0">
    <tr>
        <td colspan="3">
            <h2>Billedegalleri</h2>
        </td>
    </tr>
    <tr>
    <?php
    $resultat = mysql_query("SELECT * FROM $table ORDER BY id DESC");
    $i = 0;
    while ($row = mysql_fetch_array($resultat)):
    extract($row);
    $i++;
    ?>
        <td>
            <a href="images/<?php echo $filename; ?>" rel="shadowbox" title="Billedegalleri">
                <img src="images/<?php echo $filename; ?>" height="67" width="100" alt="Galleribillede" />
        </a>
    </td>
    <?php

    if(($x % 3) == 0)
        echo "</tr><tr>";

    endwhile;
    ?>
    </tr>
</table>


Jeg bruger modulus til at angive at hver tredie tabelcelle skal efterfølgende have en </tr><tr>

Forskellen er også at jeg ikke skriver tre billeder ud ad gangen (da det af logiske årsager kun kan være det samme billede).
Men lur koden og spørg hvis der er noget du ikke forstår...
Avatar billede repox Seniormester
02. juni 2010 - 14:31 #3
Lille rettelse:
Ret if(($x % 3) == 0) til if(($i % 3) == 0)
Avatar billede optur Novice
02. juni 2010 - 14:31 #4
Det er den måde vi har lært at kode på af vores lærer, og da jeg er i gruppe med 3 andre så holder vi os til den metode. Det eneste jeg har brug for er at vide hvordan jeg laver den kode, så jeg ikke får 3 ens billeder på række
Avatar billede optur Novice
02. juni 2010 - 14:34 #5
jeg får følgende "fejl"
Notice: Undefined variable: x in D:\Users\EAMV201015\include\function.php  on line 116

hvor linje 116 er:
if(($x % 3) == 0)
Avatar billede optur Novice
02. juni 2010 - 14:35 #6
Der var den... Cool Tusind mange gange tak for hjælpen =D
Avatar billede optur Novice
02. juni 2010 - 14:37 #7
er det sådan at du eventuelt kan smide lidt kommentar til hvad gør hvad og hvorfor? bare kort =)
Avatar billede repox Seniormester
02. juni 2010 - 14:39 #8
#1
extract() anvendes på $row - du kan antage at der er et array indeks i $row der er navngivet "filename" som så anvendes fra extract().

#3
Du skal lige huske på at selvom din lærer har vist dig den metode, så er der ikke et facit på hvordan tingene skal gøres - det er det smukke ved programmering.
extract() er en funktion som du (IMO) egentlig burde holde dig fra, fordi du kan potentielt skabe dig noget usikker eller/og ustabil kode i forhold til det omkringliggende. Løsningmodellen på at trække dataene ud fra dit resultat er mere selvforklarende over for andre der skal kigge på din kode, mere fleksibel og du har også (synlig) kontrol over dine variabler.
Men det virker og hvis det er det som din lærer mener du skal anvende, så gør det - og så bare noter dig bag øret at det er en løsningsmodel - ikke den eneste løsning...
Avatar billede optur Novice
02. juni 2010 - 14:41 #9
Det er jeg udemærket klar over =) og jeg sidder tit og ærger mig over vi er "låst" på den her måde.
Avatar billede repox Seniormester
02. juni 2010 - 14:44 #10
#7

Ganske kort var din fejl at du udskriver de samme variabler tre gange i den samme løkke.

Ved at kigge på nedenstående stump bør du forhåbentlig kunne se selv, hvorfor:
<?php

  for($i = 0; $i < 3; $i++):
  {
    echo "hej";
    echo "hej";
    echo "hej";
  }
  // udskriver tre gange "hej" tre gange, hvilket principielt er det du gjorde, bare med en masse HTML udenom...

?>


For ikke at rette for meget i din while løkke besluttede jeg at tilføje variablen $i som for hver gennemløb i din løkke adderes med 1 - det tal anvender jeg så for at kunne afgøre hvornår der lægges en ny tabelrække ind ved hjælp af modulus.
Avatar billede optur Novice
02. juni 2010 - 14:44 #11
public2: Din måde er også sådan jeg selv ville gøre det, og var faktisk også sådan jeg gjorde det, ind til min lærer kiggede mig over skulderen og sagde at det var ikke sådan vi havde lært det.
Han sværger til denne metode og så må vi desværre indordne os ind til næste semester hvor vi ikke længere skal have ham.
Avatar billede optur Novice
02. juni 2010 - 14:46 #12
#10:
Tusind tak, den er hermed gemt =)

hvordan laver du i øvrigt den kodeboks?
Avatar billede public2 Nybegynder
02. juni 2010 - 14:52 #13
Ja der er mange veje til Rom og hver har nok deres foretrukne, men så længe det virker :-)
Avatar billede repox Seniormester
02. juni 2010 - 15:02 #14
#12
Du kan jo (hvis du tør) prøve at spørge din lærer hvad han synes om brugen af extract i nedenstående kode:
<?php    
  ...
   
    extract($_POST);

    if($admin == "true")
    include("adminmenu.inc.php");


    $password = sha1($password);
    $username = mysql_real_escape_string($username);


    $sql = "SELECT * FROM nUsers WHERE nUsername = '".$username."' && nPassword = '".$password."' LIMIT 1";
    $res = mysql_query($sql);
   
   
   
    ...?>


I fald at min POST streng er denne:
password=test&username=test&admin=true


Eksemplet er naturligvis meget tænkt, men det giver dig (din lærer) forståelsen for hvorfor extract() er en dårlig funktion at anvende - særligt hvis man måske ikke har så meget kodeerfaring.

Angående min kodeboks, så kan du kigge lidt på guiden herfra: http://www.eksperten.dk/guide/1325
Avatar billede optur Novice
02. juni 2010 - 15:52 #15
der er ved jeg han er enig. Når det gælder login har vi lært følgende:


<?php
include('include/db_con.php');

$str1=(sha1(sha1(sha1($_REQUEST['brugernavn']))));
$str2=(sha1(sha1(sha1($_REQUEST['kodeord']))));
//Her starter vi en session op
session_name();
session_start();

$resultat = mysql_query("SELECT username,password FROM users WHERE id=1");
$row = mysql_fetch_array($resultat);
$user = $row['username'];
$pass = $row['password'];


if (!$str1 == $user && !$str2 == $pass) {
session_unset();
session_destroy();
header("location:./index.php?static=login&id=loginerror");
}
elseif ($str1 == $user && $str2 == $pass) {
$_SESSION['run']='run';
header("location:./admin/index.php");
}
else {
header("location:./index.php?table=login&id=loginerror");   
    }
;
?>
Avatar billede xicrow Nybegynder
02. juni 2010 - 17:26 #16
tester lige det hersens pjat...
Avatar billede xicrow Nybegynder
02. juni 2010 - 17:26 #17
Ahh sry, skulle have været "Se preview" der skulle trykkes på.

Beklager meget.
Avatar billede repox Seniormester
03. juni 2010 - 13:25 #18
#15
Åhh gud - jeg får lyst til at flå mine øjne ud!!

Jeg håber virkelig ikke det er noget du tager til dig, da...
Avatar billede optur Novice
03. juni 2010 - 17:11 #19
# 18
er det da helt af helvede til???
Avatar billede optur Novice
03. juni 2010 - 17:15 #20
# 2
Du er desværre nok nød til at forklare det lidt nærmere hvad hver enkelte ting gør, for jeg har virkelig besvær med at forklare mig i min rapport om dette...
Avatar billede xicrow Nybegynder
03. juni 2010 - 21:38 #21
#19
Ja det er helt af helvede til :P
1. "session_start()" burde bliver kørt som det første
2. Hvorfor bruge $_REQUEST, du ved vel hvor din data kommer fra (GET/POST) ?
3. "SELECT username,password FROM users WHERE id=1" findes der kun én bruger i databasen ? Hvis ja, hvorfor så bruger en hel tabel på det ?

Jeg ville nok lave det på nogenlunde samme måde som repox viser i #14, dog med nogle ændringer:
// Hent data fra POST
$username = mysql_real_escape_string($_POST['username'];
$password = mysql_real_escape_string($_POST['password'];

$query = mysql_query("SELECT * FROM nUsers WHERE nUsername = '".$username."' && nPassword = '".sha1($password)."' LIMIT 1");
if (mysql_num_rows($query)){
    // Brugeren findes...
}
else{
    // Brugeren findes ikke...
}


#20
<table id="tableid" cellpadding="0" cellspacing="0">
    <tr>
        <td colspan="3">
            <h2>Billedegalleri</h2>
        </td>
    </tr>
    <tr>
    <?php
    // Henter resultater fra databasen
    $resultat = mysql_query("SELECT * FROM $table ORDER BY id DESC");
    // Sætter en variabel som bruges til at tælle hvilket billede vi er ved (1, 2, 3, osv)
    $i = 0;
    // Looper igennem resultater fra databasen
    while ($row = mysql_fetch_array($resultat)):
    // Udtrækker resultaterne fra databasen (selvom det er en tosset måde at gøre det på)
    extract($row);
    // Sørger for at tælleren tæller op
    $i++;
    // Udskriver èn tabel-celle med et billede
    ?>
        <td>
            <a href="images/<?php echo $filename; ?>" rel="shadowbox" title="Billedegalleri">
                <img src="images/<?php echo $filename; ?>" height="67" width="100" alt="Galleribillede" />
        </a>
    </td>
    <?php
    // Såfremt vores tæller modulus 3 er 0 (dvs. 3, 6, 9, osv), afslut nuværende tabel-række, og start en ny
    if(($x % 3) == 0)
        echo "</tr><tr>";
    // Afslut loop
    endwhile;
    ?>
    </tr>
</table>
Avatar billede repox Seniormester
04. juni 2010 - 09:58 #22
#19
Der er nogle simple grunde til at det er noget frygteligt kode.
Den allerførste er at der i koden er implementeret 'security through obscurity' - et koncept som ganske vist er meget smart, hvis man ikke aner noget som helst om at sikre sine kode, men udover det giver det ikke meget mening.

At bruge sha1() funktionen adskillige gange gør ikke koden mere sikker. Hvis du har et behov for mere sikkerhed end hvad hashing (såsom sha1 eller md5) kan give dig, så vil jeg anbefale dig at læse lidt om password salting.

session_name() er unødvendig i ovenstående kontekst og giver dermed ingen mening at anvende.

Som udgangspunkt er det tilrådeligt at anvende enten $_POST eller $_GET da $_REQUEST er et udtryk for at du ikke helt er sikker på hvor dine brugerinput kommer fra.

Og som #21 nævner, virker SQL forespørgslen fejlbehæftet - den vil altid tage den bruger der har id 1.

session_unset() samt session_destroy() funktionerne er også relativt forældede... Man anvender andre teknikker idag som er lige så effektive (som eksempelvis unset()).

Hele if-strukturen er dobbeltkonfekt. Forslaget i #21 er absolut bedre (om end ikke jeg stadig ville have nogle ændringer til koden).
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