/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Delete fra Mysql? (newbie)
Fra : Peter Jensen


Dato : 13-10-02 19:28

Hej,

Nogen der kan hjælpe mig hvordan jeg får slettet data fra mysql?
Det jeg gerne vil have hjælp til er en side hvor jeg vha en radiobutton
marker den post jeg vil slette.

Mvh
Peter Jensen.

Jeg har flg. til at tilføje data:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Tilføj nyhed</title>
</head>
<body>
<h3 align="center">Tilføj nyhed.</h3><br>
<br>
<form action="<? echo $php_self ?>">
Overskrift<br>
<input type="text" name="overskrift"><br>
<br>
Besvaret af:<br>
<input type="text" name="besvaret"><br>
<br>
Resume:<br>
<input type="text" name="resume"><br>
<br>
Selve teksten:<br>
<TEXTAREA NAME="tekst" ROWS=15 COLS=70></TEXTAREA><br>
<br>
<input type="submit" name="add_question" value=" - OK - ">
</form>
<?

if($add_question)
{
include("dbinfo.inc.php");
mysql_connect($localhost,$username,$password)or die (mysql_error());
mysql_select_db($database) or die (mysql_error());
$query = mysql_query("INSERT INTO kironews (overskrift, besvaret, resume,
tekst)" . "VALUES ('$overskrift','$besvaret','$resume','$tekst')");
echo "Din nyhed er tilføjet. Tilføj flere eller vis dine nyheder <a
href=\"03_index.php\">her.</a>";
}
?>
</body>
</html>



 
 
Regin Larsen (13-10-2002)
Kommentar
Fra : Regin Larsen


Dato : 13-10-02 19:41

Peter Jensen wrote:

> Tilføj nyhedNogen der kan hjælpe mig hvordan jeg får slettet data fra
> mysql?
> Det jeg gerne vil have hjælp til er en side hvor jeg vha en
> radiobutton marker den post jeg vil slette.

$result = mysql_query("SELECT * FROM kironews");
while ($row = mysql_fetch_array($result))
{
   print "<input type='radio' name='id' value='{$row['id']}'> Slet
{$row['id']}";
}

Så har du fået smidt alle poster i tabellen kironews ud med en
radiobutton. Der skal selvfølgelig oprettes <form ...>, men det går jeg
ud fra at du har styr på.

På en ny side gør du noget lign.:
$result = mysql_query("DELETE FROM kironews WHERE id = '$id'");

Håber det hjælper lidt på vej...


--
Regin


Peter Jensen (15-10-2002)
Kommentar
Fra : Peter Jensen


Dato : 15-10-02 09:18

Nedenstående virker ikke, lidt hjælp please:
<?
include("dbinfo.inc.php");

mysql_connect($localhost,$username,$password) or die(mysql_error());
mysql_select_db($database) or die(mysql_error());

$result = mysql_query("SELECT * FROM kironews");
while ($row = mysql_fetch_array($result))
{
print "<input type='radio' name='id' value='{$row['id']}'> Slet -
{$row['id']}";
echo"<BR>";
}
echo "<form action=\"pre_slet.php\">";

echo "<input type=\"submit\" name=\"slet\" value=\"Slet\">";
echo "</form>";
?>
***********************************
ovenstående sendes til pre_slet.php:
***********************************
<?
include("dbinfo.inc.php");

if($slet)
{
mysql_connect($localhost,$username,$password) or die (mysql_error());
mysql_select_db($database)or die (mysql_error());
$result = mysql_query("DELETE FROM kironews WHERE id = '$id'");

}
//Header("Location: admin_vinklub.php");
?>



Peter Jensen (15-10-2002)
Kommentar
Fra : Peter Jensen


Dato : 15-10-02 15:45

Hej,
Har nu nedenstående, som ser ud til at virke.
Er der nogen "fejl" dvs noget I mener der skal ændres etc?

Peter.
***********************
<html>
<body>
<form method="get" action="slet.php">

<?
include("dbinfo.inc.php");

mysql_connect($localhost,$username,$password) or die(mysql_error());
mysql_select_db($database) or die(mysql_error());

$result = mysql_query("SELECT * FROM kironews order by id DESC");
while ($row = mysql_fetch_array($result))
{
print "<input type='radio' name='id' value='{$row['id']}'> Slet -
{$row['id']} {$row['overskrift']}";
echo"<BR>";
}
?>

<input type="submit" value="slet" name="slet"></form>

</body>
</html>

********************************
og slet.php:
********************************
<?php
print "$slet";
if($slet) {
include("dbinfo.inc.php");
mysql_connect($localhost,$username,$password)or die (mysql_error());
mysql_select_db($database) or die (mysql_error());
$sletquery = mysql_query("DELETE from kironews where id='$id'");
}
//Header("Location: admin.php");//
?>
*****************************************



Niels Andersen (16-10-2002)
Kommentar
Fra : Niels Andersen


Dato : 16-10-02 17:08

Peter Jensen wrote in <3dac29f7$0$7009$edfadb0f@dspool01.news.tele.dk>:
> Har nu nedenstående, som ser ud til at virke.
> Er der nogen "fejl" dvs noget I mener der skal ændres etc?

Jeg kan da nævne et par ting. :)

> <html>

Der er ingen doctype.

> <body>

Der er ingen head-sektion.

> <form method="get" action="slet.php">

Du bør her bruge "post" i stedet for "get". Jeg har lige skrevet en lang
forklaring i en anden tråd her i dag. :)

> include("dbinfo.inc.php");
> mysql_connect($localhost,$username,$password) or die(mysql_error());
> mysql_select_db($database) or die(mysql_error());

Jeg ville placere de to linjer i db-filen.

> $result = mysql_query("SELECT * FROM kironews order by id DESC");

"SELECT *" bør man normalt ikke bruge til anden end tests, og hurtigere
queries der bare skal fyres af en enkelt gang.
Specificer hvilke felter du skal bruge.

> print "<input type='radio' name='id' value='{$row['id']}'> Slet -
> {$row['id']} {$row['overskrift']}";

Radio? Er det meningen at man absolut kun må slette én af gangen?
Jeg ville bruge en checkbox. Hvis du gør det kan du ændre navnet til fx.
"id[]". Så bliver $_REQUEST['id'] til et array, med en liste over dem, der
er sat kryds i.

> <input type="submit" value="slet" name="slet"></form>

Bruger du submit-knappen til anden end at submitte med?
Med den kode sender du data med navnet "slet" og værdien "slet". Skal du
bruge det til noget?
Hvis ikke kan du lige så godt fjerne navnet. Så genererer knappen ingen
data.

> print "$slet";

Hvis dette virker, så har du nok register_globals slået til. Jeg synes det
er en dårlig feature, som giver sikkerheds-problemer, og nærmest opfordrer
til sjusket kode.

> if($slet) {

Det du gør her er jo egentlig at tjekke om der er trykket på submit-knappen.
Jeg synes det kan være ret ligegyldigt om man har brugt submit-knappen,
eller om man har gjort noget andet for at submitte.
I stedet ville jeg tjekke om der er nogen id'er.

Fx:
if (isset($_QUERY['id'])) {

hvis du har lavet tricket med at lave et array, så kan du gøre sådan her:

foreach($_QUERY['id'] AS $id) {

og inde i foreach-løkken kan du så fyre denne af:

> $sletquery = mysql_query("DELETE from kironews where id='$id'");

> //Header("Location: admin.php");//

URI'en i en Location-header skal være absolut, dvs. (i praksis) den skal
starte med "http".


Det var lige de vigtigste ting jeg lagde mærke til.

Der dukker sikkert flere ting op hvis jeg ser koden igennem igen efter disse
ændringer, men man kan jo altid lave forbedringer.
Jeg har på fornemmelsen at dette er et værktøj kun du skal bruge. Så betyder
pæn kode og standarder pludseligt meget mindre. Så er det fint, hvis bare
det virker.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Thomas Jensen (16-10-2002)
Kommentar
Fra : Thomas Jensen


Dato : 16-10-02 19:36

First things first:
1000 tak fordi du brugte tid, Niels :)

Nedenstående er ændret jvf din "opskrift", men der er et eller andet der
ikke kører ( i array eller foreach).
Der bliver ikke slettet noget.
Har du (eller en anden) lidt tid igen?

Peter

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Tilføj spg</title>
</head>
<body>

<form method="POST" action="slet.php">

<?
include("dbinfo.inc.php");

$result = mysql_query("SELECT * FROM kironews order by id DESC");
while ($row = mysql_fetch_array($result))
{
print "<input type='checkbox' name='id' value='{$row['id[]']}'> Slet -
{$row['id[]']} {$row['overskrift']}";
echo"<BR>";
}
?>

<input type="submit" value="slet"></form>

</body>
</html>
*********************************
og slet.php:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Slet spg</title>
</head>

<body>

<?php
if (isset($_QUERY['id']))
{
include("dbinfo.inc.php");

foreach($_QUERY['id'] AS $id)
{
$sletquery = mysql_query("DELETE from kironews where id='$id'");
}
}
?>




Niels Andersen (17-10-2002)
Kommentar
Fra : Niels Andersen


Dato : 17-10-02 00:47

Thomas Jensen wrote in <aokbha$mih$1@sunsite.dk>:
> print "<input type='checkbox' name='id' value='{$row['id[]']}'> Slet -
> {$row['id[]']} {$row['overskrift']}";

print "<input type='radio' name='id[]' value='{$row['id']}'> Slet -
{$row['id']} {$row['overskrift']}";

Det kunne jeg vist godt have beskrevet tydeligere før. :)

Så tror jeg det skulle virke.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Peter Jensen (17-10-2002)
Kommentar
Fra : Peter Jensen


Dato : 17-10-02 09:19

Hej Niels.
Har ændret printlinien, men der bliver stadig ikke slettet noget.
Er linien i slet.php med foreach korrekt? eller er der noget andet galt?

Peter

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Tilføj spg</title>
</head>
<body>
<form method="POST" action="slet.php">
<?
include("dbinfo.inc.php");
$result = mysql_query("SELECT * FROM kironews order by id DESC");
while ($row = mysql_fetch_array($result))
{
print "<input type='checkbox' name='id[]' value='{$row['id']}'> Slet -
{$row['id']} {$row['overskrift']}";
echo"<BR>";
}
?>
<input type="submit" value="slet"></form>
</body>
</html>

******************************
og slet.php:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Slet spg</title>
</head>
<body>
<?php
if (isset($_QUERY['id']))
{
include("dbinfo.inc.php");
foreach($_QUERY['id'] AS $id)
{
$sletquery = mysql_query("DELETE from kironews where id='$id'");
}
}
?>



Niels Andersen (17-10-2002)
Kommentar
Fra : Niels Andersen


Dato : 17-10-02 10:47

Peter Jensen wrote in <3dae7277$0$32603$edfadb0f@dspool01.news.tele.dk>:
> Har ændret printlinien, men der bliver stadig ikke slettet noget.
> Er linien i slet.php med foreach korrekt? eller er der noget andet galt?

Umiddelbart ser det rigtigt ud, men det er nemt at overse fejl. :)

Det er tid til debug-rutiner. :)

Prøv dette:

foreach($_QUERY['id'] AS $id)
{
$sql = "DELETE from kironews where id='$id'";
echo "<p>SQL: $sql</p>";
$sletquery = mysql_query("DELETE from kironews where id='$id'") or
die(mysql_error());
}

Jeg kommer i øvrigt i tanker om noget. Der er et stort sikkerhedshul i denne
kode.
Forestil dig dette:

script.php?id[]='; SELECT * FROM kironews;

Så kommer SQL'en til at se sådan ud:

DELETE from kironews where id=''; SELECT * FROM kironews; '

Det er selvfølgelig ikke særligt slemt, men bemærk at man kan skrive hvad
som helst. Fx. "DELETE FROM kironews", så bliver tabellen tømt. Endnu værre
bliver det, hvis der er et ydeligere sikkerhedsproblem på MySQL-serveren,
så kan man fyre GRANT statements af, og give sig selv rettigheder til hvad
som helst.

Da id'en er et heltal (det går jeg da ud fra at det er), så kan du fx. gøre
sådan her (fx. som det første i foreach-løkken):
$id = (int)$id;

Så vil det ovenstående forsøg blive til "DELETE from kironews where id='0'",
og det gør nok ingen skade. I hvert fald ikke mere end man kan gøre ved at
indtaste vilkårlige tal. :)

Jaja, folk har nok slet ikke adgang til scriptet. Men sikkerhed er mere end
"havelågen" eller "fordøren". Der skulle gerne være mere end én forhindring
i at folk kan gøre skade. Det skulle gerne være sådan, at selv om en
cracker er kommet "ind", så kan han ikke komme "helt ind". :)

En analogi: Først skal havelågen brydes op. Så skal yderdøren brydes op.
Derefter skal døren ind til kontoret brydes op, og der finder tyven så et
aflåst pengeskab og må give op. :)

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Peter Jensen (17-10-2002)
Kommentar
Fra : Peter Jensen


Dato : 17-10-02 21:40


"Niels Andersen" <niels-usenet@myplace.dk> skrev i en meddelelse
news:7Ivr9.118870$Qk5.5082253@news010.worldonline.dk...

>
> Prøv dette:
>
> foreach($_QUERY['id'] AS $id)
> {
> $sql = "DELETE from kironews where id='$id'";
> echo "<p>SQL: $sql</p>";
> $sletquery = mysql_query("DELETE from kironews where id='$id'") or
> die(mysql_error());
> }

Har prøvet det, men med samme resultat.
Der bliver ikke slettet noget,men jeg lod mærke til at der heller ikke
bliver skrevet noget (mht echo) hverken $sql eller nogen error
Er det så ikke muligt at fejlen er før dette?
*******************

> Jeg kommer i øvrigt i tanker om noget. Der er et stort sikkerhedshul i
denne
> kode.
> Forestil dig dette:
>
> script.php?id[]='; SELECT * FROM kironews;
>
> Så kommer SQL'en til at se sådan ud:
>
> DELETE from kironews where id=''; SELECT * FROM kironews; '
>
> Det er selvfølgelig ikke særligt slemt, men bemærk at man kan skrive hvad
> som helst. Fx. "DELETE FROM kironews", så bliver tabellen tømt. Endnu
værre
> bliver det, hvis der er et ydeligere sikkerhedsproblem på MySQL-serveren,
> så kan man fyre GRANT statements af, og give sig selv rettigheder til hvad
> som helst.
>
> Da id'en er et heltal (det går jeg da ud fra at det er), så kan du fx.
gøre
> sådan her (fx. som det første i foreach-løkken):
> $id = (int)$id;
hvad gør denne lille (int)?
er det til integer (hel tal)?
**************
>
> Så vil det ovenstående forsøg blive til "DELETE from kironews where
id='0'",
> og det gør nok ingen skade. I hvert fald ikke mere end man kan gøre ved at
> indtaste vilkårlige tal. :)
>
> Jaja, folk har nok slet ikke adgang til scriptet. Men sikkerhed er mere
end
> "havelågen" eller "fordøren". Der skulle gerne være mere end én
forhindring
> i at folk kan gøre skade. Det skulle gerne være sådan, at selv om en
> cracker er kommet "ind", så kan han ikke komme "helt ind". :)
>
> En analogi: Først skal havelågen brydes op. Så skal yderdøren brydes op.
> Derefter skal døren ind til kontoret brydes op, og der finder tyven så et
> aflåst pengeskab og må give op. :)
>

Du har nogle gode analogier :D

Peter

> --
> Mvh.
>
> Niels Andersen
> (la nels. anersyn.)



Niels Andersen (18-10-2002)
Kommentar
Fra : Niels Andersen


Dato : 18-10-02 07:26

Peter Jensen wrote in <3daf201b$0$28786$edfadb0f@dspool01.news.tele.dk>:
>> foreach($_QUERY['id'] AS $id)

Argh, det er jo $_REQUEST['id']... :)
Sorry. :)

>> $id = (int)$id;
> hvad gør denne lille (int)?
> er det til integer (hel tal)?

Ja. Det er en nem lille genvej til "type casting". :)

$postnr = "8700 Horsens";
$postnr = (int)$postnr;
//$postnr indeholder nu tallet "8700.

Læs evt. mere her:
http://www.php.net/manual/en/language.types.type-juggling.php

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Peter Jensen (18-10-2002)
Kommentar
Fra : Peter Jensen


Dato : 18-10-02 13:31

Hej Niels.

Samme resultat :(

For lige at samle op:

Peter

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>Tilføj spg</title>
</HEAD>
<BODY>
<form method="POST" action="slet.php">
<?
include("dbinfo.inc.php");
$result = mysql_query("SELECT * FROM kironews order by id DESC");
while ($row = mysql_fetch_array($result))
{
print "<input type='checkbox' name='id[]' value='{$row['id']}'> Slet -
{$row['id']} {$row['overskrift']}";
echo"<BR>";
}
?>
<input type="submit" value="slet"></form>
</BODY>
</HTML>
************************
og slet.php:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Slet spg</title>
</head>
<body>
<?php
if (isset($_QUERY['id']))
{
include("dbinfo.inc.php");
foreach($_REQUEST['id'] AS $id)
{
$sql = "DELETE from kironews where id='$id'";
echo "SQL: $sql";
$sletquery = mysql_query("DELETE from kironews where id='$id'") or
die(mysql_error());
}
}

?>



Niels Andersen (18-10-2002)
Kommentar
Fra : Niels Andersen


Dato : 18-10-02 15:26

Peter Jensen wrote in <3daffed4$0$97619$edfadb0f@dspool01.news.tele.dk>:
> Samme resultat :(

Den er også gal her:

> if (isset($_QUERY['id']))

Altså REQUEST i stedet for QUERY.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Thomas Jensen (20-10-2002)
Kommentar
Fra : Thomas Jensen


Dato : 20-10-02 10:45


"Niels Andersen" <niels-usenet@myplace.dk> wrote in message
news:kTUr9.124210$Qk5.5261263@news010.worldonline.dk...
> Den er også gal her:
>
> > if (isset($_QUERY['id']))
>
> Altså REQUEST i stedet for QUERY.

Hmmm, har nu også ændret ovenstående, med samme nedslående resultat :(

Har du flere forslag i ærmet ??
Peter



Niels Andersen (20-10-2002)
Kommentar
Fra : Niels Andersen


Dato : 20-10-02 11:56

Thomas Jensen wrote in <aottuq$ode$1@sunsite.dk>:
>> > if (isset($_QUERY['id']))
>> Altså REQUEST i stedet for QUERY.
> Hmmm, har nu også ændret ovenstående, med samme nedslående resultat :(

Jeg kan ikke få øje på flere fejl, som skulle gøre at det ikke fungerer.

....

Nu har jeg så prøvet koden af (hvor database-funktionaliteten dog er
frakoblet), og jeg kan ikke få det til at fejle.

Jeg har sat lidt "debug kode" ind i slet.php, prøv dette:

<?php
error_reporting(E_ALL);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Slet spg</title>
</head>
<body>
<?php
echo "<p>PHP version ".phpversion()."</p>";
if (isset($_REQUEST['id'])) {
echo "<p>_REQUEST['id'] er sat</p>";
include("dbinfo.inc.php");
foreach($_REQUEST['id'] AS $id) {
echo "<p>ID $id</p>";
$sql = "DELETE from kironews where id='$id'";
echo "<p>SQL: $sql</p>";
$sletquery = mysql_query("DELETE from kironews where id='$id'")
or die(mysql_error());
}
} else {
echo "<p>_REQUEST['id'] er ikke sat</p>";
}

?>

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Thomas Jensen (20-10-2002)
Kommentar
Fra : Thomas Jensen


Dato : 20-10-02 14:29

Hej Niels.

Kan du forestille dig et musehul hvor indgangsdiameteren måles i nanometer??

Der er jeg på vej ned.

Det har virket lige siden du postede din fortræffelige hjælp mht request.

Jeg begyndte på det tidspunkt at kalde mine sider 01_preslet.php og
01_slet.php for at kunne følge med i
hvad der blev ændret så jeg kunne gå tilbage og sammenligne.

Nu er det bare sådan at jeg (som den mega klydemule jeg åbenbart er) ikke
opdaterede:
<form method="POST" action="02_slet.php">
^^^^^^^^^^^
i siden der hedder preslet.php.

Jeg har nu ændret dette og alt virker PERFEKT.

Jeg vil gerne sige 1000 tak og 1000 gange undskyld.

Håber ikke du har blacklistet mig :O

Peter



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408937
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste