Autor Zpráva
Blow
Profil
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
Blow:
Jakou funkcí? Třeba to půjde na úrovni SQL bez PHP.
AM_
Profil
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
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
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.

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: