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 |
#2 · Zasláno: 20. 12. 2021, 12:46:04
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. |
||
Časová prodleva: 2 roky
|
0