Autor Zpráva
Michales
Profil
Ahoj už dnes podruhé.

Vypisuji na stránce texty songů.
Vypisuji je podle abecedy, kdy je možné si vybrat podle písmena jaké texty se vypíšou.
Takže mám klikací abecedu A B C .......Y Z
Všechno to funguje v pořádku ale teď bych potřebova radu, jak vypsat songy která nemají na první místě písmeno ale znak, jako například $, ' atd.
Pro představu 2 názvy
$100, 000 In Pennies
'57 Chevrolet

Jak zobrazit takovéto skladby?

                $abeceda = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'CH', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'); 
for ($i=0; $i<count($abeceda); $i++)
{
      echo '<a href="text_lyrics.php?pismeno='.$i.'"> '.$abeceda[$i].' </a>';
} 
Fisir
Profil
Reaguji na Michalese:
Generuj abecedu dynamicky na základě vložených skladeb. Takhle do ní můžeš přidat i čísla a další speciální znaky.
Michales
Profil
Fisir:
Jestli to chápu správně, znamená to vytáhnout všechny skladby s GROUP BY A pak zobrazit jen počáteční písména?
Chápu to správně?
Fisir
Profil
Reaguji na Michales:
V postatě ano.
Michales
Profil
Fisir:
Dobrá, zkusím to.
Doufám že to nebude extra náročné na databázi. Bude to muset projíždět deseti tísíce řadků.
Alphard
Profil
Michales:
Jestli to chápu správně, znamená to vytáhnout všechny skladby s ORDER BY A pak zobrazit jen počáteční písména?
Ne. Skladeb existuje hodně, nebylo by rozumné vše vytahovat z aplikace jen kvůli tomuto. Pomocí substring a seskupení (nebo distinct) lze vytáhnout z databáze přímo první písmena, ale ani to není nejrychlejší. Přidal bych sloupec s prvním znakem, aby byl dostupný v indexu bez volání funkce.

select distinct substring(name, 1, 1) from songs order by 1
Michales
Profil
Alphard:
Děkuji moc.

Ovšem znaky jako $ ' ( .[ { to stejně nevezme, ikdyž tak začínají skladby, tak je to nevypíše.
Luky
Profil
Alphard:
sloupec navíc je určitě dobrý nápad. Ukládat do něj pouze písmenko bez diakritiky a všechny ostatní počáteční znaky označit třeba jako # ($100, 000 In Pennies, '57 Chevrolet...)

Na webu pak:
$abeceda = range('A', 'Z');
$abeceda[] = '#';
Michales
Profil
Luky:
Vím že to je dobrý nápad a určitě se k tomu časem dostanu až budu mít více času zhruba 150 tisíc řádku projet a vložit do nového sloupce ty znaky.
Teď bych to ovšem potřeboval vyřešit takto, pokud to bude možné.
Vyřešil jsem znaky '( ale ty ostatní stejně ne.
Luky
Profil
Michales:
Nečekej, inspiruj se hrubým scriptem a zbav se tohoto problému :)

$result = $db->query('SELECT title FROM songs');

foreach($result as $item){
 $first = substr($item->title, 1, 1);
 // zde ještě nějaký iconv("utf-8", "us-ascii//TRANSLIT", $first) pro odstranění diakritiky...
 if(!ctype_alpha($first)){
  $first = '#';
 }
 
//UPDATE sloupce
}
Michales
Profil
Luky:
Dobře díky.
Asi mi nic jiného nezbývá ;-)
Michales
Profil
include 'db.php';

$query2="SELECT `Title` FROM songs";
$result = mysql_query($query2); 
foreach(mysql_fetch_array($result) as $klic => $hodnoty){ 
 $first = substr($hodnoty['Title'], 1, 1);
$first = iconv("utf-8", "us-ascii//TRANSLIT", $first);// zde ještě nějaký iconv("utf-8", "us-ascii//TRANSLIT", $first) pro odstranění diakritiky...
 if(!ctype_alpha($first)){
  $first = '#'; 
 }
 $query3 = "UPDATE `songs` SET `zkratka`= '".$first."'";
//UPDATE sloupce
} 

Mi hází na řádku: $first = substr($hodnoty['Title'], 1, 1); chybu : Warning: Illegal string offset 'Title' in nevíte prosím proč?
Alphard
Profil
Jestli jste na to ještě nepřišel sám, takhle výsledky z databáze pomocí mysql_fetch_array procházet nejde (mysql_fetch_array musí být volán opakovaně, posouvá interní ukazatel aktuálního záznamu), použijte klasický while.
Michales
Profil
Alphard:
Jo přišel jsem na to. Ovšem script se nikdy neprovede do konce protože vyprší čas spojení. Zatím jsem použil vaše rešení. Tímto se budu zabývat az bude více času.
Alphard
Profil
To se také dalo čekat, pak si implementujte dávkové zpracování (nějaký limit a postupně zvyšovaný offset). Nebo lépe, použijte část mého dotazu pro update většiny položek základní abecedy a zbytek pak dořešte na jeden průchod.
Dále se script značně zrychlí, když budete updatevat více záznamů najednou.

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: