Permalänk

PHP, radera från databas

Jag har gjort en gästbok som nästan fungerar perfekt.

Men nu vill jag kunna radera inlägg också. Gjort en inloggning och får fram en chekbox vid varje inlägg och en radderingsknapp.
Men där kommer problemet.

Kryssar jag i fler rutor får jag ändå bara svar från sista inlägget om de är ikryssat.. Kryssar jag inte i sista inlägget utom massa (en) andra händer inget...

Gjort en print_r på $_POST['my_number'] och den visar: Array ( [0] => 7 )
med foreach slinga får jag bara ut 7 (sista inläggets nr) hur många ja en kryssar. kryssar ja annat en sista får ja inget..

Tror att något är fel på kryssrutorna.. Tips?

Ursäkta mycket kod. Bara start av sidan över, å slut av sidan under som saknas..

<?php include ("databas.php"); //öppnar databasen $open = mysql_connect( $dbhost, $dbroot, $dbpassword ) or die("SQL: $sql <br/>".mysql_error()); mysql_select_db( $databas, $open ) or die("SQL: $sql <br/>".mysql_error()); //Öppnad // läser från medelanden $data = mysql_query( "SELECT * FROM $dbgest"); while($rad = mysql_fetch_array ($data)) { $n = ($rad["nr"]); $n++; } if (empty($n)){ $n=1; } //logga in if( isset($_POST['skicka']) ){ if(($_POST['url'])== $passwordname){ $passwords = $password1; } if((($_POST['url'])== $passwordname) and (($_POST['pass'])== $password)){ $ratt = $inloggad; } else{ //Glömt att skriva något if((trim($_POST['namn'])=="") || (trim($_POST['meddelande'])=="")) { $fel = "<table class='fel'><tr><td class='fel1'>Lite mer tack.. <br>Skriv ditt namn och ett meddelande!</tr></td></table>"; } //alla obligatoriska fält är ifyllda, så spara else { $dbinfo = mysql_query ("INSERT INTO gastbok (tid, nr, namn, meddelande, Email, url) VALUES ( NOW(), $n, '$_POST[namn]', '$_POST[meddelande]', '$_POST[Email]', '$_POST[url]')") or die(mysql_error()); $_POST = ""; } } } //Formuläret echo "<table><tr><td><form method='post' action='" . $_SERVER['PHP_SELF'] . "?p=" . $_GET['p'] . "'>"; echo "Namn:</br><input type='text' name='namn' value='" . $_POST['namn'] . "'></td>"; echo "<td>E-mail:</br><input type='text' name='Email' value='" . $_POST['Email'] . "'></td></tr><tr>"; echo "<td>Url:</br><input type='text' name='url' value='" . $_POST['url'] . "'><td>"; //Visar lösenords fält. if($passwords == $password1){ echo "Lösen:</br> <input type='password' name='pass' value='" . $_POST['pass'] . "'></br></td></tr><tr>"; $fel = ""; } else{ echo "</br></td></tr><tr>"; } echo "<td colspan=2>Medelande:</br><textarea name='meddelande' cols= 35 rows=6 value='" . $_POST['meddelande'] . "'></textarea></br>"; echo "<center><input type='submit' value='skicka' name='skicka'></center></td></tr></table></form>"; echo $fel; //Här börjar problemet.. tar bara bort det sista inlägget även fast jag kryssar för fler.. //Tar bort inlägg if( isset($_POST['radera'])){ $user = $_POST['my_number']; foreach ($user as $nr) $sql = "DELETE FROM $dbgest WHERE nr = '" . $nr . "'"; $result = mysql_query($sql); $synlig = "H5BBi"; } //Är du inloggad kommer det här fram if (($ratt == $inloggad) or ($synlig == "H5BBi")) { echo "<form method='post'>"; // för att få radera knappen att va kvar $_POST = ""; //ta bort echo "<input type='submit' value='radera' name='radera'>"; } // läser från medelanden echo "<table class='tabbel'><tr><td>"; $data = mysql_query( "SELECT * FROM $dbgest ORDER BY nr DESC"); while($rad = mysql_fetch_array ($data)) { //tiden echo "<hr noshade><table class='meddelanden'><tr class='farg'><td class='date'>" . ($rad["tid"]) . "</td><td class='nr'>"; //Här tror jag att boven är, men förstår inte felet.. //Kryssruta för att ta bort meddelanden.. (FEL)?????? if (($ratt == $inloggad) or ($synlig == "H5BBi")){ echo "<font class='radera'>Radera: <input type='checkbox' name='my_number[]' value='" . $rad['nr'] . "'>"; } //nr: echo "#" . ($rad["nr"]) . "</td></tr>"; if (($ratt == $inloggad) or ($synlig == "H5BBi")){ echo "</form>"; } //Namnet, länkat till mail. Om de finns if (!empty($rad['Email'])){ echo "<tr><td class='namn'><a href=mailto:" . ($rad["Email"]) . ">" . ($rad["namn"]) . "</a></br>"; } else{ echo "<tr><td class='namn'>" . ($rad["namn"]) . "</br>"; } // webadress gjort till länk if (!empty($rad['url'])){ echo "<a href=" . ($rad["url"]) . "target='_blank' title='" . ($rad["url"]) . "' target='_blank'>Hemsida</a><br></td>"; } else { echo "</td>"; } //Medelandet echo "<td class='med'>" . nl2br ($rad["meddelande"]) . "</td>"; echo "</tr></table></br>"; } //slutläst echo "</tr></table></br>"; //stänger databas mysql_close($open); ?>

Permalänk
Medlem

foreach ($user as $nr)
$sql = "DELETE FROM $dbgest WHERE nr = '" . $nr . "'";
$result = mysql_query($sql);

Du har ju inga klamrar för din foreach - vilket gör att bara första raden ($sql = .....) anropas upprepade gånger, vilket således gör att bara ett mysql-anrop görs, med den senast uppdaterade $sql-variabeln.

Detta gör susen:

foreach ($user as $nr) { $sql = "DELETE FROM $dbgest WHERE nr = '" . $nr . "'"; $result = mysql_query($sql); }

Då förutsätter jag att $_POST['my_number'] är en array som har alla dina ikryssade nummer som ska raderas (vilket jag inte orkar kontrollera).

Permalänk

Tyvärr så hjälpte det inte så mycket. samma problem går bara att radera sista:(

kryssar jag i andra så får jag ett error:

Warning: Invalid argument supplied for foreach() in E:\www\gastbok\gb.php on line 84

if( isset($_POST['radera'])){ $user = $_POST['my_number']; foreach ($user as $nr) //line 84 { $sql = "DELETE FROM $dbgest WHERE nr = '" . $nr . "'"; $result = mysql_query($sql); } }

hur kontrolerar man $_POST['my_number'] då?
Var det inte det jag gjorde med print_r? svaret blev Array ( [0] => 7 ) om ja kryssa i sista annars inget..
och med foreach slinga blev det bara 7.. (sista inlägget)

Permalänk
Medlem

Först och främst borde alla dina checkboxar för "ta bort" ha ett varsitt name, t.ex. "delete" [0-oändligt] för varje rad i tabellen.... Sen när POST är mottaget så iterar du igenom den och tittar efter element vars key börjar med "delete" och sedan raderar du alla rader vars id finns med.

foreach($_POST as $key->$val) { if(substr($key, 0, 6) == "delete") { $deleteId = intval($key); // tror detta ska funka. $res = mysql_query("delete from .... where nr = $deleteId"); } }

En bra väg i felsökningens tecken är iaf att du först och främst kontrollerar att all information du behöver faktiskt kommer fram. Det gör du ju me print_r och lite sånt.

När du vet att all info kommer fram så tar du reda på varför databasen inte gör som den ska. Det gör du förslagsvis genom att skriva ut dina queries så att du ser hur de ser ut.

Permalänk
Citat:

Ursprungligen inskrivet av totoo
Först och främst borde alla dina checkboxar för "ta bort" ha ett varsitt name, t.ex. "delete" [0-oändligt] för varje rad i tabellen.... Sen när POST är mottaget så iterar du igenom den och tittar efter element vars key börjar med "delete" och sedan raderar du alla rader vars id finns med.

foreach($_POST as $key->$val) { if(substr($key, 0, 6) == "delete") { $deleteId = intval($key); // tror detta ska funka. $res = mysql_query("delete from .... where nr = $deleteId"); } }

Varsitt name? Får dom inte det av name='my_number[]'? *trodde*
Förstår inte riktigt hur jag ska göra det..

Och vad kommer 0, 6 ifrån?

Rätt så ny på det här. eller var 100 år sen sist i alla fall.. har ju konstaterat att fel värden kommer i alla fall. bara sista inlägget..

-------------------------------------------------------------------

Måste vara något skumt fel på min dator...
La ut den och då fungerar den felfritt *mysko*
Men tack för hjälpen ändå:P

Men fortfarande ett problem, det är att meddelandet inte sparas om jag glömmer skriva i namn:( De är lite hårt.. Alla andra fält sparas bra..
fungerar inte $_POST['meddelande'] på textarea?

vill ni testa så ligger den ute på
www.utstrand.se/Test/gb.php

Permalänk
Medlem

Den fungerar ju inte alls som den ska... Jag kryssar i två olika och bara den med högst id raderades.

och my_number[] gör att alla heter "my_number[]" vilket inte fungerar speciellt bra. Alla måste ha ett unikt namn, annars är det kört för dig. Om du inte redan har för vana att göra det - titta i koden och se vad som genereras. Där ser man klart och tydligt att alla har samma namn.

Förslagsvis döper du alla som jag skrev, t.ex. delete [+ inläggets unika id]

"Och vad kommer 0, 6 ifrån?" Titta i manualen vad substr är till för så kanske du fattar vad min rad gör.

Permalänk

Skumt, för mig går det att radera fler..
Men får väl försöka döpa dom till annat..

Permalänk
Medlem

Bifogar lite kod som demonstrerar i hur jag har gjort det du vill göra.

# Loopen med checkbox för att ta bort meddelande echo " <th width='10'><input type='checkbox' value='".$row['mess_id']."' name='delete[]' /></th>\n"; # Radera if (isset($_POST['delete'] ) ) { $id = implode(", ", $_POST['delete']); $delete = "DELETE FROM pm where mess_id IN($id) AND owner_id = $_SESSION[sess_id]"; $result = mysql_query($delete) or die (mysql_error()); header("Location: pm.php?inbox&deleted" ); exit; }

Kanske hjälper dig lite på traven.

Visa signatur

MSI B650 Tomahawk, 7800X3D, RTX 3080, 32GB DDR5 6000MHz, MSI MPG A850G

Permalänk

hm, får bara error när jag testar på ditt sätt.
fel på $id = implode(", ", $_POST['delete']); linjen.
Sen tog ja bort lite av din raderaingskod. Men förstod jag rätt ville du radera på 2 olika ställen..

Men jag får nöja mig med som de är nu, går att radera som jag vill i firefox, ej i IE skumt, men men..