Toon posts:

[PHP] Checkboxes en meerdere tabellen

Pagina: 1
Acties:
  • 94 views sinds 30-01-2008

Verwijderd

Topicstarter
Hallo, Ik ben nog niet zo lang bezig met php en ben bezig met een klein project waarvan een deel van de code hieronder staat weergegeven.

Globale bedoeling:
Er zijn meerdere gebruikers die op de website allemaal dezelfde links te zien krijgen.
De gebruikers kunnen een checkbox aan/uitvinken die voor de link staat, waardoor ze kunnen bijhouden welke links ze gehad hebben. Die checkbox waarde wordt per gebruiker opgeslagen in de database, zodat wanneer de gebruiker terugkeerd op de pagina, de links die hij bezocht heeft weer aangevinkt zijn.

Wat is de bedoeling bij deze code en wat is gelukt en wat is er niet gelukt:
Nou in dit stuk code worden dus een aantal links getoond (uit tabel tblLinks). Wanneer ik voor die links de checkbox aanvink en op de knop insert klik, dan wordt netjes het id van de link en het id van de user in een koppeltabel tblStatus gezet (oftewel bijv. 1, 3, 55, ON), wat gebeurd d.m.v. die insert. Wanneer de gebruiker nog een keer dezelfde link aan zou klikken, dan hoeft die natuurlijk niet opnieuw ge-insert te worden en daarom wordt er na de eerste keer een update uitgevoerd, wat ook gelukt is.

Het probleem is nu alleen dat ik niet weet hoe ik alle links weergeef en dat de checkbox(es) aangevinkt zijn wanneer de gebruiker terugkeerd op de pagina. En daarnaast hoe moet ik controleren of die checkbox is aangevinkt en of de waarde in de database aangepast moet worden.

Ander bijkomend probleem is, dat wanneer ik van die Select query een join maak, om ook de gegevens uit tblStatus te kunnen gebruiken in combinatie met tblLinks, dan worden alle rijen meerdere malen getoond, wat niet de bedoeling is. Namelijk het aantal keer dat er een rij bestaat in tblStatus.

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
$sql2="SELECT * FROM tblLinks WHERE strLanguage='EN' AND LEFT(strURLTitel,1) < 'a' ORDER BY strURLTitel";
$result2=mysql_query($sql2);
$count2=mysql_num_rows($result2);
?>
<table width="400" border="0" cellpadding="5" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td bgcolor="#FFFFFF">&nbsp;</td>
<td colspan="6" bgcolor="#FFFFFF"><strong></strong> </td>
</tr>
<tr>
<td align="center" bgcolor="#FFFFFF">#</td>
<td align="center" bgcolor="#FFFFFF"><strong>idLink</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>strURL</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>strURLTitel</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>strPagerank</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>strLanguage</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>strDate</strong></td>
</tr>
<?php
while($rows2=mysql_fetch_array($result2)){
?>
<tr>
<td align="center" bgcolor="#FFFFFF"><input name="checkbox2[]" type="checkbox" id="checkbox2[]" value="<? echo $rows2['idLink'] ?>"<? echo $rows2['varStatus'] ?> ></td>
<td bgcolor="#FFFFFF"><? echo $rows2['idLink']; ?></td>
<td bgcolor="#FFFFFF"><? echo $rows2['strURL']; ?></td>
<td bgcolor="#FFFFFF"><? echo $rows2['strURLTitel']; ?></td>
<td bgcolor="#FFFFFF"><? echo $rows2['strPagerank']; ?></td>
<td bgcolor="#FFFFFF"><? echo $rows2['strLanguage']; ?></td>
<td bgcolor="#FFFFFF"><? echo $rows2['strDate']; ?></td>
</tr>
<?php
}
?>
<tr>
<td colspan="7" align="center" bgcolor="#FFFFFF"><br><input name="insert2" type="submit" id="insert2" value="Insert Link Info in Status"><br><br></td>
</tr>
<?
// Check if insert button active, start this
if(IsSet($insert2))
{
    for($i=0;$i<$count2;$i++)
    {
        $in_id2 = $checkbox2[$i];

        $sqlx="SELECT idUser FROM tblStatus WHERE idUser='$idwaarde' AND idLink='$in_id2'";
        $resultx=mysql_query($sqlx);
        $countx=mysql_num_rows($resultx);
                    
        if($in_id2>0)
        {
            if($countx > 0)
            {
                //$sql2 = "INSERT INTO tblStatus(idUser, idLink, varStatus) VALUES ('100', '100', 'X')";    
                //
                //Hier komt de update code
                if ($waarde = true)
                {
                    $sql2 = "UPDATE tblStatus SET varStatus='on' WHERE idUser='$idwaarde' AND idLink='$in_id2'";
                    $result2 = mysql_query($sql2);
                }
                if ($waarde = false)
                {
                    $sql2 = "UPDATE tblStatus SET varStatus='off' WHERE idUser='$idwaarde' AND idLink='$in_id2'";
                    $result2 = mysql_query($sql2);
                }
            }
            else
            {
                $sql2 = "INSERT INTO tblStatus(idUser, idLink, varStatus) VALUES ('$idwaarde', '$in_id2', '$checkbox2[$i]')";   
                $result2 = mysql_query($sql2);
            }
        }
    }

    // if successful redirect
    if($result2)
    {
        echo "<meta http-equiv=\"refresh\" content=\"0;URL=Test_Links_met_Status2.php\">";
    }
}
mysql_close();
?>

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Het is mij niet helemaal duidelijk hoe je de dingen post. Doe je dat per checkbox. Of Hoeft de gebruiker maar 1x te klikken om op te slaan?

Om aan te geven of de checkbox is aangevinkt kan je dit doen.
PHP:
1
<input type="checkbox" value=1 if($obj->aangevinkt==1){echo "checked"}>

Om te kijken of er opnieuw geinsert moet worden of geupdate.

Je zou voor iedere checkbox een hidden field kunnen maken. Daar de huidige waarde inzetten. Mocht hij aangevinkt zijn staat dat in de hidden field. dan weet je updaten.

Als je alle aangevinkte checkboxen in 1x POST dan kan je ook gewoon alles in je tabel voor die gebruiker weggooien en alles inserten.

Dat je bij je JOIN meerdere rijen krijgt is niet raar. Wat is je JOIN precies?

Jochemmol


Verwijderd

Topicstarter
De links worden gepost door middel van een submit knop, per checkbox. Dus wanneer een checkbox die voor een link staat is aangevinkt, dan worden die aangevinkte checkboxes ge-insert of ge-update in de database.
Als je alle aangevinkte checkboxen in 1x POST dan kan je ook gewoon alles in je tabel voor die gebruiker weggooien en alles inserten.
Dat zou kunnen, maar ik vind het netter om de gegevens te updaten. Er kunnen namelijk wel meer dan 1000 links komen in die tabel tblStatus en dat voor meerdere gebruikers. Als ik dat steeds ga verwijderen en weer opnieuw inserten, dan loopt de id van de tabel tblStatus enorm op, wat niet nodig is.

De join had ik weer even uit de code gelaten, maar die bovenste select query zou er dan zo uit zien waarbij tblStatus er dan aan toegevoegd is:
PHP:
1
$sql2="SELECT tblLinks.idLink, tblLinks.strURL, tblLinks.strURLTitel, tblLinks.strPagerank, tblLinks.strLanguage, tblLinks.strDate, tblStatus.varStatus FROM tblLinks, tblStatus WHERE strLanguage='EN' AND LEFT(strURLTitel,1) < 'a' ORDER BY strURLTitel";


Als ik dat doe, dan worden rijen dus meerdere keren weergegeven, namelijk het aantal keer dat er een rij bestaat in tblStatus.
Maar alleen de rijen uit tblLinks moeten dus getoond worden, maar die tblStatus heb ik nodig omdat daar de waarde voor de checkbox word opgeslagen en daar tevens de id van een link en id van de user staan.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:07

Creepy

Tactical Espionage Splatterer

Volgens mij wordt het eens tijd om je code te debuggen.

Je if's zijn altijd true (= is een toekenning, == is een vergelijking) en je query is geen JOIN. Dat je uit twee tabellelen selecteert maakt een query geen JOIN. Pak anders even de SQL faq erbij zodat je kan zien hoe dat bijv. in z'n werk gaat :) Tip: je zult moeten specifieren op welk veld in beide tabellen er gejoind moet worden.

[ Voor 22% gewijzigd door Creepy op 08-09-2006 14:50 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Bovendien, controleer eens wat je nou doet in je if statements, ik kan nu al zeggen dat ik minstens 10 regels code kan refactoren naar 1....

Verwijderd

Topicstarter
:) Ja ok die 2 if's met $waarde zijn onzin eigenlijk. Had ik moeten weten. :D
En bedankt voor die SQL faq. Ziet er handig uit en zal het eens doornemen.
Bovendien, controleer eens wat je nou doet in je if statements, ik kan nu al zeggen dat ik minstens 10 regels code kan refactoren naar 1....
Da's een goeie vraag.
  • if(IsSet($insert2)) -> Als de insert knop geklikt is, voer dan dat gedeelte daaronder uit.
  • if($in_id2>0) -> Heb ik gedaan omdat anders waardes meerdere keren ge-insert werden.
  • if($countx > 0) -> Dat alleen de rijen aangepast gaan worden die betrekking hebben op de id van de user.
  • if ($waarde = true) en if ($waarde = false) -> Klopt inderdaad niets van :D
  • if($result2) -> Ververst de pagina.
Door middel van die if's was ik al blij dat alles goed ge-insert werd, maar hoe zou dat anders kunnen dan?

[ Voor 4% gewijzigd door Verwijderd op 08-09-2006 15:07 ]


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Verwijderd schreef op vrijdag 08 september 2006 @ 15:02:
:) Ja ok die 2 if's met $waarde zijn onzin eigenlijk. Had ik moeten weten. :D
En bedankt voor die SQL faq. Ziet er handig uit en zal het eens doornemen.


[...]

Da's een goeie vraag.
  • if(IsSet($insert2)) -> Als de insert knop geklikt is, voer dan dat gedeelte daaronder uit.
  • if($in_id2>0) -> Heb ik gedaan omdat anders waardes meerdere keren ge-insert werden.
  • if($countx > 0) -> Dat alleen de rijen aangepast gaan worden die betrekking hebben op de id van de user.
  • if ($waarde = true) en if ($waarde = false) -> Klopt inderdaad niets van :D
  • if($result2) -> Ververst de pagina.
Door middel van die if's was ik al blij dat alles goed ge-insert werd, maar hoe zou dat anders kunnen dan?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            if ($countx > 0)
            {
                if ($waarde = true)
                {
                    $sql2 = "UPDATE tblStatus SET varStatus='on' WHERE idUser='$idwaarde' AND idLink='$in_id2'";
                    $result2 = mysql_query($sql2);
                }
                if ($waarde = false)
                {
                    $sql2 = "UPDATE tblStatus SET varStatus='off' WHERE idUser='$idwaarde' AND idLink='$in_id2'";
                    $result2 = mysql_query($sql2);
                }
            }
            else
            {
                $sql2 = "INSERT INTO tblStatus(idUser, idLink, varStatus) VALUES ('$idwaarde', '$in_id2', '$checkbox2[$i]')";    
                $result2 = mysql_query($sql2);
            }


Kan je eenvoudig refactoren naar:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
            if ($countx > 0)
            {
                $varStatus = $waarde ? 'on' : 'off';
            
                $sql2 = "UPDATE tblStatus SET varStatus='$varStatus' WHERE idUser='$idwaarde' AND idLink='$in_id2'";
            }
            else
            {
                $sql2 = "INSERT INTO tblStatus(idUser, idLink, varStatus) VALUES ('$idwaarde', '$in_id2', '$checkbox2[$i]')";
            }
            
            $result2 = mysql_query($sql2);

Verwijderd

Topicstarter
Oké.. Dankjewel dat is inderdaad een heel stuk netter en korter.

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 20:49

Ventieldopje

I'm not your pal, mate!

Dit kun je dus heel makkelijk oplossen met AJAX en PHP. Als de checkbox aangevinkt word dan moet het gewoon een javascriptje uitvoeren dat op zijn beurt weer een PHP script aanroept.

Het php scriptje moet dan via POST of GET de link van de pagina mee krijgen zodat hij weet welke hij in de database aan moet passen en bijvoorbeeld of hij het moet aanpassen of inserten.

Iemand verdere uitleg nodig? ... laat het me ff weten dan maak ik wel een scriptje. Een groot voordeel hier van is is dat je niet op een knop hoeft te drukken om de pagina's die je bezocht hebt op te slaan in de database want het gebeurt automatisch op de achtergrond als je de checkbox aan of uit vinkt. ;)

www.maartendeboer.net


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:07

Creepy

Tactical Espionage Splatterer

Xmit schreef op vrijdag 08 september 2006 @ 17:00:
Iemand verdere uitleg nodig? ... laat het me ff weten dan maak ik wel een scriptje
GoT is een forum, geen plek om je diensten (al dan niet gratis) aan te bieden. Als iemand verdere uitleg wil hebben dan kan dat prima hier worden gevraagd en kan je ook hier uitleg geven. Zo help je niet 1 persoon maar iedereen die dit topic leest :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Oftewel als je wil, dan graag dat scriptje hier even posten.

Heb al wel een aantal keer over AJAX gehoord, maar hoe en wat het allemaal inhoud weet ik niet.
Ben dus wel benieuwd.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:07

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op vrijdag 08 september 2006 @ 17:19:
Oftewel als je wil, dan graag dat scriptje hier even posten.

Heb al wel een aantal keer over AJAX gehoord, maar hoe en wat het allemaal inhoud weet ik niet.
Ben dus wel benieuwd.
GoT is ook geen helpdesk om lappen kant en klare code af te halen. Dus liever een stuk fatsoenlijke uitleg met kleine voorbeeldjes dan een kant en klaar script. Dan leer je er nog wat van :)

Overigens is er echt ladingen info over AJAX. Google en GoT staan er vol mee.

Anyway, met de gegeven tips moet je er denk ik wel uitkomen. Mocht het nou echt nog niet lukken dan kan je een nieuw topic openen maar let hierbij natuurlijk wel op Programming Beleid - De Quickstart :)

[ Voor 5% gewijzigd door Creepy op 08-09-2006 17:25 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.