Avatar billede jps2mt Nybegynder
10. januar 2003 - 00:42 Der er 19 kommentarer og
1 løsning

break problem

I denne funktion skal jeg, når brugernavnet er fundet, bryde ud af while og for løkken, men jeg kan ikke helt få det til at virke...

function doAlert($alertStr) {
  Require("functions.inc.php");
 
  $arrAlerting = explode(" ", $alertStr);

  for ($i=1; $i<count($arrAlerting);$i++) {
  if ($i == 1) {
    $alertUser = $arrAlerting[$i];
  } else {
    $alertUser = $alertUser." ".$arrAlerting[$i];
  }
  $result = mysql_query("SELECT COUNT(*) AS IsThere FROM users_in WHERE (Brugernavn = '".$alertUser."' AND rum = '$_SESSION[rum]')") or die(mysql_error());
  WHILE ($row = mysql_fetch_array($result)) {
    echo "$row[IsThere]<br>";
    If ($row[IsThere] != "0") {
    echo "Er der<br>";
    If ($row[Brugernavn] == $alertUser) {
      $j = $i;
      break 4; <-- Denne her break
    }
    }
  }
  }

  $alertMsg = "";

  for ($i=$j;$i<count($arrAlerting);$i++) {
  $alertMsg = $alertMsg." ".$arrAlerting[$i];
  }

  $alertStr = "alert%%".$_SESSION[username]."%%".$alertMsg;

  $result = mysql_query("SELECT Udfor FROM actions WHERE (Brugernavn = '$alertUser' and Rum = '$_SESSION[rum]')");
  $row = mysql_fetch_array($result);
  mysql_query("UPDATE actions SET Udfor = '".$row["Udfor"].$alertStr."|' WHERE (Brugernavn = '$alertUser' AND Rum = '$_SESSION[rum]')");
}

Nogen hjælp at hente??
Avatar billede jakoba Nybegynder
10. januar 2003 - 00:45 #1
break 2;  // if sætninger tæller ikke med.
Avatar billede Slettet bruger
10. januar 2003 - 00:46 #2
break 2; kan gøre det. Så hopper du ud af while() og ud af for().

Så det er ikke det, der er problemet. Det er din betingelse:

If ($row[Brugernavn] == $alertUser) {

Der er problemet.

Hvor kommer $row[Brugernavn] fra? Du udtrækker jo kun IsThere.
Avatar billede tipsen Nybegynder
10. januar 2003 - 03:12 #3
$arrAlerting = explode(" ", $alertStr);

  for ($i=1; $i<count($arrAlerting);$i++) {
  if ($i == 1) {
    $alertUser = $arrAlerting[$i];
  } else {
    $alertUser = $alertUser." ".$arrAlerting[$i];
  }

Sørger denne stump kode ikke bare for at kopiere indholdet af variablen $alertStr til variablen $alertUser ?
Avatar billede tipsen Nybegynder
10. januar 2003 - 03:14 #4
Kan ikke se, hvad det skal bruges til, men det kan skrives kortere som:

$alertUser = $alertStr;

eller evt:

  $arrAlerting = explode(" ", $alertStr);
  $alertUser = '';
  foreach($arrAlerting as $alertItem) {
  for ($i=1; $i<count($arrAlerting);$i++) {
    $alertUser .= " $alertItem";
  }

-hvis det skal være molbo... - men det er også muligt jeg bare ikke fatter noget.
Avatar billede jakoba Nybegynder
10. januar 2003 - 03:24 #5
kik på tuborgerne, der sker en masse mere før den forløkke slutter :-))
Avatar billede jakoba Nybegynder
10. januar 2003 - 03:43 #6
men der er nu noget muggent ved den funktion
her med indrykninger:

function doAlert($alertStr) {
    Require("functions.inc.php");

    $arrAlerting = explode(" ", $alertStr);        // §1

    for ($i=1; $i<count($arrAlerting);$i++) {
        if ($i == 1) {
            $alertUser = $arrAlerting[$i];
        } else {
            $alertUser = $alertUser." ".$arrAlerting[$i];
        }
        $result = mysql_query("
            SELECT COUNT(*) AS IsThere
            FROM users_in
            WHERE (Brugernavn = '".$alertUser."'
              AND rum = '$_SESSION[rum]')
        ") or die(mysql_error());                  // §2
        WHILE ($row = mysql_fetch_array($result)) {
            echo "$row[IsThere]<br>";
            If ($row[IsThere] != "0") {
                echo "Er der<br>";
                If ($row[Brugernavn] == $alertUser) {
                    $j = $i;
                    break 4; <-- Denne her break
                }
            }
        }
    }

    $alertMsg = "";

    for ($i=$j;$i<count($arrAlerting);$i++) {
        $alertMsg = $alertMsg." ".$arrAlerting[$i];
    }

    $alertStr = "alert%%".$_SESSION[username]."%%".$alertMsg;

    $result = mysql_query("
        SELECT Udfor
        FROM actions
        WHERE (Brugernavn = '$alertUser' and Rum = '$_SESSION[rum]')
    ");
    $row = mysql_fetch_array($result);
    mysql_query("
        UPDATE actions
        SET Udfor = '".$row["Udfor"].$alertStr."|'
        WHERE (Brugernavn = '$alertUser'
          AND Rum = '$_SESSION[rum]')
    ");
}

Såvidt jeg kan se indeholder parameteren  $alertStr  en liste af brugernavne adskildt med blanktegn.

så i første gennemløb af forløkken indeholder  $alertUser  det først brugernavn i den liste. i næste gennemløb vil den indeholde 2 brugernavne, så 3 osv

og det giver ingen mening for i alle sql-kommandoerne siger du
            WHERE (Brugernavn = '".$alertUser."'
og det forudsætter at  $alertUser  er eet enkelt brugernavn

mvh JakobA
Avatar billede tipsen Nybegynder
10. januar 2003 - 11:26 #7
ahh - det _var_ mig som var træt! :)
Avatar billede jps2mt Nybegynder
10. januar 2003 - 12:07 #8
Når jeg trækker SELECT COUNT(*), kan man så ikke hente det hele ud af DB'en, som med SELECT *, blot med en count som tilløg??

jakoba >> NÆSTEN korrekt...


$alertStr KUNNE også indeholde /alert Dette Er Et Brugernavn Dette Er En Besked

$alertStr bliver så opdelt ved mellemrum.../alert skal selve funktionen ikke bruge til noget, Dette Er Et Brugernavn er så brugernavnet, men der ville jo kun være Dette i $arrAlerting[1] derfor skulle jeg bruge en funktion der kunne kigge på hvilke brugere der ver inde (det er en chat)...

Den kigger se om Dette er en bruger der er logget ind, hvis det ikke er, kigger den om Dette Er er logget ind osv. indtil den finder Dette Er Et Brugernavn i databasen, hvorfra den jo så sagtens kan finde Dette Er En Besked ud fra hvor for løkken stoppede med at køre...

Håber det kunne forklare hvorfor den lidt specielle funktion, er ikke klar over om det er den optimale måde at gøre det på og i er velkommen til at komme med forslag til hvordan det ellers kunne gøres, evt. mod flere point hvis det kunne lokke lidt... :)
Avatar billede jakoba Nybegynder
10. januar 2003 - 12:18 #9
er det så ikke $arrAlerting[$i] du skal bruge som søgekriterie i dine sql-sætninger. det er der du har ordene et ad gangen. i variablen $alertUser står  alle ord frem til det $i'ende i een lang streng.
Avatar billede jps2mt Nybegynder
10. januar 2003 - 12:32 #10
Lige netop...$aarAlerting[$i] indeholder jo kun EET ord, ikke en del af et brugernavn...For at jeg kan tilføje ord til et brugernavn og teste med det bruger jeg $alertUser, som lige netop bliver et ord længere for hver omgang i for løkken, indtil den har fundet et brgernavn...
Avatar billede jps2mt Nybegynder
10. januar 2003 - 12:56 #11
Men det ser ud til at problemet med om den finder brugernavnet eller ej blev løs med denne her:

        if ($i == 1) {
            $alertUser = $arrAlerting[$i];
        } else {
            $alertUser = $alertUser." ".$arrAlerting[$i];
        }

Nu ser det bare ikke ud til at jeg kan trække lave en $row[Brugernavn] når man laver SELECT COUNT(*) kan det passe??
Avatar billede jakoba Nybegynder
10. januar 2003 - 13:03 #12
lad os tage et eksempel:
$alertStr indeholder "/alert pusser256 skal vi møffe over i et privat rum?"

det vi skal finde er brugernavnet 'pusser256', ikke?

første gang igennem for løkken vil $alertUser indeholde "/alert"
anden gang vil $alertUser indeholde "/alert pusser256"
tredie gang vil $alertUser indeholde "/alert pusser256 skal"
...

så vi vil aldrig finde pusser256.
Hvis brugernavnet ikke er det allerforreste ord i strengen $alertstr vil det altid være omgivet at andre ord sådan at sammenligningen i linien
    WHERE Brugernavn = '$alertUser'
alligevel ikke er opfyldt.

prøv evt:

function doAlert($alertStr) {
    Require("functions.inc.php");

    $ordliste = "( Brugernavn='" .implode( "' OR Brugernavn='", explode(" ", $alertStr) ) ."' )";

    $result = mysql_query("
        SELECT *
        FROM users_in
        WHERE rum = '$_SESSION[rum]'
          AND $ordliste
    ") or die(mysql_error());

    $alertStr = "alert%%".$_SESSION[username]."%%".$alertStr;

    if ( mysql_num_rows( $result ) >= 1 ) {  // det blev fundet mindst eet brugernavn

        while ( $row = mysql_fetch_array($result) ) {  // for hver af dem

            $alertUser = $row['Brugernavn'];

            $result2 = mysql_query("
                SELECT Udfor
                FROM actions
                WHERE Brugernavn = '$alertUser'
                  AND Rum = '$_SESSION[rum]'
            ");

            $row2 = mysql_fetch_array($result2);

            mysql_query("
                UPDATE actions
                SET Udfor = '".$row2["Udfor"].$alertStr."|'
                WHERE Brugernavn = '$alertUser'
                  AND Rum = '$_SESSION[rum]'
            ");
        }

    }
    else {
        echo "FEJL. funktionen doAlert kunne ikke finde nogen brugere.\n";
    }
}

mvh JakobA
Avatar billede jps2mt Nybegynder
10. januar 2003 - 13:15 #13
Nej nej nej...Lige neto0op DERFOR starter den først med at læse $arrAlerting fra nummer 1 (for ($i=1...)...Så springer den jo /alert over...
Avatar billede jakoba Nybegynder
10. januar 2003 - 13:23 #14
Noget andet er at jeg er ikke specielt glad for den måde at gøre det på. man kunne nemt forestille sig en $alertStr der indeholdt:
"/privat pusser256 adonis45 er da en værre idiot, synes du ikke?"

og den besked ville så blive alerted BÅDE til pusser256 og til adonis45. ikke godt.

så jeg ville hellere stramme op på formatet af det der står i $alertStr så vi ikke blot alerter hvemsomhelst der er nævnt. fx kunnd vi opdele den i 3 dele adskildt med '|' tegn

/hvadforentype | hvemtil | tekst
strengen ovenfor ville så blive
"/privat | pusser256 | adonis45 er da en værre idiot, synes du ikke?"
og siden pusser256 er det eneste ord der står efter den første | og før den anden | skal pusser256 være den eneste der modtager den besked.
hvis der istedet stod
"/privat | pusser256 adonis45 | hende angel2578 er da en værre idiot, synes i ikke?"
ville så blive sendt til pusser256 og adonis45, men ikke til angel2578

mvh JakobA
Avatar billede jakoba Nybegynder
10. januar 2003 - 13:27 #15
an 10/01-2003 13:15:00
  hvorfor så overhovedet lave en for-løkke. det eneste brugernavn der nogensiden kan findes er det der ligger i $arrAlerting[1]
Avatar billede jps2mt Nybegynder
10. januar 2003 - 13:39 #16
Nej...Det er det jo ikke...Hvis brugernavnet indeholder et mellem rum, for at tage et eksempel...

En af mine venner har brugernavnet Den Magiske Svamp...Det ville jo brede sig over $arrAlerting[1] - $arrAlerting[3]...
Avatar billede jps2mt Nybegynder
10. januar 2003 - 13:41 #17
an 10/01-2003 13:23:42 så ville det jo aldrig ske, da den jo starter fra 1 som ville være pusser256, når den så finder det brugernavn (den vil jo finde det først, da den starter med at tjekke fra nummer 1 hver gang) så skal den jo stoppe, og KUN skrive til den bruger...Den når aldrig at se om adonis45 er en gyldig bruger i rummet...
Avatar billede jakoba Nybegynder
10. januar 2003 - 14:32 #18
ok
Avatar billede jps2mt Nybegynder
11. januar 2003 - 10:00 #19
Hvis du dropper et svar skal jeg gi' dig pointene, fik det til at virke, ved din hjælp...

Måtte lave en lille omskrivning af det du skrev tidligere, men nu virker det til gengæld... :)
Avatar billede jakoba Nybegynder
11. januar 2003 - 12:12 #20
fint
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