Aktualizace tabulky mysql
Zdravím,
mám takový dotaz jestli by někdo neporadil.
Mám tabulku v DB. přes CSV soubor aktualizuji jeden sloupec reference, na což je jednoduchá úprava :
$query = "UPDATE prod SET `prix`='".$se[$i][1]."' WHERE `reference`='".$se[$i][0]."'";
problém je ten, že pokud v CSV souboru je položka navíc o které nevím, tudíž není v DB tak se pochopitelně nezaktualizuje ( což ale bych tu položku potřeboval samozřejmě doplnit).
A zde je jádro věci, potřebuji docílit aby mi při aktualizaci příkladně výpis udělal :
123 - OK
234 - OK
567 - ERR ( není v DB )
789 - OK
Neporadil by prosím někdo? Moc díky
to updatujes cez PHP?
ak ano, tak po vykoani updatu zavolaj funkciu
mysql_affected_rows() ktora ti vrati pocet pocet updatnutych riadkov..
v tvojom pripade 1 ak tam bude row z danym id, 0 ak nebude...
Netuším či je to možné, ale ja som nedávno riešil problém s aktualizáciou jednej tabuľky na MSSQL serveri, ktorú som dopĺňal/aktualizoval riadkami z inej tabuľky.
Ty to síce napĺňaš z csv súboru, ale princíp môjho riešenia bol nasledovný:
tabuľka1 -> vlož riadky do tabuľky2, ale len tie, ktoré sa nenachádzajú v tabuľke2, tzn. iba to čo je navyše/nové v tabuľke1.
Príkaz: INSERT INTO xxx FROM xx WHERE NOT EXISTS xxx.
No a potom možno to Tvoje UPDATE...
Keďže nepoznám štruktúru Tvojej tabuľky riešenie už musíš zvládnuť sám...
V podstatě jsou tam sloupce ID a číselná hodnota. Mění se číselné hodnoty dle ID. ID zůstává stejné. Pokud mám v tom CSV který dostanu nějaké ID navíc ( které bych zároveň potřeboval dostat do tabulky scriptem který mám, protože má vazbu na jiné položky, takže přidávání neřeším).
Jde více méně o to, abych zjistil že mi v CSV přibyla nějaká položka navíc a měl bych jí doplnit.
Nejsem přes php moc odborník. S mysql_affected_rows() jsem se dostal nejdál tak, že mi to vypíše např. update 1800 položek. Vím že v DB jich je 1798 a 2 jsou v csv navíc.
Čiže Ty ich tam nechceš pridávaš? Len chceš aby si dostal hlášku, že niečo je navyše? Keby som to mal v tabuľke - jednoduchý select - porovnanie a mám to, ale csv neviem...
Asi by som to naimportoval do pomocnej tabuľky, s tou už sa dajú omnoho ľahšie robiť sql dotazy...
přidávat nechci. stačil by mi výpis např :
123 - OK
234 - OK
567 - ERR ( není v DB )
789 - OK
Věděl bych že 567 není a musím jej přidat.
Doufám, že mysql to umí, jsem to za Oracle a to má klauzuli MERGE, což je něco jako :
MERGE tabulka(select neco) POKUD SI TO MAČNE ID udělej update POKUD SI TO NEMAČNE udelěj insert
dik za vzdělávání v mysql i kdyz ho doufám nikdy nebudu potřebovat :D
nikdy nevies, kedy sa ti one vedomosti zidu
0,44km2, 700obyvatel Vatikán v roce 1993 - jj, zeměpisářka řikala něco podobného, že se to muže nikdy hodit :D
Dnes jsem byl na pohovoru a pokud to vyjde tak si zmigruju data z eBanky do Rajfky - a to bych pod mysql teda delat nechtel
Nejsem přes php moc odborník. S mysql_affected_rows() jsem se dostal nejdál tak, že mi to vypíše např. update 1800 položek. Vím že v DB jich je 1798 a 2 jsou v csv navíc
A kdy to voláš? Tech zpusobu je asi víc jak se dostat k těm datum, ne? Například to nainsertovat a zase si to proselektovat. Pak mužeš to affected_rows použít pro každý řádek a tedy bud tam bude 0 a nebyl tam a nebo 1 a byl tam.
no pokročil jsem kousek dál.
problém je že je asi někde chybička. výsledný hodnoty mám :
UPDATE prod SET `prix`='5' WHERE `reference`='B7911' vysledek: -1
UPDATE prod SET `prix`='5' WHERE `reference`='B79118' vysledek: 0
UPDATE prod SET `prix`='5' WHERE `reference`='B7921' vysledek: 0
UPDATE prod SET `prix`='5' WHERE `reference`='B79218' vysledek: 0
UPDATE prod SET `prix`='5' WHERE `reference`='999999999' vysledek: 0
hodnoty prix pokud změním, výsledek je identický. I přes to že došlo ke změně....
všechny položky v DB jsou mimo poslední.
dotaz na výsledek je : printf(" vysledek: %d\n", mysqli_affected_rows($link));
Prozkoumej, proč došlo při prvním dotazu k chybě - mysqli_affected_rows($link) vrátil -1.
Nemáš chybu v cyklu (jenom hádám) ?
ak sa da, pastni sem ten php kod ktorym to robis (a najlepsie do tagu code/php)
Zasílám a díky za každou radu.
code/php
<?
include("../../config.php");
$link = mysqli_connect(_DB_SERVER_,_DB_USER_,_DB_PASSWD_,_ DB_NAME_);
mysqli_query($link, " SET NAMES 'utf8' ");
mysqli_query($link, " SET CHARACTER SET charset_name 'utf8' ");
$map = file("../files/file.csv");
$i = 0;
while ($axe = $map[$i])
{
$se[$i] = explode(";", $map[$i]);
echo $query = "UPDATE prod SET `prix`='".$se[$i][1]."' WHERE `reference`='".$se[$i][0]."'";
printf(" vysledek: %d\n", mysqli_affected_rows($link));
echo "<br>";
mysqli_query($link, $query);
$i++;
}
mysqli_close($link);
?>
code/php
Kdyz slysím "mysql" tak to typicky neni pefrormance-critical, co si tam ifem zkusit jestli ten záznam existuje (náročnější, nicméně si troufnu tvrdit že v podoných kodech, které běží jednou pod sekundu je to celkem šumák) a podle toho se rozhodnout?
select count(*) from prod where reference = $se[neco];
IF >0 THEN $query = "UPDATE prod SET `prix`='".$se[$i][1]."' WHERE `reference`='".$se[$i][0]."'"; else
insert/zalogovani to co potřebujš
KISS = Keep it simple, silly
najpr zavolas mysqli_affected_rows($link) a az potom mysqli_query($link, $query) ??
preto ti to hazde divne vysledky... vymen to!