Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php + mysql + smarty] Problem z LIKE
Forum PHP.pl > Forum > PHP
sivyer
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]
adwol
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.
sivyer
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.
jono
[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...
HaRy
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 ...
sivyer
@ hary
Dziekuje, pomoglo smile.gif
Wina byla nie po stronie klasy do obslugi MySQL, ale po stronie niejako Smarty i mojej smile.gif
FiDO
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.
DeyV
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>
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.