Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php + mysql + smarty] Problem z LIKE
sivyer
post
Post #1





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 17.04.2002
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Witam,

Mam problem z ponizszym zapytaniem SQL, pierwsze 3 rekordy dla litery A wyciaga poprawnie, pozniej sie sypie z bledem o nieprawidlowym argumencie dla foreach(). Chce, aby kolejno z bazy zawodnikow wyciagane byly nazwiska zaczynajace sie na kolejne litery alfabetu i wyswietlane:

A
nazwiska na A

B
nazwiska na B

itd.

[php:1:efb69e4755]
<?php
$ar = array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","R","S","T","U","V","W","X","Y","Z");
for( $i=0; $i<count($ar); $i++ ) {
$pl_loop[] = $i;
$smarty->assign("pl_loop", $pl_loop );
$smarty->assign("pl_litera", $ar );
$litera = $ar[$i];
$res = $db->get_results("SELECT playerID,pl_name,pl_surname FROM pro_players WHERE pl_surname LIKE '".$litera."%'");
foreach( $res as $player ) {
$pl_id[] = $player->playerID;
$pl[] = "$player->pl_surname, $player->pl_name";
}
// ...
?>
[/php:1:efb69e4755]

Probowalem:
[sql:1:efb69e4755]
SELECT playerID,pl_name,pl_surname FROM pro_players WHERE pl_surname LIKE '".$litera."%'
SELECT playerID,pl_name,pl_surname FROM pro_players WHERE pl_surname LIKE '$litera%'
SELECT playerID,pl_name,pl_surname FROM pro_players WHERE pl_surname REGEXP '^$litera.*'
SELECT playerID,pl_name,pl_surname FROM pro_players WHERE pl_surname REGEXP '^$litera.*'
SELECT playerID,pl_name,pl_surname FROM pro_players WHERE pl_surname REGEXP '^".$litera.".*'[/sql:1:efb69e4755]
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
adwol
post
Post #2





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 6.08.2003

Ostrzeżenie: (0%)
-----


Cytat
Mam problem z ponizszym zapytaniem SQL, pierwsze 3 rekordy dla litery A wyciaga poprawnie, pozniej sie sypie z bledem o nieprawidlowym argumencie dla foreach().

Samo zapytanie jest poprawne. Problem jest w PHPie. Nie wiem jakiej klasy jest obiekt $db ani jakiego typu wynik zwraca jego metoda get_results. Sprawdź czy napewno zwraca ona tablicę i zobacz czy masz tam dostępną jakąś metodę zwracającą status zapytania.
Go to the top of the page
+Quote Post
sivyer
post
Post #3





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 17.04.2002
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Zapomnialem dopisac. Obiekt $db to obiekt zwracany przez klase Ez_SQL.

Kod
$db->get_results



$db->get_results – get multiple row result set from the database (or previously cached results)



Description



array $db->get_results(string query / null [, OBJECT / ARRAY_A / ARRAY_N ] )



$db->get_row() gets multiple rows of results from the database based on query and returns them as a multi dimensional array. Each element of the array contains one row of results and can be specified to be either an object, associative array or numerical array. If no results are found then the function returns false enabling you to use the function within logic statements such as if.
Go to the top of the page
+Quote Post
jono
post
Post #4





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 29.06.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


[php:1:ea58198961]<?php
$res = $db->get_results("SELECT playerID,pl_name,pl_surname FROM pro_players ORDER by pl_surname ");

?>[/php:1:ea58198961]
Powinno wyciągać alfabetycznie. Chyba, że nie o to ci chodzi...


--------------------
if(function_exists("zrozum_kobiete")){
echo "Niemożliwe!"; exit;}
Go to the top of the page
+Quote Post
HaRy
post
Post #5





Grupa: Zarejestrowani
Postów: 152
Pomógł: 0
Dołączył: 15.05.2002
Skąd: Łódź

Ostrzeżenie: (0%)
-----


hmm

ja zrobil bym to tak:

[php:1:547f9e8aad]<?php

$literki =
array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","R","S","T","U
","V","W","X","Y","Z");
$tmp = array();
foreach($literki as $litera) {
$r = mysql_query("select nazwisko from tabela where nazwisko like '".$litera."%'");
$tmp2 = array();
while($t = mysql_fetch_assoc($r)) {
array_push($tmp2,array("nazwisko" =>$t[nazwisko]));
}
array_push($tmp,array("litera" => $litera,"nazwiska" => $tmp2));
}
$smarty -> assign('dane',$tmp);


?>[/php:1:547f9e8aad]

a w tpl'u
Kod
{section name=l loop=$dane}

   <b>{$dane[l].litera}<br>

   {section name=t $dane[l].nazwiska}

      {$dane[l].nazwiska[t].nazwisko}<br>

   {sectionelse}

      Brak nazwisk na {$dane[l].litera}<br>

   {/section}

   <hr>

{/section}

zapodaj do tego swoje style obslugi bazy danej i powinno dzialac, chyba ze gdzies jakas literowke zrobilem ...
Go to the top of the page
+Quote Post
sivyer
post
Post #6





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 17.04.2002
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


@ hary
Dziekuje, pomoglo smile.gif
Wina byla nie po stronie klasy do obslugi MySQL, ale po stronie niejako Smarty i mojej smile.gif
Go to the top of the page
+Quote Post
FiDO
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


Ja bym powiedzial ze tylko po Twojej ;P

Mam jeszcze inne (wydaje mi sie ze wydajniejsze) rozwiazanie, ale nie dam gotowca bo za 15 minut wyjezdzam, wiec opisze tylko schemat..

- wyciagamy wszystko jednym zapytaniem sortujac oczywiscie alafabetycznie, z tym ze dodatkowo z kazdego rekordu wyciagamy pierwsza litere nazwiska jako osobne pole (substringiem czy czyms z mysql'a), przyjmijmy ze dajemy tej literce alias 'literka' (tworcze co? snitch.gif)
- korzystamy z dobrodziejstwa smarty i mozliwosci odnoszenia sie do poprzedniego/nastepnego elementu w tablicy, czyli cos takiego:
Kod
{section name=l loop=$dane}

{if $smarty.section.l.index == 0

|| $dane[l.index_prev].literka != $dane[l].literka}

<b>{$dane[l].literka}<br>

{/if}

{$dane[l].nazwisko}<br>

<hr>

{/section}


Nie dam glowy, ze nie ma w tym kodzie bledow, bo pisalem na szybko i z glowy, ale chyba powinno byc ok.
Go to the top of the page
+Quote Post
DeyV
post
Post #8





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




ja tego typu rzeczy trobię tak:
W podanym przykladzie mamy dodatkową kolumnę w bazie, o nazwie rok, którą wyświetlamy tak jak ty chcesz wyświetlać swoją literę alfabetu.
Kod
    {section loop=$arrListaArt name=i}





  {if $arrListaArt[i].rok != $rok}

      {if $rok}

        </ul>

            {/if}

     {assign var="rok" value=$arrListaArt[i].rok}



     <br />

     <span class="tekst" style="font-size: 12pt; color: #181750; font-weight: bold;">

         {$arrListaArt[i].rok}

     </span>

     <ul class="tekst">

    {/if}

    

        <li><a href="{$arrListaArt[i].link}">{$arrListaArt[i].nazwa}</a></li>  



    {/section}

         </ul>


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 19:18