Avatar billede svjensen Nybegynder
27. august 2004 - 17:47 Der er 10 kommentarer og
2 løsninger

Fjerne hvis ikke checked

Min bruger kan vha. checkboxe markere hvilke spillere der er på et bestemt hold. I mit efterfølgende script skal jeg så gerne have fjernet dem der ikke længere er 'checked'
Det gør jeg ved at hente alle spillere, der ikke er checked og kontrollere om de er sat på det specifikke hold. Hvis ja, så skal de slettes. Det har virket før (i ASP), men jeg kan ikke få det til at virke i PHP.

Her er scriptet:

for ($i = 0; $i < count($_POST['chk1']); $i=$i+1){
    $strNotIn = $strNotIn.$_POST['chk1'][$i].", ";
}
$strNotIn = substr($strNotIn, 0, strlen($strNotIn) - 2);
   
$strSQLNotIn = "SELECT medlemsnr FROM medlemmer WHERE medlemsnr NOT IN (".$strNotIn.")";
$resNotIn = mysql_query($strSQLNotIn);
echo "strNotIn: ".$strSQLNotIn;
echo "<br><br>";

while ($rowNotIn = mysql_fetch_assoc($resNotIn)) {
    $strSQL2 = "SELECT * FROM hold WHERE medlemsnr = '".Trim($rowNotIn['medlemsnr'])."' AND teamid = '".$_GET['team']."'";
    $res2 = mysql_query($strSQL2);
    echo "res2: ".$strSQL2."<br>";
       
    if (mysql_num_rows($res2) > 0){
        $strSQL3 = "DELETE FROM hold WHERE medlemsnr = '".Trim($rowNotIn['medlemsnr'])."' AND teamid = '".$_GET['team']."'";
    //    $res3 = mysql_query($strSQL3);
        echo $strSQL3."<br>";
    }
}

'echo' sætninger er blot med for at jeg kan følge med i forløbet.

Resultatet af ovenstående er, at alle spillere returneres fra første SQL query, og dem der er checked (altså med i $strNotIn) bliver slettet.

Kan I følge mig, eller blev det for indviklet?
Avatar billede coderdk Praktikant
27. august 2004 - 20:57 #1
Jeg kan ikke se noget galt i din kode, som jeg har lavet en smule om i, for min egen skyld:

if ( is_array( $_POST['chk1'] ) )
{
  $strNotIn = implode( ",", $_POST['chk1'] );
  $strSQLNotIn = "SELECT medlemsnr FROM medlemmer WHERE medlemsnr NOT IN (".$strNotIn.")";
  $resNotIn = mysql_query( $strSQLNotIn );
  echo "strNotIn: ".$strSQLNotIn;
  echo "<br><br>";

  while ( $rowNotIn = mysql_fetch_assoc( $resNotIn ) )
  {
    $strSQL2 = "SELECT * FROM hold WHERE medlemsnr = '". trim( $rowNotIn['medlemsnr'] ) . "' AND teamid = '" . mysql_escape_string( $_GET['team'] ) . "'";
    $res2 = mysql_query( $strSQL2 );
    echo "res2: ".$strSQL2."<br>";
     
    if ( mysql_num_rows( $res2 ) > 0 )
    {
        $strSQL3 = "DELETE FROM hold WHERE medlemsnr = '" . trim( $rowNotIn['medlemsnr'] ) . "' AND teamid = '" . mysql_escape_string( $_GET['team'] ) . "'";
    //    $res3 = mysql_query($strSQL3);
        echo $strSQL3."<br>";
    }
}

Jeg kan dog ikke se hvorfor du ikke bare laver denne:

if ( is_array( $_POST['chk1'] ) )
{
  $strNotIn = implode( ",", $_POST['chk1'] );
  $sql = "DELETE FROM hold WHERE medlemsnr IN ( $strNotIn )";
  mysql_query( $sql );
}
Avatar billede coderdk Praktikant
27. august 2004 - 20:58 #2
I din form ser chk1 checkboxen naturligvis sådan ud:

<input type="checkbox" name="chk1[]" value="et-medlemsnr">

Ikke?
Avatar billede svjensen Nybegynder
27. august 2004 - 22:02 #3
Jo chk1 ser ud som du skriver, og de rigtige data bliver også taget med over.

Dit eksempel sidst i din første kommentar dur ikke, da de medlemsnr. der er i chk1, netop er dem der skal blive på holdet. Jeg er derfor nødt til at finde alle de numre, der ikke er i chk1, og kontrollere om de er knyttet til holdet. Hvis de er det skal tilknytningen slettes.

Jeg kendte i øvrigt ikke implode(),men det gør det naturligvis lidt lettere. Jeg tror, at jeg prøver at indsætte din kode, og arbejder lidt videre.
Avatar billede svjensen Nybegynder
27. august 2004 - 22:11 #4
Lige et udsnit af echo'erne:

strNotIn: SELECT medlemsnr FROM medlemmer WHERE medlemsnr NOT IN (007,004,059,060,011,005,002,003,008)

res2: SELECT * FROM hold WHERE medlemsnr = '001' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '002' AND teamid = '1'
DELETE FROM hold WHERE medlemsnr = '002' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '003' AND teamid = '1'
DELETE FROM hold WHERE medlemsnr = '003' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '004' AND teamid = '1'
DELETE FROM hold WHERE medlemsnr = '004' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '005' AND teamid = '1'
DELETE FROM hold WHERE medlemsnr = '005' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '006' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '007' AND teamid = '1'
DELETE FROM hold WHERE medlemsnr = '007' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '008' AND teamid = '1'
DELETE FROM hold WHERE medlemsnr = '008' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '009' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '011' AND teamid = '1'
DELETE FROM hold WHERE medlemsnr = '011' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '012' AND teamid = '1'
DELETE FROM hold WHERE medlemsnr = '012' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '013' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '014' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '015' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '016' AND teamid = '1'
res2: SELECT * FROM hold WHERE medlemsnr = '017' AND teamid = '1'

De tal der er med i første linie, skal IKKE slettes. Det skal derimod fx 012.
Avatar billede svjensen Nybegynder
27. august 2004 - 22:12 #5
Hov 012 var med i DELETE. Problemet ser ud til at være at ALLE medlemsnr bliver taget med, og ikke kun dem der ikke er inkluderet i $strNotIn.
Avatar billede svjensen Nybegynder
27. august 2004 - 22:13 #6
Men det lugter måske lidt af et MySQL spørgsmål i stedet for.
Avatar billede svjensen Nybegynder
27. august 2004 - 22:15 #7
Jeg kigger på det igen i morgen. Indtil da vil jeg overveje at flytte spørgsmålet.
Avatar billede coderdk Praktikant
28. august 2004 - 03:01 #8
Hvad med blot:

if ( is_array( $_POST['chk1'] ) )
{
  $strNotIn = implode( ",", $_POST['chk1'] );
  $sql = "DELETE FROM hold WHERE medlemsnr NOT IN ( $strNotIn )";
  mysql_query( $sql );
}
Avatar billede svjensen Nybegynder
29. august 2004 - 10:05 #9
Jeg tror, at jeg lige er nødt til at forklare mig lidt nærmere.

Jeg har en tabel med mine medlemmer 'medlemmer' identificeret med 'medlemsnr'. Der udover har jeg nogle hold i tabellen 'teams' med id 'teamid'. Knytningen mellem de to sker i tabellen 'hold'.
Jeg er derfor nødt til at finde dem, der ikke indgår i 'chk1', og derefter fjerne en tilknytningen mellem dem og det pågældende hold.

Jeg er ikke i tvivl om, at scriptet generelt virker, men min første sql_query returnerer ikke det jeg regner med.
Avatar billede svjensen Nybegynder
29. august 2004 - 10:14 #10
Jeg fandt problemet.

Der skulle pinger(') omkring medlemsnr i parentesen.
Derfor dur 
    $strNotIn = implode( ",", $_POST['chk1'] );
tilsyneladende ikke, mens

    for ($i = 0; $i < count($_POST['chk1']); $i=$i+1){
        $strNotIn = $strNotIn."'".$_POST['chk1'][$i]."', ";
    }
    $strNotIn = substr($strNotIn, 0, strlen($strNotIn) - 2);

giver det rigtige resultat.

coderdk -> jeg vil godt give dig lidt for din ulejlighed. Giver du lige et svar?
Avatar billede coderdk Praktikant
29. august 2004 - 10:28 #11
hehe ok :)
Avatar billede svjensen Nybegynder
29. august 2004 - 10:37 #12
Tak for hjælpen.
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