[PHP] Variabele meenemen naar volgende pagina

Pagina: 1
Acties:
  • 275 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • urf
  • Registratie: September 2001
  • Niet online
Ik ben ff aan het klooien met het maken van een klein nieuws systeempje. Ik wil in het bestand show.php de laatste 5 titels van nieuwsberichten laten zien als links. Dit is allemaal geen probleem en werkt prima. Als je klikt op 1 van de links ga je naar het bestand news_show.php

Hier gaat het dus fout. In het bestand news_show.php zou het het nieuwsbericht moeten laten zien die hoort bij het id van de link die is aangeklikt. Deze word meegegeven in de titelbalk.

Dit werkt dus niet, maar ik heb geen id wat ik fout doe :(

De code van show.php:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<html>

<head>
  <title></title>
</head>

<body>

<?php

  // Maak verbinding met de database
  include("functies.lib.php");
  MySQL_verbinding();

  echo "De laatste 5 nieuwsberichten:<br><br>";

  // Maak een sql query en voer deze uit, het resultaat word opgeslagen
  $query = "SELECT id, titel, bericht FROM test ORDER BY id DESC LIMIT 0, 5";
  $r_query = MySQL_query($query);

  // Uitkomst van de sql query opslaan in een array en deze weergeven
  while($array_r_query=MySQL_fetch_array($r_query))
  {
   $id = $array_r_query["id"];
   $titel = $array_r_query["titel"];

   echo "<a href='news_show.php?id=$id'>$titel</a><br>";
  }

  // Verbreek verbinding met de database
  mysql_close();

?>

</body>

</html>


De inhoud van news_show.php:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<html>

<head>
  <title></title>
</head>

<body>

<?php

  // Maak verbinding met de database
  include("functies.lib.php");
  MySQL_verbinding();

  // Maak query om titel en bericht behorend bij de juiste id op te halen
  $query = "SELECT titel, bericht FROM test WHERE id = '$id'";

  // Voer query uit
  $r_query = mysql_query($query) or die ("Query mislukt");

  // Uitkomst van de sql query opslaan in een array en deze weergeven
  while($array_r_query=MySQL_fetch_array($r_query))
  {

   $titel = $array_r_query["titel"];
   $bericht = $array_r_query["bericht"];

   echo "$titel<br>";
   echo "$bericht";
  }

  // Verbeek verbinding met de database
  mysql_close();

?>

</body>

</html>


Wat doe ik fout? :)

Acties:
  • 0 Henk 'm!

Verwijderd

Je zou ipv $id eens $_GET["id"] kunnen gebruiken in je query :)

[ Voor 17% gewijzigd door Verwijderd op 17-11-2004 16:50 ]


Acties:
  • 0 Henk 'm!

  • Zoefff
  • Registratie: September 2001
  • Laatst online: 12:37

Zoefff

❤ 

Je moet $id met een global uit de url halen, dus
PHP:
1
$id = $_GET['id'];


Let wel op dat dit absoluut niet veilig is, iedere willekeurige voorbijganger kan op de plaats van id bijvoorbeeld een sql query zetten. Controleer met bijvoorbeeld een array of het id ook daadwerkelijk een geldig id is :)


FotoblogWerkaandemuur.nlMoestuincursus.nlTwitter


Acties:
  • 0 Henk 'm!

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 11-12-2024

blizt

Wannabe-geek

Waarschijnlijk is 't $_GET['id'] en niet $id...
Maar wil je voortaan wat meer informatie geven?
Zelf proberen?
En lees wat over SQL Injection (staat in de FAQ geloof'k)...
Oh ja, tipje: http://google.nl/search?q=superglobals+php

United we stand, and divided we fall


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Doe eens een print_r($_GET) in je news_show.php

Verder nog een paar dingetjes:

MySQL_query en MySQL_fetch_array :? Je kunt beter gewoon kleine letter gebruiken.

"dit is een $string" => "dit is een " . $string

Dat is een stuk netter wel.

edit:

spuit 4.. zo even ingeschat? :)

[ Voor 15% gewijzigd door Michali op 17-11-2004 16:53 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • urf
  • Registratie: September 2001
  • Niet online
Bedankt voor de tips. Ben ook nog nieuw hiermee, sorry :)

Maaruh, wat is er nettter aan die 2e manier? :?

Acties:
  • 0 Henk 'm!

  • Zoefff
  • Registratie: September 2001
  • Laatst online: 12:37

Zoefff

❤ 

Daar houd je de variabelen buiten de rest van je string. Programmeert overzichtelijker en dientengevolge maak je minder snel fouten.

PHP:
1
2
3
  echo "dit is een string met $variabele erin";

  echo "dit is een string met " . $variabele . " erin";


FotoblogWerkaandemuur.nlMoestuincursus.nlTwitter


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
1. Het leest een stuk gemakkelijker. Je ziet een variabel veel sneller staan.
2. Veel editor ondersteunen geen syntax highlighting voor variabelen in strings. De enige die ik ken is Zend.
3. Het is een beetje een standaard coding stijl in php. Ook handig voor andere mensen als je een vraag hebt.
4. Het maakt ook niet zo veel uit eigenlijk. Doe gewoon wat je lekker vind ;)
edit:

Grr, weer te laat :P

[ Voor 5% gewijzigd door Michali op 17-11-2004 17:07 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Zoefff
  • Registratie: September 2001
  • Laatst online: 12:37

Zoefff

❤ 

:> :P


FotoblogWerkaandemuur.nlMoestuincursus.nlTwitter


Acties:
  • 0 Henk 'm!

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 11-12-2024

blizt

Wannabe-geek

@Michali: PHPEdit.net ondersteunt 't ook ;)
@urf: je bent nieuw en je bent nu al bezig met classes? Of begrijp ik dat verkeerd? Is dat niet 'n beetje .... te snel? ;)

edit:

Verkeerde nick ...
s/Zoefff/urf

[ Voor 17% gewijzigd door blizt op 17-11-2004 17:23 ]

United we stand, and divided we fall


Acties:
  • 0 Henk 'm!

  • Zoefff
  • Registratie: September 2001
  • Laatst online: 12:37

Zoefff

❤ 

blizt schreef op woensdag 17 november 2004 @ 17:09:
@Zoefff: je bent nieuw en je bent nu al bezig met classes? Of begrijp ik dat verkeerd? Is dat niet 'n beetje .... te snel? ;)
:?

Waar haal je vandaan dat ik nieuw ben? En waar haal je vandaan dat ik met classes werk? :P


FotoblogWerkaandemuur.nlMoestuincursus.nlTwitter


Acties:
  • 0 Henk 'm!

Verwijderd

en belangrijker nog, waarom zou het te snel zijn ;)

Acties:
  • 0 Henk 'm!

  • urf
  • Registratie: September 2001
  • Niet online
Ik heb news_show.php nu aangepast naar:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<html>

<head>
  <title>Nieuwsbericht</title>
</head>

<body>

<?php

  // Maak verbinding met de database
  include("functies.lib.php");
  MySQL_verbinding();

  // Haal de waarde van ID uit de adresbalk
  $id = $_GET['id'];

  // Maak query om titel en bericht behorend bij de juiste id op te halen
  $query = "SELECT titel, bericht FROM test WHERE id = '$id'";

  // Voer query uit
  $r_query = mysql_query($query) or die ("Query mislukt");

  // Uitkomst van de sql query opslaan in een array en deze weergeven
  while($array_r_query=MySQL_fetch_array($r_query))
  {

   $titel = $array_r_query["titel"];
   $bericht = $array_r_query["bericht"];

   echo $titel."<br>";
   echo $bericht;
  }

  // Verbeek verbinding met de database
  mysql_close();

?>

</body>

</html>


Het werkt nu prima allemaal. Verder nog schoonheidsfouten dr in? Beter dat ik het nu meteen netjes leer dan dat ik alles straks weer af moet leren....

..edit.. Is het moeilijk om de titel van het nieuwsbericht in de titelbalk de plaatsen als titel? :D Dat staat wel stoer namelijk 8)

[ Voor 25% gewijzigd door urf op 17-11-2004 17:18 . Reden: nu met kleurtjes (H) ]


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
lol volgens mij bedoeld blitz urf :)

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 11-12-2024

blizt

Wannabe-geek

Haha, ik was even in de war, ja :P
Sorry Zoefff... Zal m'n reply even editten zo, is hier totaal niet van toepassing.
En waarom het snel zou zijn: classes zijn niet per se sneller, het was meer zo van: begin te leren bij het begin ...
Maar ja, like sjaakduhuuhl al zei: ik ben ff in de war ;)

United we stand, and divided we fall


Acties:
  • 0 Henk 'm!

  • urf
  • Registratie: September 2001
  • Niet online
blizt schreef op woensdag 17 november 2004 @ 17:17:
Haha, ik was even in de war, ja :P
Sorry Zoefff... Zal m'n reply even editten zo, is hier totaal niet van toepassing.
En waarom het snel zou zijn: classes zijn niet per se sneller, het was meer zo van: begin te leren bij het begin ...
Maar ja, like sjaakduhuuhl al zei: ik ben ff in de war ;)
Ik begin gewoon lekker met dingen waar ik ook nog wat aan heb :P Ik kom er dan vanzelf wel achter wat alles doet en hoe het zit. Als ik er echt niet uit kom kan ik het gewoon vragen, werkt ook prima.

Als je echt bij het begin moet beginnen krijg je allemaal van die onzin waar je toch nix mee doet...

Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
urf, doe nog even dit, om misbruik van $id te voorkomen:
PHP:
1
2
  // Haal de waarde van ID uit de adresbalk
  $id = mysql_escape_string($_GET['id']);

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Ik vind dit altijd een hele mooie:
PHP:
1
 $query = sprintf('SELECT titel, bericht FROM test WHERE id = %d',$id);

$id wordt nu gecast naar een integer, waardoor er nooit SQL-injectie plaatst kan vinden.

Stel je voor dat iemand
code:
1
news_show.php?id=1';DROP test;--
opvraagt. Je Query wordt dan:
code:
1
SELECT titel, bericht FROM test WHERE id = '1';DROP test;--'

Tsja, dan gaat er iets mis. Met sprintf() en %d kan dat niet gebeuren.

Acties:
  • 0 Henk 'm!

  • Zoefff
  • Registratie: September 2001
  • Laatst online: 12:37

Zoefff

❤ 

Je kan ook

PHP:
1
2
3
4
<?
  // Haal de waarde van ID uit de adresbalk
  $id = (int) $_GET['id'];
?>


doen, dan weet je zeker dat het alleen een getal is :)


FotoblogWerkaandemuur.nlMoestuincursus.nlTwitter


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik zou die $titel en $bericht temps uitschakelen. Probeer altijd zo min mogelijk temp variabelen te gebruiken, behalve als het echt om een perfomance bottleneck gaat.

En ik zou van MySQL_fetch_array mysql_fetch_array maken. Dit is namelijk de definitie van de echte functie. Nog liever zou ik er mysql_fetch_assoc van maken als je toch alleen benoemde indexen gebruikt. mysql_fetch_array geeft namelijk zowel nummeriek als benaamd terug. mysql_fetch_row alleen numeriek en mysql_fetch_assoc alleen benaamd. Scheelt weer iets in performance.

Verder zegt de variable $array_r_query ook niet zo veel. Je kunt hem beter een wat meer zeggende naam geven: $recordSet of $fetchedData oid.

dus:
PHP:
1
2
3
4
5
6
7
8
9
  while($array_r_query=MySQL_fetch_array($r_query))
  {

   $titel = $array_r_query["titel"];
   $bericht = $array_r_query["bericht"];

   echo $titel."<br>";
   echo $bericht;
  }

wordt
PHP:
1
2
3
4
5
  while($recordSet=mysql_fetch_assoc($r_query))
  {
   echo $recordSet["titel"] . "<br>";
   echo $recordSet["bericht"];
  }

[ Voor 42% gewijzigd door Michali op 17-11-2004 17:27 ]

Noushka's Magnificent Dream | Unity


  • urf
  • Registratie: September 2001
  • Niet online
Op dit moment zijn jullie reacties een btje abacadabra voor mij. Als ik morgen weer nuchter ben zal ik dr nog wel ff verder naar kijken. iig bedankt :)

  • urf
  • Registratie: September 2001
  • Niet online
Ik heb het weer enigzins aangepast. Het werkt nu opzich naar wens, maar zijn er nog dingen die volgens jullie anders/handiger kunnen?

show.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<html>

<head>
  <title>De laatste 5 nieuwsberichten</title>
</head>

<body>

<?php

  // Maak verbinding met de database
  include("functies.lib.php");
  MySQL_verbinding();

  echo "<b>"."De laatste 5 nieuwsberichten:"."</b><br><br>";

  // Maak een sql query en voer deze uit, het resultaat word opgeslagen
  $select = "SELECT id, titel, bericht FROM test ORDER BY id DESC LIMIT 0, 5";
  $r_select = mysql_query($select);

  // Uitkomst van de sql query opslaan in een array en deze weergeven
  while($array_select=mysql_fetch_array($r_select))
  {
   echo "<a href='news_show.php?id=".$array_select["id"]."'>".$array_select["titel"]."</a><br>";
  }

  // Verbreek verbinding met de database
  mysql_close();

?>

</body>

</html>


news_show.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<html>

<head>

<?php
  // Maak verbinding met de database
  include("functies.lib.php");
  MySQL_verbinding();

  // Haal de waarde van ID uit de adresbalk
  $id = (int) $_GET['id'];

  // Maak query om titel en bericht behorend bij de juiste id op te halen
  $select = "SELECT titel, bericht FROM test WHERE id = '$id'";

  // Voer query uit
  $r_select = mysql_query($select) or die ("Query mislukt");
  while($array_select=mysql_fetch_array($r_select))
  {
  $titel = $array_select["titel"];
  }
?>

  <title>
  <?php
    echo "Nieuwsbericht: ".$titel;
  ?>
  </title>
</head>

<body>

<?php

  // Haal de waarde van ID uit de adresbalk
  $id = (int) $_GET['id'];

  // Maak query om titel en bericht behorend bij de juiste id op te halen
  $select = "SELECT titel, bericht FROM test WHERE id = '$id'";

  // Voer query uit
  $r_select = mysql_query($select) or die ("Query mislukt");

  // Uitkomst van de sql query opslaan in een array en deze weergeven
  while($array_select=mysql_fetch_array($r_select))
  {
   echo "<b>".$array_select["titel"]."</b><br>";
   echo $array_select["bericht"];
  }

?>

</body>

<?php
  // Verbeek verbinding met de database
  mysql_close();
?>

</html>


Hoe zit dat trouwens met dat verhaal van fetch_assoc enzo? Kan je misschien wat meer uitleg geven over wat dat precies doet en wat het verschil is met fetch_array?

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 11-12-2024

blizt

Wannabe-geek

Ten eerste snap ik niet waarom je dezelfde query 2x doet? Je hebt die resultset dan toch al? Of kijk ik nu ergnes over heen ofzo?
Over m_f_array vs. m_f_assoc: assoc geeft je wat performance-winst omdat deze alleen een array als deze geeft:
array('veld'=>'waarde','veld'=>'waarde' etc.)
m_f_array geeft:
array('veld'=>'waarde',1=>'waarde' etc.)

:)

En verder: "Query mislukt" ... da's altijd zo vaag, gebruik dan mysql_error()? (Nu zou ik sowieso geen die() gebruiken, maar ja :) )

United we stand, and divided we fall


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Omdat we anders zo lang bezig zijn laat ik even zien hoe ik het zou doen

show.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php

include("functies.lib.php");
MySQL_verbinding();

$query = "
    SELECT
        id,
        titel
    FROM
        test
    ORDER BY
        id
    DESC LIMIT
        0, 5
";

$result = mysql_query($query) or die(mysql_error());

$nieuws_items = array();

while ( $recordSet = mysql_fetch_assoc($result) )
{
    $nieuws_items[$recordSet['id']] = $recordSet['titel'];
}

mysql_close();

include "show_template.php";

?>


show_template.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
    <title>De laatste 5 nieuwsberichten</title>
</head>
<body>
    <h1>De laatste 5 nieuwsberichten:</h1>
    <ul>
        <? foreach ( $nieuws_items as $id => $titel ) { ?>
        <li>
        <a href="news_show.php?id=<?=$id?>">
            <?=$titel?>
        </a>
        </li>
        <? } ?>
    </ul>
</body>
</html>


news_show.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php

include("functies.lib.php");
MySQL_verbinding();

$query = "
    SELECT
        titel,
        bericht
    FROM
        test
    WHERE
        id = '" . intval($_GET['id']) . "'
";

$result = mysql_query($query) or die (mysql_error());

$titel = "";
$bericht = "";

if ( $recordSet = mysql_fetch_assoc($result) )
{
    $titel = $recordSet['titel'];
    $bericht = $recordSet['bericht'];
}

mysql_close();

include "news_show_template.php";

?>


news_show_template.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
    <title>Nieuwsbericht: <?=$titel?></title>
</head>
<body>
    <h2><?=$titel?></h2>
    <p>
        <?=$bericht?>
    </p>
</body>
</html>


Bekijk het maar eens goed dan. Ik heb er wel een paar dingetjes ingestopt.

-Geen commentaar omdat ik vind dat de code zichzelf wel genoeg uitlegt. Liever duidelijke code dan commentaar.
-Geen print of echo statement.
-Gescheiden ophalen van de data en presentatie ervan.
-Short tag open en geen puntkomma's in de template.
-Iets semantischer gebruik van HTML en een beetje opgemaakt.
-SQL opgemaakt.
-Namen van de variabelen verbeterd.
-mysql_fetch_assoc ipv. mysql_fetch_array

Dat was het wel zo'n beetje

[ Voor 69% gewijzigd door Michali op 18-11-2004 17:23 ]

Noushka's Magnificent Dream | Unity

Pagina: 1