WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Varför kopior? (https://www.wn.se/forum/showthread.php?t=1040056)

grinditwp 2010-01-17 16:53

Varför kopior?
 
Varför lyckas jag få kopior i min databas?
Borde inte följande garantera att det inte läggs in två, i detta faller, urls som är lika?

PHP-kod:

$url_id  '';
            
//Check if URL exist in db
            
$sql "SELECT `url_id`, `title` FROM `t_urls` WHERE `url` = '".$url."' LIMIT 1";
            
$result mysql_query($sql);
            while (
$row mysql_fetch_assoc($result)) {
                
$url_id $row['url_id'];
                
$title_from_db stripslashes($row['title']);
            }
            
//If not, add to db
            
if($url_id == ''){
                
$sql "INSERT INTO `t_urls` ( 
                    `url`,
                    `title`) 
                    VALUES (
                    '"
.$url."',
                    '"
.mysql_real_escape_string($title)."')";
                
mysql_query($sql) or die(mysql_error());
            } 


crazzy 2010-01-17 17:21

Ändra fältet `url` i databasen till att ha flaggan UNIQUE.
Då kan du inte få dubbletter hur mycket du än försöker.

grinditwp 2010-01-17 17:42

Citat:

Ursprungligen postat av crazzy (Inlägg 20339437)
Ändra fältet `url` i databasen till att ha flaggan UNIQUE.
Då kan du inte få dubbletter hur mycket du än försöker.

Ok, tack, men jag förstår fortfarande inte varför det lyckas skapa dubbletter, jag kollar jag först om urlen finns i databasen och om den inte finns så läggs den till, så varför?

ChristianCarlsson 2010-01-17 19:28

Måste inte if($url_id == ''){} vara innanför while-loopen?

grinditwp 2010-01-17 19:50

Citat:

Ursprungligen postat av ChristianCarlsson (Inlägg 20339445)
Måste inte if($url_id == ''){} vara innanför while-loopen?

Nej, först kollar jag i databasen om det finns en specifik url, exempelvis http://google.com. Om det finns sparas url_id till variablen $url_id.

Om sedan $url_id fortfarande inte är satt med ett id, så gör jag en insert.

BjörnJ 2010-01-17 20:12

Det behöver inte vara en loop eftersom det är LIMIT 1. Man kan köra med if istället.

PHP-kod:

if($row mysql_fetch_assoc($result))
  
behandla existerande rad
else
  
insert 

Som crazzy skrev skulle jag använda UNIQUE, men det är som sagt inget svar på varför det inte fungerar som det är nu.

Varför kör du med stripslashes() på det du läser från DB? Det ska normalt inte behövas.

Jag antar att innehållet i $url inte kan påverkas från klientsidan, eller att det är kontrollerat med regexp eller liknande. Om inte måste du köra mysql_real_escape_string() på den också, både vid SELECT och INSERT.

grinditwp 2010-01-17 22:05

Citat:

Ursprungligen postat av BjörnJ (Inlägg 20339449)
Det behöver inte vara en loop eftersom det är LIMIT 1. Man kan köra med if istället.

PHP-kod:

if($row mysql_fetch_assoc($result))
  
behandla existerande rad
else
  
insert 

Som crazzy skrev skulle jag använda UNIQUE, men det är som sagt inget svar på varför det inte fungerar som det är nu.

Varför kör du med stripslashes() på det du läser från DB? Det ska normalt inte behövas.

Jag antar att innehållet i $url inte kan påverkas från klientsidan, eller att det är kontrollerat med regexp eller liknande. Om inte måste du köra mysql_real_escape_string() på den också, både vid SELECT och INSERT.


stripslashes har inte med $url att göra, $title dock, skrivs in i db med real_escape_string, men det är inte den som är problemet.

BjörnJ 2010-01-17 22:12

Citat:

Ursprungligen postat av grinditwp (Inlägg 20339467)
stripslashes har inte med $url att göra, $title dock, skrivs in i db med real_escape_string, men det är inte den som är problemet.

Jag menade inte att stripslashes() har något med $url att göra. Det var olika kommentarer.

Man behöver inte använda stripslashes() när man hämtar från DB bara för att man använde mysql_real_escape_string() när man skrev till DB.

Däremot bör man i vissa fall använda htmlspecialchars() innan man skriver ut information som man hade lagrat i DB.

grinditwp 2010-01-17 22:53

Citat:

Ursprungligen postat av BjörnJ (Inlägg 20339468)
Jag menade inte att stripslashes() har något med $url att göra. Det var olika kommentarer.

Man behöver inte använda stripslashes() när man hämtar från DB bara för att man använde mysql_real_escape_string() när man skrev till DB.

Däremot bör man i vissa fall använda htmlspecialchars() innan man skriver ut information som man hade lagrat i DB.

varför finns stripslashes då?

BjörnJ 2010-01-17 23:08

Citat:

Ursprungligen postat av grinditwp (Inlägg 20339473)
varför finns stripslashes då?

För att ta bort de extra slasharna om man vill använda datat till något annat än att stoppa in i en databas. Det är väl egentligen bara aktuellt om magic quotes är aktiverat på servern, vilket jag tror var default för gamla PHP-versioner, men inte nu längre.


Alla tider är GMT +2. Klockan är nu 13:13.

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