WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Mysql radera rad (https://www.wn.se/forum/showthread.php?t=36963)

Hoel 2009-05-20 23:29

Hejsan.
Jag har byggt en lätt bildupladdningsmotor.
När bilderna listas finns det en raderingsfunktion ;
Kod:

form action="'.$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'" method="POST">
<input type="hidden" name="delete" value="DELETE image FROM IMAGE WHERE id='.$id.'" />
<input type="submit" value="Delete" />
</form>

Problemet är att databasen gör precis som jag vill :P
Den raderar allt, inklusive ID nummret.
Om jag raderar ALLA rader ur databasen, 1 - 24, så kommer nästa rad jag skapar få ett ID av 25.
Hur minskar jag samtilga ID då jag raderar en rad

Tack!

MMC 2009-05-20 23:36

Det vill du inte. Poängen med att ha auto_increment på en id-kolumn är att du ska få ett unikt ID för varje rad som läggs till i tabellen, och det blir ju inte unikt om du återanvänder gamla id:n.

Det låter som att den här frågan uppkom för att du försöker lösa ett annat problem/använda din id-kolumn på ett sätt som kanske inte är optimalt. Förklara gärna varför du vill att dina id:n ska minskas när du raderar en rad.

tartareandesire 2009-05-20 23:46

Exakt, varför måste du ha vissa siffror på ID-kolumnen? Är det för att du har problem med exempelvis slumpning av bilder annars så går det att lösa på annat mer lämpligt sätt.

allstars 2009-05-20 23:53

hjälp, varför skriver du SQL i en input???
du vet väl att man kan radera hela din databas pga detta, va?!

ge mig länk skall jag visa.

taz76 2009-05-21 00:30

Lägg inte heller $_SERVER['QUERY_STRING'] utan någon validering direkt i form action.. ;)

Citat:

Originally posted by allstars@May 20 2009, 23:53
hjälp, varför skriver du SQL i en input???
du vet väl att man kan radera hela din databas pga detta, va?
ge mig länk skall jag visa.

Så snällt av dig att visa ;)

tartareandesire 2009-05-21 00:32

Citat:

Ursprungligen postat av taz76
Lägg inte heller _SERVER[QUERY_STRING] utan någon validering direkt i form action..
Citat:

Ursprungligen postat av allstars
hjälp, varför skriver du SQL i en input???
du vet väl att man kan radera hela din databas pga detta, va?
ge mig länk skall jag visa.

Så snällt av dig att visa

Ska man vara petig så bör ur säkerhetsaspekt inte heller $_SERVER['PHP_SELF'] ligga där utan en explicit url utan variabler.

Perben 2009-05-21 12:26

Ooooh vilken farlig kod. Hoppas den inte används av nån annan än dig själv : )

Jonas 2009-05-21 17:07

Har du någon URL så skall jag hjälpa dig att få IDna i ordning när du raderar en rad.

tartareandesire 2009-05-21 17:15

Citat:

Originally posted by Jonas@May 21 2009, 17:07
Har du någon URL så skall jag hjälpa dig att få IDna i ordning när du raderar en rad.

Hehe =)

Är du rädd om din databas så lämnar du inte ut någon URL innan du täppt till säkerhetshålen vilka som påpekats är enorma i nuläget.

Jonas 2009-05-21 17:59

Citat:

Originally posted by tartareandesire@May 21 2009, 17:15
Hehe =)
Är du rädd om din databas så lämnar du inte ut någon URL innan du täppt till säkerhetshålen vilka som påpekats är enorma i nuläget.

Meeh, nu var du elak mot mig... :( :(

Jag skulle bara leka lite :(

Förresten, man kan inte klassa ovanstående kod som sårbar för SQL-Injections. Eftersom man behöver ju göra någon "injection" här ju... Vad skall man klassa det som?

Hoel 2009-05-22 00:17

Citat:

Ursprungligen postat av Jonas
Citat:

Ursprungligen postat av tartareandesire
Hehe =)
Är du rädd om din databas så lämnar du inte ut någon URL innan du täppt till säkerhetshålen vilka som påpekats är enorma i nuläget.


Meeh, nu var du elak mot mig... :( :(

Jag skulle bara leka lite :(

Förresten, man kan inte klassa ovanstående kod som sårbar för SQL-Injections. Eftersom man behöver ju göra någon "injection" här ju... Vad skall man klassa det som?

Sjukt ful kanske?
Tack till alla som varnar för elaka Jonas med flera, men systemet är byggt för att användas lokalt.
Jag kan tillräckligt mycket om MYSQL för att veta att jag inte kan något om säkerhet. Man kan förmodligen sönderexploatera den, men tills ni hittar till min http://localhost så bryr jag mig inte spec. mkt :P

Min fråga blev en ickefråga efter
Citat:

Det vill du inte. Poängen med att ha auto_increment på en id-kolumn är att du ska få ett unikt ID för varje rad som läggs till i tabellen, och det blir ju inte unikt om du återanvänder gamla id:n.

Det låter som att den här frågan uppkom för att du försöker lösa ett annat problem/använda din id-kolumn på ett sätt som kanske inte är optimalt. Förklara gärna varför du vill att dina id:n ska minskas när du raderar en rad.

Kan som sagt inte spec. mycket om mysql. Jag använder ID raden som primärt index, och tänkte att det kanske skulle påverka på något sätt.
Det spelar alltså ingen roll att tal " försvinner" vid radering?

tartareandesire 2009-05-22 00:23

Jonas är inte elak =) Åtminstone tror jag inte det.

Såvida du av någon för mig okänd anledning inte behöver just dessa tal till något så spelar det ingen roll, nej. Det är helt normalt att det blir på det viset med auto increment-kolumner. Anledningen till att man använder en sådan kolumn är för att man ska kunna identifiera varje enskild rad på något vis.

Hoel 2009-05-22 00:35

Citat:

Originally posted by tartareandesire@May 22 2009, 00:23
Jonas är inte elak =) Åtminstone tror jag inte det.
Såvida du av någon för mig okänd anledning inte behöver just dessa tal till något så spelar det ingen roll, nej. Det är helt normalt att det blir på det viset med auto increment-kolumner. Anledningen till att man använder en sådan kolumn är för att man ska kunna identifiera varje enskild rad på något vis.

:P Jonas är säkert dalai lama på sin planet :)

Okej, det låter ju rimligt. Problemen uppstår ju när systemet använts i ett par månader. ID kommer då att börja vid runt 10 000. Föreställer mig att det kommer bli onödigt stora tal...

Alex 2009-05-22 00:56

Mm, hela fem bytes stora! =)... Det är inga större problem.

Hoel 2009-05-22 01:33

Citat:

Originally posted by Alex@May 22 2009, 00:56
Mm, hela fem bytes stora =)... Det är inga större problem.

:P lagringen är inga problem :)
Kändes dock snyggare att dra 3siffriga tal ur databasen en ett ID på en miljon, vilket det lär bli efter en del användande.

Tack för allas hjälp :)

Om jag nån gång skulle vilja lägga mitt bildsystem på en server som kan det kan www:as till, hur skickar man då best queries till <form> ? Jag förstår att sättet jag implementerat det på är så äckligt osäkert att det inte är sant :)

crazzy 2009-05-22 01:56

Du skickar inga queries via klienten, allt sköts server-side.

tartareandesire 2009-05-22 01:59

1. Undvik att använda något annat än en explicit url i action-attributet.

2. Skicka bara med id-numret. Nu har du en sql-sats där som vem som helst kan manipulera på klientsidan för att på så vis radera hela databasen eller vissa id:n om man tycker det är roligare.

BjörnJ 2009-05-22 04:41

Istället för auto_increment kan du använda MAX(id)+1 vid INSERT. Det blir dock fortfarande luckor i nummerserien om du tar bort rader mitt i, men du slipper att det orsakas luckor pga rader som är borttagna i slutet.

Jag skulle nog tycka att det skulle kännas lite läskigt att skicka data direkt från ett formulär till databasen även om man bara kör det lokalt.

WoxAnYv 2009-05-22 10:02

Du kan ju förvisso köra följande också ifall du vill omsortera dina id:n men jag vidhåller vad andra sagt, strunt i att använda id:t till något annat, vill du ha ett id som löper snyggt framåt på utsidan, mata ut det hjälp av php istället i din loop där utmatningen sker.

Kod:

ALTER TABLE table DROP id, ADD id INT UNSIGNED AUTO_INCREMENT NOT NULL, AUTO_INCREMENT = 1;

Jonas 2009-05-22 14:41

Citat:

Originally posted by Hoel@May 22 2009, 00:35
Jonas är säkert dalai lama på sin planet
Okej, det låter ju rimligt. Problemen uppstår ju när systemet använts i ett par månader. ID kommer då att börja vid runt 10 000. Föreställer mig att det kommer bli onödigt stora tal...

Måste försvara mig lite här nu.

1. Tanken från min sida var att se hur godtrogen du var. Allt för många ger ut uppgifter utan att veta exakt vem dom har att göra med. Det hela har ett begrepp "Social Engineering"
2. Jag skulle inte ens gått in på länken om du gett mig den, utan snarare postat här i tråden om att jag fick den av dig. Eftersom så som du har gjort det är livsfarligt.

Hoel 2009-05-22 15:22

Citat:

Ursprungligen postat av Jonas
Citat:

Originally posted by -Hoel@May 22 2009, 00:35
Jonas är säkert dalai lama på sin planet
Okej, det låter ju rimligt. Problemen uppstår ju när systemet använts i ett par månader. ID kommer då att börja vid runt 10 000. Föreställer mig att det kommer bli onödigt stora tal...



Måste försvara mig lite här nu.
1. Tanken från min sida var att se hur godtrogen du var. Allt för många ger ut uppgifter utan att veta exakt vem dom har att göra med. Det hela har ett begrepp http://en.wikipedia.org/wiki/Social_engineering_(security)
2. Jag skulle inte ens gått in på länken om du gett mig den, utan snarare postat här i tråden om att jag fick den av dig. Eftersom så som du har gjort det är livsfarligt.


Menade inget illa med dalai lama, smileyn föll bort :)
Är bekant med Social Engineering, och du verkar vara en alldeles för respekterad medlem här för att
trixa med min databas :)

Citat:

Ursprungligen postat av tartareandesire
1. Undvik att använda något annat än en explicit url i action-attributet.
2. Skicka bara med id-numret. Nu har du en sql-sats där som vem som helst kan manipulera på klientsidan för att på så vis radera hela databasen eller vissa id:n om man tycker det är roligare.

Exempel på hur satsen skulle kunna se ut ?

allstars 2009-05-22 17:57

gör om värdet som läggs in i hidden så du endast lägger Idt.

På sidan som du postar till skapar du en variabel vid namn $sql1 (eller likn) och i slutet av variabeln lägg till värdet från postade hiddenfältet som du gör en escape på för att ta bort "förbjudna" tecken.

tartareandesire 2009-05-22 18:01

Citat:

Originally posted by allstars@May 22 2009, 17:57
gör om värdet som läggs in i hidden så du endast lägger Idt.
På sidan som du postar till skapar du en variabel vid namn sql1 (eller likn) och i slutet av variabeln lägg till värdet från postade hiddenfältet som du gör en escape på för att ta bort förbjudna tecken.

escape = mysql_real_escape_string

allstars 2009-05-22 18:14

ja, precis, Tack!

Jonas 2009-05-22 23:00

Citat:

Ursprungligen postat av Hoel
Menade inget illa med dalai lama, smileyn föll bort
Är bekant med Social Engineering, och du verkar vara en alldeles för respekterad medlem här för att
trixa med min databas


Säg inte det ;)

Citat:

Ursprungligen postat av Hoel
Exempel på hur satsen skulle kunna se ut ?

Kod:

<?php
$action = (isset($_GET['action'])) ? $_GET['action'] : false;

switch($action)
{
case 'delete':
$id = (isset($_POST['imgID'])) ? $_POST['imgID'] : false;
$id = intval($id);

if($id)
{
$query = sprintf('DELETE image FROM IMAGE WHERE id=%d', $id);
mysql_query($query);
}
break;
}
?>
<form action="?action=delete" method="POST">
<input type="hidden" name="imgID" value="<?php echo (isset($id)) ? $id : ''; ?>" />
<input type="submit" value="Delete Image" />
</form>

Borde vara något som fungerar och är rätt säkert mot SQL injections även.
Använder man inte MySQLi/PDO mm med Prepared statements så bör man använda sprintf för att göra queryn.

Conny Westh 2009-05-23 01:18

Citat:

Originally posted by Alex@May 21 2009, 23:56
Mm, hela fem bytes stora! =)... Det är inga större problem.
Auto_increment lagrar INTE talen som strängar utan som heltal och då går det inte åt mer än optimlat ett "word" (integer eller long) dvs en allokeringsenhet i minnet.

Conny Westh 2009-05-23 01:22

Citat:

Originally posted by WoxAnYv@May 22 2009, 09:02
Du kan ju förvisso köra följande också ifall du vill omsortera dina id:n men jag vidhåller vad andra sagt, strunt i att använda id:t till något annat, vill du ha ett id som löper snyggt framåt på utsidan, mata ut det hjälp av php istället i din loop där utmatningen sker.

Kod:

ALTER TABLE table DROP id, ADD id INT UNSIGNED AUTO_INCREMENT NOT NULL, AUTO_INCREMENT = 1;

Det där funkar enbart om man inte har en enda främmande nyckel som refererar till ID i den tabellen, annars tappar manalla nyclar och refernserna blir helt korrupta, dvs data blir helt oanvändbart.


Alla tider är GMT +2. Klockan är nu 20:57.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson