WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   sql-satts som inte vill fungera.. (https://www.wn.se/forum/showthread.php?t=1053003)

jonssondesign 2012-04-11 01:27

sql-satts som inte vill fungera..
 
Hejsan.

Har nu suttit ett par timmar med ett och samma problem, men jag kommer verkligen inte på någon lösning.

Vad jag vill åstadkomma:

Jag vill ladda upp och läsa av en xml-fil.
Där efter vill jag lägga in data från xml-filen till min databas.

Har angett kolumnen "url" som en unik index, så att det inte blir några dubbletter i databasen.

Sen vill jag kontrollera om det finns några "produkter" i databasen som inte finns med i xml filen.
De produkter som finns i databasen men inte i xml filen skall tas bort.

Mitt problem

Allt går som smort tills det kommer till att ta bort de produkter i datbasen som inte finns med i xml-filen.

Min kod

PHP-kod:

$upload_path "xml-files/";
    
$allowed_filetypes = array('.xml''.csv');
    
    
$filename $_FILES['uploadedfile']['name'];
    
$ext substr($filenamestrpos($filename,'.'), strlen($filename)-1);
    
    if(!
in_array($ext,$allowed_filetypes)) { die("Du har inte laddat upp en .xml- eller .csv-fil. Var vänlig försök igen."); }    
    if(!
is_writable($upload_path)) { die("Du kan inte ladda upp filen till mappen."); }
    
    if(
move_uploaded_file($_FILES['uploadedfile']['tmp_name'],$upload_path $filename)) {
        
$upload_sucess 'Filen laddades upp utan problem. Du kan kolla på den <a href="' $upload_path $filename '" title="$filename">här</a>';
        
        
// hämta ut data från xml-filen
        
$xml simplexml_load_file($upload_path $filename);
        foreach (
$xml->product as $product) {
            
$sale $product->fields->sale;
            
$product_image mysql_real_escape_string($product->fields->extraImageProductLarge);
            
$product_name mysql_real_escape_string($product->name);
            
$product_brand mysql_real_escape_string($product->brand);
            
$product_store mysql_real_escape_string($product->programName);
            
$product_price mysql_real_escape_string($product->price);
            
$product_url mysql_real_escape_string($product->productUrl);
            
$product_category mysql_real_escape_string($product->fields->productGroup);
            
$product_race mysql_real_escape_string($product->fields->gender);
            
$product_info mysql_real_escape_string($product->description);
            
            
// hämta data från databasen om de redan tillagda produkterna
            
$query "SELECT * FROM products";
            
$result mysql_query($query);
            while (
$row mysql_fetch_array($result)) {
                
                
$db_image $row['img'];
                
$db_name $row['title'];
                
$db_brand $row['brand'];
                
$db_store $row['store'];
                
$db_price $row['price'];
                
$db_url $row['url'];
                
$db_category $row['category'];
                
$db_race $row['race'];
                
$db_info $row['info'];
                
            }
            if (
$sale == 'true') {
            
                
$query "INSERT INTO products (img, title, brand, store, price, url, category, race, visible, info) VALUES ";
                
$query .= "('$product_image', '$product_name', '$product_brand', '$product_store', $product_price, '$product_url', '$product_category', '$product_race', 1, '$product_info') ";
                
$query .= "ON DUPLICATE KEY UPDATE url = '$product_url'";
                
$insert mysql_query($query) or die (mysql_error());
                
                    
$query "DELETE FROM products WHERE url <> '$product_url'";
                    
$delete mysql_query($query) or die (mysql_error());
                
            }
            
        } 

Det är denna snutt som strular för mig:

PHP-kod:

$query "DELETE FROM products WHERE url <> '$product_url'";
                    
$delete mysql_query($query) or die (mysql_error()); 

Vad som händer
Filen laddas upp, produkterna läggs till, allt går fint.
Sen när den kommer till att ta bort produkter så tar den bort ALLA produkter UTOM den sist tillagda.. hm.

Någon med några idéer varför denna kod är så elak och förstör för mig? :/
Eller du kanske kommer på en annan lösning på mitt problem? :)

Tack på förhand, Fredrik

makaflOw 2012-04-11 02:05

Borde du inte byta ut <> mot = eller tänker jag galet?

jonssondesign 2012-04-11 02:09

Citat:

Ursprungligen postat av makaflOw (Inlägg 20437370)
Borde du inte byta ut <> mot = eller tänker jag galet?

Nej det kan jag inte göra. Tror jag?

då skulle det bli såhär:


TA BORT FRÅN products DÄR url ÄR LIKA MED vad som finns i xml-filen.

Jag vill ju ha det såhär:

TA BORT FRÅN products DÄR url INTE ÄR LIKA MED vad som finns i xml-filen.

nosnaj 2012-04-11 07:52

Du jämför ju inte med xml-filen utan din kod är:
Ta bort alla produkter som inte är den senaste i loopen (xml-filen).

Antingen får du ta bort alla produkter innan du lägger in allt från xml-filen, eller så har du en flagga (en ytterligare kolumn) som anger att produkten lagts till från xml-filen och ej sak tas bort i din delete-sats.

jonny 2012-04-11 07:55

Om din delete-sql skulle fungera skulle den radera allt utom den produkt du precis lagt till (eller uppdaterat) i databasen.

Det du möjligen kan göra är att bygga upp en kommaseparerad lista över urler och köra en

Kod:

DELETE FROM products WHERE url NOT IN ($product_urls)
Men det är nog vettigare att lägga till en kolumn som heter "updated" eller "changed" med datum och tid för din import och sedan ta bort alla som har ett för gammal värde.

jonssondesign 2012-04-11 11:15

Smarta grabbar!! Ska sätta mig ned och fixa detta direkt.
Ska jag vara ärlig så satt jag faktiskt och tänkte på exakt samma lösning som er redan från början.. Men jag var så jäkla trött att jag hoppades att den lilla sql-sattsen skulle fungera för mig :P hehe

Tack igen!

jonssondesign 2012-04-11 12:25

Tack, det fungerar utmärkt nu! :)

Skapade en ny kolumn med 0 eller 1.
0 = borttagning
1 = var kvar

:)


Alla tider är GMT +2. Klockan är nu 23:56.

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