Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: nie da się prościej?like a%, like b% ...
Forum PHP.pl > Forum > Bazy danych > MySQL
lovefool
Witam!
Mam liste piosenek ułożoną alfabetycznie...Chodzi o to aby przy tych zaczynających sie na 'a' była duża literka 'A' przy tych na 'b' - 'B' itd...
A więc jest tak:
[sql:1:a7b0f2982d]
<?
if(!is_numeric($_GET["id"]))
{
echo "A<br>";
if($q=mysql_query("SELECT id, nazwy FROM piosenki WHERE nazwy LIKE 'a%' ORDER BY nazwy ASC "))
{
while($t=mysql_fetch_array($q))
{
echo "<a href="teksty?id=".$t["id"]."">".$t["nazwy"]."</a><br>";
}
}
else
{
echo "Bład zapytania. Bład: ".mysql_error();
}

}
else
{

if($q=mysql_query("SELECT nazwy, teksty FROM piosenki WHERE id='".$_GET["id"]."'"))
{
$t=mysql_fetch_array($q);
echo "<font size="2"><b>".$t["nazwy"]."</a></font><br><br>";
echo $t["teksty"];
}
else
{
echo "Bład zapytania. Bład: ".mysql_error();
}
}
?> [/sql:1:a7b0f2982d]

I teraz pytanie: by napisać to samo do 'B' 'C' ... trzeba cały kod powtarzać czy może da się to jakoś łatwiej załatwić ?

pozdrawiam
itsme
pierwsze
[sql:1:3378103c3e]
"INSERT INTO piosenki ( nazwy, ......, pierwsza_litera ) VALUES (". $_POST['nazwa'].", ... ,LCASE( LEFT( ".$_POST['nazwa'].", 1 ) ) )"[/sql:1:3378103c3e]
jest to zapytanie przy dodawaniu nowego rekordu. Istotne jest to ze musisz miec dodatkowa kolumne o nazwie [b]pierwsza_litera
.
LCASE - na poziomie mySQL-a zamienia wszystkie litery łańcucha znaków na małe
LEFT - wyciąga określony ciąg znaków z łańcucha zaczynając od lewej strony a kończąc na określonym liczbowo - w tym wypadku jest to pierwszy znak.
drugie
w zmiennej $_GET['id'] daj litere alfabetu a, b ....... w ...
[sql:1:3378103c3e]
"SELECT * FROM piosenki where pierwsza_litera='LCASE( LEFT( ".$_GET['id'].", 1 ) )'"
[/sql:1:3378103c3e]
w przypadku gdyby ktos napisal w get wiecej znakow i tak zapytanie mysql je okroi i zamieni na male litery.
plusy i minusy
- dodawanie piosenki bedzie trwało troche wiecej czasu ale w zwiazku z tym ze to bedzie tylko 1 rekord to roznica nie bedzie miala znaczenia
+ wyszukiwanie po znaku a, b ....... w z pominienciem LIKE w znacznym stopmniu przyspieszy dzialanie mysql i nie bedziesz mial juz problemow z wielka litera A czy tez mala a.

Pozdrawiam
spenalzo
[sql:1:1e6721a7ba]
SELECT * FROM piosenki where pierwsza_litera=LCASE( LEFT( '".$_GET['id']."', 1 ) )
[/sql:1:1e6721a7ba]
Czy nie powinno być czasem bez apostrofów? Poza tym brakowało apostrofów w LEFT
lovefool
Ok...co jest nie tak?Nie potrafie zapisać rekordu do tabeli...oto kod części strony:

[sql:1:6e15837b30]
$dodaj=@mysql_query("INSERT INTO piosenki ( id, nazwy, teksty, pierwsza_litera )
VALUES (". $_POST['id'].", ". $_POST['nazwa'].", ". $_POST['tekst'].",LCASE( LEFT( ".$_POST['nazwa'].", 1 ) ) )");
[/sql:1:6e15837b30]
Kod
<FORM ACTION="dodaj_teksty.php" METHOD="POST">



<INPUT TYPE="TEXT" NAME="nazwa">

<TEXTAREA NAME="tekst">

<input type="submit" value="Dodaj" name="dodaj">

<INPUT TYPE="HIDDEN" name="id">



</FORM>


I jeśli już to zostanie rozwikłane to nie rozumiem:
Cytat
w zmiennej $_GET['id'] daj litere alfabetu a, b ....... w ...

Więc ja całą regułkę tą którą napisałem na początku będę musiał za każdym razem powtarzać ?

pozdrawiam
spenalzo
Całkiem pomieszane...
Tak powinno być ok.
[php:1:c575b3115d]<?php
$pl=strtolower(substr($_POST["nazwa"],0,1));
$dodaj=@mysql_query("INSERT INTO piosenki ( id, nazwy, teksty, pierwsza_litera ) VALUES ('". mysql_escape_string($_POST['id'])."', '". mysql_escape_string($_POST['nazwa'])."', '". mysql_escape_string($_POST['tekst'])."', '".$pl."')");
?>[/php:1:c575b3115d]
lovefool
Działa:)
Ale dalej nie rozumiem gdzie to wcisnąć:
[sql:1:14856b3914]
SELECT *
FROM piosenki
WHERE pierwsza_litera=LCASE( LEFT( '".$_GET['id']."', 1 ) )
[/sql:1:14856b3914]
i jak przypisać $_GET['id'] litere alfabetu ... :/

Nie wiem czy dostanę też od razu odpowiedz i na to wiec spytam od razu! Czy całe to :
[php:1:14856b3914]<?php
if(!is_numeric($_GET["id"]))
{
echo "A<br>";
if($q=mysql_query("SELECT id, nazwy FROM piosenki WHERE nazwy LIKE 'a%' ORDER BY nazwy ASC "))
{
while($t=mysql_fetch_array($q))
{
echo "<a href="teksty?id=".$t["id"]."">".$t["nazwy"]."</a><br>";

}
}
else
{
echo "Bład zapytania. Bład: ".mysql_error();

}
}
else
{

if($q=mysql_query("SELECT nazwy, teksty FROM piosenki WHERE id='".$_GET["id"]."'"))
{
$t=mysql_fetch_array($q);

echo "<font size="2"><b>".$t["nazwy"]."</a></font><br><br>";

echo $t["teksty"];

}
else
{
echo "Bład zapytania. Bład: ".mysql_error();

}
}

?>[/php:1:14856b3914]
będę musiał pisać dla każdej z liter ?

pozdrawiam!
lovefool
Baaaardzo bym prosił o odpowiedź .... tak te wcześniejsze odpowiedzi nie miałyby sensu sad.gif

pozdrawiam!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.