Autor Zpráva
Fik
Profil *
Zdravim,

potrebuji udelat hromadnou zmenu prirazenych FK(id) v jedne tabulce. Udelal jsem si na to takovyto skript bohuzel zatim nefunguje. Kde muze by problem.

<?
 include "dbconnect.php";
 include "utility.php";

$sql2 = 'SELECT idSTARE, idNOVE FROM idStareNaNove';
$q->query($sql2);

if ($q->num_rows() > 0):
     while ($q->next_record()):
                  
      $idSTARE = $q->f("idSTARE");    
      $idNOVE = $q->f("idNOVE");
    
    $sqlupdate = 'UPDATE cars SET id="'.$idNOVE.'" WHERE id="'.$idSTARE.'" ';
     endwhile;
endif; 

  
?>

Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).

Moderátor Majkl578: Tvůj projev je špatně srozumitelný, piš prosím s diakritikou.
Majkl578
Profil
Možná v tom, že ten dotaz nespouštíš?
Fik
Profil *
Zdravím,

dostal jsem se k tomu až opět dneska. Upravil jsem to tedy takto, ale bohužel žádná změna.

$sqlupdate = 'UPDATE cars SET id="'.$idNOVE.'" WHERE id="'.$idSTARE.'" ';
$q->query($sqlupdate);
Joker
Profil
Fik:
skript bohuzel zatim nefunguje. Kde muze by problem.
Je to rozbité.
Chybová hláška? Něco v mysql_error?
Fik
Profil *
Chybová hláška není žádná, skript se zdá i provede, ale co se týče změn v tabulce tak není změna žádná.
__construct
Profil
Fik:
Chybová hláška není žádná
Samozrejme pretože syntakticky je to OK, ale MySQL chybu nezobrazuješ …
skript se zdá i provede
My žiaľ nevieme aký pretože obsah includovaných súborov si sem nedal …
Fik
Profil *
Co se týče includovaných souborů, tak pomocí tohoto - include "dbconnect.php"; se připojuji k db...jsou tam uvedeny proměnné jako kam, kdo a jak.... tento soubor používám i v jiných skriptech.... a funguje správně. Ten druhý include jsem již odstranil (neměl tam co dělat).

Jinak nyní jsem se koukal i na poslední změnu tabulky, kde se mají změny provádět a ten se změnil, ale žádná změna provedena nebyla.
Fik
Profil *
Samozřejmě tou změnou jsem měl na mysli čas...vypadlo mi to tam.
Joker
Profil
Fik:
Ani databáze nevrátí žádnou chybu?
Jak vypadají odesílané dotazy (tedy $sqlupdate)?
Při zkopírování dotazu třeba do phpMyAdmina se provede správně?

Poznámky:
- Je možné, že třeba je všechno správně, jen v tabulce není žádné správné „staré“ ID.
- Je správně, že se ID dávají jako řetězce? Od ID bych čekal spíš číslo.
__construct
Profil
Tak ako píše Joker skús toto:
<?php
 include "dbconnect.php";

$sql2 = 'SELECT idSTARE, idNOVE FROM idStareNaNove';
$q->query($sql2);

echo "<pre>";

if ($q->num_rows() > 0):
     while ($q->next_record()):
                  
      $idSTARE = $q->f("idSTARE");    
      $idNOVE = $q->f("idNOVE");
    
    $sqlupdate = 'UPDATE cars SET id="'.$idNOVE.'" WHERE id="'.$idSTARE.'" ';
     echo $sqlupdate."\n";
     endwhile;
endif;
A tie dotazy pošli cez phpMyAdmin alebo cez čo používaš na DB a pozri či vráti chyboú hlášku, alebo „0 rows affected“ čiže nieje žiadne správne staré ID.
Ak je chyba niekde inde nezistíme to vzhľadom k tomu že si sem nedal obsah toho súboru na pripojenie k DB.

Joker:
Je správně, že se ID dávají jako řetězce? Od ID bych čekal spíš číslo.
Pokiaľ viem MySQL si sám prevedie typ na aký potrebuje
Fik
Profil *
Tabulky jsou v pořádku, id jsou v obou tabulkách a jsou mediumint - taktez v obou table
Fik
Profil *
Aha, tak už asi vím, kde je chyba, provede se žrejmě jen první řádek

tady když mám tabulku idStareNaNove a tam první řádek idStare 3400 idNove 17004 tak mi to provede u všech takovýchto záznamů změnu, ale již to nejde na další řadek kde je třeba isStare 3500 idNove 17005, takže budu mít nějaký "bug" asi v cyklu...
nightfish
Profil
Fik:
No bug to bude vcelku klasický. Protože si nikde neukládáš výsledky dotazů, tak musí být výsledek uložen někde v $q.
A protože uvnitř toho cyklu provádíš dotaz, tak se ti jeho výsledek uloží do $q a v následujícím kole cyklu while pak $q->next_record() vratí false.
AM_
Profil
ta knihovna pro databázi je dost nešťastná, reprezentovat spojení s DB a výsledek dotazu jedním objektem je tragédie. Raději ji zahoď a používej obyčejné mysqli nebo si stáhni něco alespoň trochu osvědčeného jako DiBi.
Fik
Profil *
nightfish:
"No bug to bude vcelku klasický. Protože si nikde neukládáš výsledky dotazů, tak musí být výsledek uložen někde v $q."
"A protože uvnitř toho cyklu provádíš dotaz, tak se ti jeho výsledek uloží do $q a v následujícím kole cyklu while pak $q->next_record() vratí false."
A nestacilo by tedy kdybych dotaz s updatem ukladal treba do $f?
Fik
Profil *
Tak změna proměnné nepomohla (ostatně jak jsem předpokládal). Zkusil jsem to ještě takto, ale také žádná změna.

if ($q->num_rows() > 0):
     while ($q->next_record()):
                  
      $idSTARE = $q->f("idSTARE");    
      $idNOVE = $q->f("idNOVE");
    
    $count=$q;
    
    $sqlupdate = 'UPDATE cars SET id="'.$idNOVE.'" WHERE id="'.$idSTARE.'" ';
     $q->query($sqlupdate);

     echo $sqlupdate."\n";
     
     $q=$count; 
     
     endwhile;
endif;
__construct
Profil
Fik:
Pozri ↑
AM_
Profil
já se zase odvolám na svůj příspěvek [#14] AM, prostě to řešení jedním objektem je tragicky špatné, ignorováním mého příspěvku a snahou to nějak obejít to nezměníš. Jestli už máš tuhle třídu pro práci s databází v projektu široce použitou a nechce se ti to přepisovat, tak zachovej tuto možnost, ale zároveň do té třídy přidej možnost, aby byl výsledek dotazu reprezentován novým objektem (a nebyl smazán v momentě, kdy se zavolá dotaz jiný).

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