Autor | Zpráva | ||
---|---|---|---|
Blow Profil |
#1 · Zasláno: 18. 6. 2010, 00:06:04
Ahoj chtěl bych upravit hromadně hodně řádků v databázi.
ne přepsat ale vzít to co tam je projet to nákou funcí a uložit to zpět. něco jako $stmt = $dbh->prepare("UPDATE tab SET name = ".funkce(name)." where id=(:id)"); je mi jasný že tenhle kod je blbost,ale doufám že chápete o co mi jde. |
||
Alphard Profil |
#2 · Zasláno: 18. 6. 2010, 00:35:29
Blow:
Jakou funkcí? Třeba to půjde na úrovni SQL bez PHP. |
||
AM_ Profil |
#3 · Zasláno: 18. 6. 2010, 00:38:17
Přímo PHP funkci v MySQL nespustíš. Ale jak říka Alphard, možná se ti problém podaří vyřešit na úrovni SQL. V opačném případě je všechny záznamy nutné přečíst, aktualizovat v PHP a pak zapsat.
|
||
Blow Profil |
#4 · Zasláno: 18. 6. 2010, 09:49:46 · Upravil/a: Blow
Na úrovni SQL to asi nepůjde potřebuju tam použít preg_replace()
To mě napadlo že tobudu muset číst a aktualizovat ale nevím jak aby se vždycky přečetl jeden záznam a pak aktualizoval $stmt = $dbh->prepare("SELECT * FROM tab"); $stmt->execute(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $xxx = preg_replace(...,...,$row["name"]); $id=$row["id"]; $stmt2 = $dbh->prepare("UPDATE tab SET name =(:name) where id=(:id)"); $stmt2->bindParam(':id', $id); $stmt2->bindParam(':name', $xxx); $stmt2->execute(); } Tohle by mohlo fungovat?? A nějak jednodušeji líp to nejde? |
||
AM_ Profil |
#5 · Zasláno: 18. 6. 2010, 09:57:59
pokud máš možnost manipulovat s instalací mysql, můžeš si k mysql přidat balík: https://launchpad.net/mysql-udf-regexp
jinak to moc jednodušeji nejde, možná by to šlo narvat do jednoho dotazu stylem: UPDATE mytable SET title = CASE WHEN id = 1 THEN 'Great Expectations'; WHEN id = 2 THEN 'War and Peace'; ELSE title END; kód bude naopak o něco méně přehledný (nejdřív musíš takový dotaz sestavit a pak teprve vykonat), ale je to šetrnější k databázi, kde platí téměr bez výjimky pravidlo: méně dotazů, větší efektivita. |
||
Časová prodleva: 14 let
|
0