Problém s duplikací ID – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s duplikací ID – PHP – Fórum – Programujte.comProblém s duplikací ID – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
jAkErCZ0
Stálý člen
9. 5. 2018   #1
-
0
-

Zdravím, 

mám script na xml feed který se napojí k dodavateli a pomocí xml importuje data do mé sql ale nastal problém že když script nečekaně zastaví a pustí se znovu narazí na produkt který tam již přidaný je a hodí mi chybu na duplicitu. 

 

 public function zpracujXmlZbozi($xml) {

        foreach ($xml->StoItem as $item) {
            $idKat = $this->connection->query(sprintf("SELECT product_id FROM product WHERE code = '%s' LIMIT 1", $item->Code))->fetch();
            $nazev = $idKat ? $this->connection->query(sprintf("SELECT title FROM product WHERE product_id = %s LIMIT 1", $idKat->product_id))->fetch() : false;

            if (!$nazev) {
                Debugger::log($item->Id . ': ' . $item->Name, 'import');

                $dataCatalog = [
                    'product_id' => intval($item->Id),
                    'code' => (string) ($item->Code),
                    'url' => Strings::webalize($item->Name),
                    'title' => (string) $item->Name,
                    'short_description' => (string) $item->Note,
                    'description' => (string) $item->Note,
                    'price' => intval($item->PriceEU),
                    'old_price' => intval($item->PriceDea),
                    'rating_sum' => 0,
                    'ratings' => 0,
                    'stock' => intval($item->QtyFree),
                    'images_count' => 1,
                    'hidden' => 0,
                    'producer' => 'Spokey',
                ];

                $this->connection->query('INSERT INTO product', $dataCatalog);
                
                $lastId = $this->connection->getInsertId();

                /* katerogie */
                foreach (['Level1', 'Level2', 'Level3'] AS $_level) {
                    $tmp = explode(' ', $item->SPresentTree->{$_level});
                    unset($tmp[0]);
                    $level = implode(' ', $tmp);

                    $kategorieId = $this->connection->query(sprintf('SELECT category_id FROM category WHERE title = "%s" LIMIT 1', $level))->fetch();
                    if ($kategorieId) {
                        $dataKat = [
                            'product_id' => $lastId,
                            'category_id' => $kategorieId->category_id
                        ];
                        $this->connection->query('INSERT INTO product_category', $dataKat);
                    }
                }

                if ($item->ImgUrl) {
                    $count = count(\Nette\Utils\Finder::findFiles(intval($item->Id) . '_*.jpg')->in($this->slozka));

                    $filename = intval($item->Id) . '_1.jpg';
                    if (!file_exists($this->slozka . '/' .$filename)) {
                        $components = $this->slozka . '/' . $lastId;
                        mkdir($components, 0777, true);
                        copy($item->ImgUrl, $this->slozka . $lastId . '/' . $filename);
                        $count++;
                        $this->connection->query('UPDATE product SET images_count= ' . $count . ' WHERE product_id = ' . $lastId);
                    }

                    $this->createThumb($item->Id, $this->slozka . $lastId . '/' . $filename);

                }
            }

Připojen obrázek.



Kde mám chybu? Jelikož tam mám podmínku if (!$nazev) která by měla že pokud je název stejný mělo by to přejít na else ale ono to nedělá a já nevím proč?

Díky všem za pomoc

Nahlásit jako SPAM
IP: 109.183.230.–
jAkErCZ0
Stálý člen
9. 5. 2018   #2
-
0
-

Omlouvám se označil sem ho omylem že je vyřešené ale problém stále přetrvává.

Nahlásit jako SPAM
IP: 109.183.230.–
KIIV
~ Moderátor
+43
God of flame
9. 5. 2018   #3
-
0
-

#2 jAkErCZ
A nemuzes pouzit  "ON DUPLICATE KEY IGNORE"?

Nahlásit jako SPAM
IP: 185.163.40.–
Program vždy dělá to co naprogramujete, ne to co chcete...
jAkErCZ0
Stálý člen
9. 5. 2018   #4
-
0
-

#3 KIIV
Myslíš jako $this->connection->query('INSERT INTO product ON DUPLICATE KEY IGNORE', $dataCatalog);

???

Nahlásit jako SPAM
IP: 109.183.230.–
KIIV
~ Moderátor
+43
God of flame
9. 5. 2018   #5
-
0
-

Muzes zkusit, ale tezko rici, jestli to projde. Pripadne by mohlo jit jeste odchytit vyjimku a ignorovat ji

Nahlásit jako SPAM
IP: 185.163.40.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peter
~ Anonymní uživatel
4016 příspěvků
9. 5. 2018   #6
-
0
-

A v cem je problem? Bezny sql dotaz pinda chybu, ale program bezi dal. Ty tu chybu muzes a nemusis vypsat. Nemusis tam mit
mysql_query($query) or die(); // staci
mysql_query($query) // nebo pouzit
try ... catch
Ale bude treba to posilat radek po radku. Kdyz bys poslal jeden velky insert, tak ti to zkape a asi se nic neulozi. Nebo mozna jen zacatek. Kdybys posilal transakci, tak zas ti rollback vrati uplne vse zpet. A tak, ty tam chces data hlavne dostat. A pak teprv resit, zda bylo neco duplicitni.
Ja to taky v jednom programu vyresil radek po radku. Takze to funguje. Jestli existuje lepsi reseni jsem neresil :)

Z google.. 

$qry="INSERT INTO redirects SET ua_string = '$ua_string'"   
$result=mysql_query($qry);
if(!$result){
    createLog(mysql_error());
}
 ---
class MySQLException extends Exception {}
class MySQLDuplicateKeyException extends MySQLException {}

function my_mysql_query($query, $conn=false) {
    $res = mysql_query($query, $conn);
    if (!$res) {
        $errno = mysql_errno($conn);
        $error = mysql_error($conn);
        switch ($errno) {
        case MYSQL_DUPLICATE_KEY_ENTRY:
            throw new MySQLDuplicateKeyException($error, $errno);
            break;
        default:
            throw MySQLException($error, $errno);
            break;
        }
    }
    // ...
    // doing something
    // ...
    if ($something_is_wrong) {
        throw new Exception("Logic exception while performing query result processing");
    }

}

try {
    mysql_query("INSERT INTO redirects SET ua_string = '$ua_string'")
}
catch (MySQLDuplicateKeyException $e) {
    // duplicate entry exception
    $e->getMessage();
}
catch (MySQLException $e) {
    // other mysql exception (not duplicate key entry)
    $e->getMessage();
}
catch (Exception $e) {
    // not a MySQL exception
    $e->getMessage();
}

---

    $sql = "INSERT INTO   customer(FIELDS)VALUES(VALUES)";
    mysql_query($sql);
    if (mysql_errno())
    {
            echo "<script>alert('License already registered');location.replace('customerform.html');</script>";
    } 

---

// v pripade transaction 

    function begin() {
    mysql_query("BEGIN");
    }
    function commit() {
    mysql_query("COMMIT");
    }
    function rollback() {
    mysql_query("ROLLBACK");
    }
    .....
    try {
    begin()
    mysql_query("INSERT xyz");
    mysql_query("INSERT xyz");
    mysql_query("INSERT xyz");
    commit()
    } catch (Exception $e) {
    rollback()
    }
Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
Kit+15
Guru
9. 5. 2018   #7
-
0
-

#6 peter
Chcípání aplikace po neúspěšném mysql_query() je prý docela v módě. Důvodem budou nejspíš zastaralé návody k PHP. Mimo jiné i proto, že funkce mysql_query() se dávno nepoužívá a v PHP 7 už ani není.

Nahlásit jako SPAM
IP: 2a00:1028:83a4:25fa:c934:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
jAkErCZ0
Stálý člen
9. 5. 2018   #8
-
0
-

#7 Kit
A nějaké doporučení na php 7.2? Jak to řešit?

Nahlásit jako SPAM
IP: 94.112.128.–
Kit+15
Guru
9. 5. 2018   #9
-
0
-

#8 jAkErCZ
Používej třídu PDO.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:b8e4:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
10. 5. 2018   #10
-
0
-

'Chcípání aplikace' - jasne, taky navody na php4 a pod. A pridal bych i efekt copy / paste, kdy radoby programator zkopiruje kus kodu a uz si ani nezkoukne, co to dela, nevi, co ktera funkce dela. Ikdyz jde treba jen o 10 radku. Ani se nepokousi dohledavat. Ten, kdo to vytvarel, tak vi, proc tam to die() daval a pocita s nim :)

Nahlásit jako SPAM
IP: 2001:718:2601:258:78c9:bb...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 30 hostů

Podobná vlákna

Problém — založil Jano

Problém v C — založil Robin

Problem — založil Ghosta

Problém — založil pali6

Problem — založil roonill

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý