Autor Zpráva
janky
Profil
EDIT2:

Vyřešeno, přidáním další podmínky do dotazu. Stalo se že se potkaly 2 stejné názvy.

Zdravím

sám nedokážu vyřešit problém s dibi která mi vyhazuje fatal error:

Fatal error: Uncaught Dibi\NotNullConstraintViolationException: Column 'card_id' cannot be null in D:\www\cron_sideboard.cz\vendor\dibi\dibi\src\Dibi\Drivers\MySqliDriver.php:172 Stack trace: #0 D:\www\cron_sideboard.cz\vendor\dibi\dibi\src\Dibi\Drivers\MySqliDriver.php(151): Dibi\Drivers\MySqliDriver::createException('Column 'card_id...', 1048, 'INSERT INTO car...') #1 D:\www\cron_sideboard.cz\vendor\dibi\dibi\src\Dibi\Connection.php(284): Dibi\Drivers\MySqliDriver->query('INSERT INTO car...') #2 D:\www\cron_sideboard.cz\vendor\dibi\dibi\src\Dibi\Connection.php(221): Dibi\Connection->nativeQuery('INSERT INTO car...') #3 D:\www\cron_sideboard.cz\index2.php(114): Dibi\Connection->query('INSERT INTO car...', Array) #4 {main} SQL: INSERT INTO cards_price (`card_id`, `price`) VALUES (NULL, 7) thrown in D:\www\cron_sideboard.cz\vendor\dibi\dibi\src\Dibi\Drivers\MySqliDriver.php on line 172

V cyklu mám tento kod a pokud ho spustím poprvé a v databázi nemám uložené žádné záznamy tak se provede celý a vše se uloží podle očekávání, do tabulek [cards_cr] a [cards_price] problém nastane když se ten kod spustí znovu, pak se několik záznamů uloží do tabulky [cards_cr] a [cards_price] script napíše chybu.

EDIT: Předpokládám že každému záznamu v tabulce [cards_cr] se vytvoří ID při uložení. Pak nerozumím proč je hodnota NULL, jestli chápu dobře tu chybu.

Díky za případnou pomoc.


foreach ($cards as $card) {
    // Ošetření potřebných polí pro porovnání z databází
    $card_cr_name = str_replace('´','\'',trim($card['original_name']));
    $set_cr_name = trim($card['set']);

    // Zjištění jestli je konkrétní karta podle celého názvu a setu v databázi pokud není uloží kartu do databáze
    // Vytvoříme první záznam s cenou karty
    $result = $database->query('SELECT * FROM `cards_cr` WHERE `name_cr` = ?', $card_cr_name);
 
    if($result->getRowCount() == 0) {
        // Ošetření dalších polí
        $arr = [
            'name_cr' => $card_cr_name,
            'name' => str_replace('´','\'',trim($card['name'])),
            'properties' => str_replace('´','\'',trim($card['properties'])),
            'image' => trim($card['image']),
            'rarity' => trim($card['rarity']),
            'type' => trim($card['type']),
            'text' => str_replace('´','\'',trim($card['content'])),
            'set_code_cr' => $set_code_cr,
            'set_name_cr' => trim($card['set']),
            'start_price' => (int)trim($card['price']),
            'stock' => isset($card['stock']) ? (int)trim($card['stock']) : (int)0,
            'foil' => mb_strpos($card['properties'], "foil") ? 1 : 0, // Check zda je karta foil
            'set_code_official' => $set_code_official,
        ];
        
        // Uložení karty do db
        $result = $database->query('INSERT INTO cards_cr %v', $arr);

        // Uložení prvního záznamu ceny karty do cards_price
        // Zjištění ID karty
        $id = $database->getInsertId();

        $arr = [
            'card_id' => $id,
            'price' => (int)trim($card['price']),
        ];
        $result = $database->query('INSERT INTO cards_price %v', $arr);

        $i = $i +1;
    } else {
        // POkud karta už je v databázi tak porovnáme novou a starou cenu, pokud cena bude jiná záznam se uloží
        // Vyhledání posledního záznamu s cenou karty
        $result = $database->fetch('
        SELECT *
        FROM `cards_price`
        LEFT JOIN `cards_cr` ON cards_cr.id=cards_price.card_id
        WHERE cards_cr.name_cr = %s AND cards_cr.set_code_cr = %s
        ORDER BY cards_price.date DESC
        LIMIT 1
        ', $card_cr_name, $set_code_cr);

        // inicializace proměných 
        $old_price = $result['price'];
        $new_price = (int)trim($card['price']);

        // Pokud se nová cena nerovná staré ceně uložíme nový záznam s cenou
        if ($new_price !== $old_price) {
            $arr = [
                'card_id' => $result['id'],
                'price' => $new_price,
            ];
            $database->query('INSERT INTO cards_price %v',$arr);

            $i = $i + 1;
        }
    }
}
blaaablaaa
Profil
janky:
Tak základ bude odkrokovat si, co tam vůbec posíláš za data. Pokud nevíš jak, nejprimitivnější způsob je přes echo/var_dump před samotným dotazem.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0