Avatar billede ducks Nybegynder
11. januar 2009 - 01:04 Der er 18 kommentarer og
1 løsning

Mærkelig problem med function og database

Jeg har en funktion i en class, som slutter af med at opdatere et felt i databasen, men den "glemmer" at opdatere feltet, medmindre jeg sætter en die(); ind lige under så bliver det opdateret.
Forstår ikke helt, hvad der går galt, kan jeg vente på at alt er færdigt før funktionen stopper, eller er der nogle typiske årsager til problemet?
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 01:07 #1
Din kode?
Avatar billede ducks Nybegynder
11. januar 2009 - 01:11 #2
Ved godt at koden kan optimeres, men det var en vi hurtigt lavede fordi den anden gav problemer og vi ikke ville bruge alle resourcer her nu, hvilket gav os en masse besvær alligevel. Men det er ved die() at det afgør om databasen gider huske det.

public function toggle($table, $column, $find, $what = 'id') {
    if (!$table || !$column || !is_numeric($find) || !$what)
        return "error_missing_information";
   
    $sql = $this->query_read("
        SELECT `". $column ."`
        FROM `". PREFIX . $table ."`
        WHERE `". $what ."` = ". $find ."
        LIMIT 1
    ");
   
    if ($this->num_rows($sql) == 0)
        return "error_record_not_found";
   
    $data = $this->fetch($sql);
   
    if ($data[$column] == 0)
        $newToggle = 1;
    else
        $newToggle = 0;
   
    $this->query_write("
        UPDATE `". PREFIX . $table ."`
        SET `". $column ."` = ". $newToggle ."
        WHERE `". $what ."` = ". $find ."
        LIMIT 1
    ");
    #die(print_r($data)); // virker\#virker ikke
   
    return $newToggle;
}
Avatar billede fant0mas Nybegynder
11. januar 2009 - 01:21 #3
Jeg har en gang brugt 2 timer på at debugge noget lignende. Det viste sig at være en fantastisk dygtig grafiker der havde sat onclick event på et link, så der blev dobbelt postet, og funktionen derved blev kørt x2. Det underlige var at et dump viste den korrekte data. Er du grafiker :D?
Avatar billede ducks Nybegynder
11. januar 2009 - 01:31 #4
hehe nej, og det er vidst heller ikke problemet

Prøvede lige med den her i starten af funktionen:

if ($_SESSION['qwerty'] = 12345)
    return false;
$_SESSION['qwerty'] = 12345;

og den ændrer stadig ikke noget
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 10:34 #5
Det har selvfølgelig intet - i sig selv - at gøre med om den "die" står der. Så det må være noget andet. Ideen fra fant0mas er faktisk ret sjov - hvis du toggler to gange, så er resulatet uændret. Ved at sætte en "die" ind, så sker det kun første gang.

Vil du lave det lille hack, så hedder det ikke
  if ($_SESSION['qwerty'] = 12345)
men
  if ($_SESSION['qwerty'] == 12345)
Avatar billede ducks Nybegynder
11. januar 2009 - 10:48 #6
Ja selvfølgelig, doh, man kan godt blive lidt træt i hovedet. Men ser ud til at den bliver kørt 2 gange af en eller anden mystisk grund, vender lige tilbage, for det bliver en større opgave at finde fejlen, medmindre man kan noget smart i PHP mht det.
Avatar billede ducks Nybegynder
11. januar 2009 - 10:58 #7
Kan man evt. se, hvor en funktion bliver kaldt?
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 11:08 #8
Du kan vel søge efter funktionsnavnet i din tekst-editor?
Avatar billede ducks Nybegynder
11. januar 2009 - 11:11 #9
Funktionen er kun kaldt 1 sted fra og jeg har også prøvet at omdøbe den til noget helt andet. Problemet må ligge i at det lykkes systemet at loade filen 2 gange, det er ihvertfald mit bud
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 11:14 #10
Det er altid en mulighed. Tæl en sessions-variabel op passende steder, og kig på den.

Selv om denne funktion kun kaldes et sted, kan den funktion, den kaldes i, selv kaldes 2 gange ... osv.
Avatar billede ducks Nybegynder
11. januar 2009 - 13:41 #11
Den konkrete fejl er fundet, hvordan det kan lade sig gøre er en stor gåde for mig. Men det var det her kode som gjorde at det loadede 2 gange:

<div>
    <img src="" alt="" />
    <?php
        if (!$_GET['name'])
            echo '<a href="?" style="font-weight: bold;">Home</a>';
        else
            echo '<a href="?">Home</a>';
    ?>
</div>
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 14:02 #12
<img src="" alt="" /> med tom src henter samme side, som <img>-tagget står på.

Det tyder på du har lavet din "toggle" med en GET, fx via et link. Det plejer at være god swahili at lave ændringer i databasen med POST-er.
Avatar billede ducks Nybegynder
11. januar 2009 - 14:08 #13
Har jeg nu ikke, det er en class, men det var det at src ikke havde nogen værdi der gav problemer. Ved du om det kan tyde på et problem et andet sted, eller det være okay nu?
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 14:10 #14
"Har jeg nu ikke," ... ikke forstået?  Om der er andre problemer ... det ved jeg da virkelig ikke. :)
Avatar billede ducks Nybegynder
11. januar 2009 - 14:31 #15
Har kaldt den fra en class som var fast defineret for at teste:
$db->toggle('table', 'column', 1);
Så tror ikke det er det med GET.


Anyway, har tilpasset funktionen nu, til dem der skal bruge noget lign. istedet for det lort ovenover:

public function toggle($table, $column, $find, $what = 'id') {
    if (!$table || !$column || !is_numeric($find) || !$what)
        return "error_missing_information";
   
    $this->query_write("
        UPDATE `". PREFIX . $table ."`
        SET `". $column ."` = (CASE WHEN `". $column ."` = 1 THEN 0 ELSE 1 END)
        WHERE `". $what ."` = ". $find ."
        LIMIT 1
    ");
   
    return true;
}


og så var det vel egentlig fant0mas der løste det?
Avatar billede erikjacobsen Ekspert
11. januar 2009 - 15:08 #16
Jeg snakker om din HTML-kode. Står der <a href="....php?id=... ">Skift</a>, så bruger du "GET". Det kan give problemer. Med en <form method="post"...> ...osv... , og en test på serveren om den kommer fra "POST", sker det ikke.
Avatar billede fant0mas Nybegynder
12. januar 2009 - 08:01 #17
Jeg springer over, Erik har vist brugt mest energi på at hjælpe, så stik ham dem.
Avatar billede erikjacobsen Ekspert
12. januar 2009 - 08:52 #18
Ingen point til mig, tak.
Avatar billede ducks Nybegynder
12. januar 2009 - 13:17 #19
Svar
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