Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: htmlentities, problem z zastosowaniem w pdo
Forum PHP.pl > Forum > PHP
DonJeday
Witam,

Mam problem, ponieważ chcę zastosować htmlentities do wyświetlania wszystkich pól wyświetlanych za pomocą tablic asocjacyjnych w pdo do tego używam smartów. Chcę by było to odrazu stosowane.



Mój kod:

  1. <?php
  2.  
  3. $row_html = htmlentities($row);
  4. $smarty->assign('user_data', $row_html);
  5.  
  6. ?>




Jednak zwraca to błąd. W czym to tkwi?

Treść błędu:

Kod
Warning: htmlentities() expects parameter 1 to be string, array given in ...
Apocalyptiq
htmlentities przyjmuje w parametrze ciąg znaków, a ty dałeś mu tablice smile.gif

  1. <?php
  2. $row_html = array();
  3. foreach($row as $rec) $row_html[]=htmlentities($rec);
  4. $smarty->assign('user_data', $row_html);
  5. ?>
DonJeday
Cytat(Apocalyptiq @ 19.04.2009, 12:02:07 ) *
htmlentities przyjmuje w parametrze ciąg znaków, a ty dałeś mu tablice smile.gif

  1. <?php
  2. $row_html = array();
  3. foreach($row as $rec) $row_html[]=htmlentities($rec);
  4. $smarty->assign('user_data', $row_html);
  5. ?>

No teraz błędu nie wywala, ale też nic nie wyświetla winksmiley.jpg
pyro
Zauważyłeś zupełnie pustą tablice? Masz to w kodzie który podał kolega wyżej...
kantek
Chyba nie - $row_html jest pusta, a w $row chyba coś tam ma (a to jej elementy w pętli przepisuje do tej pustej).

dla pewności sprawdź sobie czy coś masz w tej tablicy $row exclamation.gif!

Pozdrawiam
DonJeday
jak nie używam tej funkcji wszystko działa wiec tablica $row nie jest pusta winksmiley.jpg
bim2
Polecę funkcję array_map zamiast robienia foreacha. Nie wiem jak zmienia prędkość ale chyba czytelniejsze/wygodniejsze.
DonJeday
Ehh nie kumam tego array_map... Jest jakiś normalniejszy sposób żeby zastosować htmlentities

Dodam, że tablica $row nie jest pusta bez htmlentities wszystko śmiga a jak dodam to albo błąd lub nic nie wyświetla
erix
  1. <?php
  2. $row_html[]=htmlentities($rec);
  3. ?>

$row_html ma byc tablicą?
megawebmaster
Tablica row jest tablicą asocjacyjną? Jak tak to skorzystaj z czegoś takiego:
  1. <?php
  2. $row_html = array();
  3. foreach($row as $key => $value) $row_html[$key]=htmlentities($value);
  4. $smarty->assign('user_data', $row_html);
  5. ?>

Albo z array_map:
  1. <?php
  2. $row_html = array();
  3. $row_html = array_map("htmlentities",$row);
  4. $smarty->assign('user_data', $row_html);
  5. ?>
DonJeday
Cytat(megawebmaster @ 20.04.2009, 21:33:00 ) *
Tablica row jest tablicą asocjacyjną? Jak tak to skorzystaj z czegoś takiego:
  1. <?php
  2. $row_html = array();
  3. foreach($row as $key => $value) $row_html[$key]=htmlentities($value);
  4. $smarty->assign('user_data', $row_html);
  5. ?>



Elegancko działa
megawebmaster
Musi winksmiley.jpg Oczywiście zadziała również z tablicą numerowaną winksmiley.jpg
DonJeday
A jak ustawić kodowanie utf-8 dla array_map? bo dla foreach robię to tak:
  1. <?php
  2. foreach($row as $key => $value) $row_html[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
  3. ?>


A jak powinno to wyglądać dla array_map bo w manualu nie mogę znaleść
megawebmaster
  1. <?php
  2. for($i = 0, $endI = count($row); $i<$endI; $i++){
  3.  $quotes[] = ENT_QUOTES;
  4.  $charset[] = 'UTF-8';
  5. }
  6. $row_html = array_map("htmlentities",$row,$quotes,$charset);
  7. ?>


Nie wiem jak to dokładnie zadziała jakbyś podał zamiast $quotes po prostu ENT_QUOTES, a zamiast $charset 'UTF-8' - w manualu jest tylko o zachowaniu z tablicami.

EDIT: Jest jeszcze opcja taka:
  1. <?php
  2. $row_html = array_map("htmlentities",$row, array_fill(0, count($row), ENT_QUOTES)), array_fill(0, count($row), 'UTF-8')));
  3. ?>


Znalezione na manualu winksmiley.jpg
http://pl.php.net/manual/pl/function.array-map.php
DonJeday
Niestety nie działa to kodowanie. Oto kod:
  1. <?php
  2.  
  3. while ($row_collection = $query -> fetch(PDO::FETCH_ASSOC)) {
  4.   $collection[] = array_map('htmlentities', $row_collection);
  5. }
  6. $smarty->assign('collection', $collection);
  7.  
  8. ?>


Wszystko co pobierane jest za pomocą tej pętli jest nieodkodowane, pomimo iż w zapytaniu PDO mam komendę "SET NAMES utf8"
Apocalyptiq
Może w bazie danych jest coś nie tak z tym? Kodowanie złe, albo popsute polskie znaki? Jak jest w utf-8, polskie znaki w bazie powinny być dwuznakowe, zwykle duże A jakieś i znak jakiś smile.gif
DonJeday
W bazie jest wszystko ok, bo polskie znaki są tego typu: Ĺ�


Wykąbinowałem coś takiego, tylko nie wiem co jest nie tak:
  1. <?php
  2. while ($row_collection = $query -> fetch(PDO::FETCH_ASSOC)) {
  3.  $a[] = array($row_collection, ENT_QUOTES, 'UTF-8');
  4.  $collection[] = array_map('htmlentities', $a);
  5. }
  6. ?>


Błąd:
Kod
Warning: htmlentities() expects parameter 1 to be string, array given in ...
erix
  1. <?php
  2. $a[] = array($row_collection, ENT_QUOTES, 'UTF-8');
  3. ?>

Po co te nawiasy kwadratowe? Przecież błąd wyraźnie sugeruje, w czym błąd.
megawebmaster
I tak to będzie błąd - do array_map, jako kolejne tablice podaje się kolejne parametry funkcji. Ja podawałem jak zrobić z UTF-8, ale widać, coś nie pasowało :]
  1. <?php
  2. $row_html = array_map("htmlentities", $row, array_fill(0, count($row), ENT_QUOTES), array_fill(0, count($row), 'UTF-8'));
  3. ?>

Problem był w podwójnych nawiasach za przy array_fill - nie zauważyłem tego, pisałem z palca smile.gif U mnie to działa - specjalnie sprawdziłem.
DonJeday
No dobra błędu nie ma ale też nic nie wyświetla haha.gif
  1. <?php
  2.  
  3. while ($row_collection = $query -> fetch(PDO::FETCH_ASSOC)) {
  4.    $collection[] = array_map("htmlentities", $row_collection, array_fill(0, count($row_collection), ENT_QUOTES), array_fill(0, count($row_collection), 'UTF-8'));
  5. }    
  6. $smarty->assign('collection', $collection);
  7.  
  8. ?>


Nie wiem co jest czemu nie wyświetla. Po prostu tak jak by niczego nie pobierało.
megawebmaster
Daj w pętli:
  1. <?php
  2. print_r($row_collection); echo '<br/>';
  3. ?>

Dostaniesz kolejne elementy pobrane przez PDO. Potem posprawdzaj podając jeden taki element do array_map() i zobacz co wyjdzie. Pokombinuj - w tym momencie nie mogę Ci pomóc, bo nie wiem co otrzymujesz w zapytaniu. Jak sprawdziłem dla prostej tablicy, np.
  1. <?php
  2. $row_collection = array('Coś1','Coś2','Coś3','Coś4');
  3. ?>

to działało.
DonJeday
Cytat(megawebmaster @ 22.04.2009, 21:14:20 ) *
...
to działało.


Wyszło printem wszysto to co ma wyjść:


Kod
Array ( [id] => 2 [description] => Szwagierczak i jego maluch [link] => http://www.youtube.com/watch?v=O9Wckpx9wUg [who] => 2 ) 
Array ( [id] => 5 [description] => Najlepszy fragment \"Dnia Świra\" [link] => http://www.youtube.com/watch?v=sgTafCVlhA4 [who] => 2 ) 
Array ( [id] => 12 [description] => ś [link] => ć [who] => 2 ) 
Array ( [id] => 13 [description] => USPDF 2009 Championship [link] => http://www.youtube.com/watch?v=pWMrfggZzo0 [who] => 2 )


Ale to i tak nie dało mi wskazówki jak rozwiązać tą pętlę z array_map chyba, żeby to zrobić foreach, lecz nie wiem, jak to zastosować w pętli i czy w ogóle można.
megawebmaster
Weź posprawdzaj czy array_fill'e poprawnie generują tablice (też je print'em winksmiley.jpg) Na koniec print'em array_mapa sprawdź. Coś gdzieś musi być. Może niepoprawna ilość jest, czy coś. Sprawdzę jeszcze z Twoimi danymi, specjalnie sobie dopiszę funkcję winksmiley.jpg

EDIT: Dobra sprawdziłem - array map zwraca tablicę numerowaną, nie asocjacyjną. Kod jakiego użyłem:
  1. <?php
  2. class Foo{
  3.    private
  4.        $i = 0,
  5.        $tablica= array(
  6.            array('id' => 2, 'description' => 'Szwagierczak i jego maluch', 'link' => 'http://www.youtube.com/watch?v=O9Wckpx9wUg', 'who' => 2 ),
  7.            array('id' => 5, 'description' => 'Najlepszy fragment "Dnia Świra"', 'link' => 'http://www.youtube.com/watch?v=sgTafCVlhA4', 'who' => 2 ),
  8.            array('id' => 12, 'description' => 'ś', 'link' => 'ć', 'who' => 2 ),
  9.            array('id' => 13, 'description' => 'USPDF 2009 Championship', 'link' => 'http://www.youtube.com/watch?v=pWMrfggZzo0', 'who' => 2 )
  10.        );
  11.  
  12.    public function fetch(){
  13.        $this->i++;
  14.        return $this->tablica[$this->i-1];
  15.    }
  16. }
  17. $foo = new Foo;
  18. while ($row_collection = $foo->fetch()) {
  19.    $collection[] = array_map("htmlentities", $row_collection, array_fill(0, count($row_collection), ENT_QUOTES), array_fill(0, count($row_collection), 'UTF-8'));
  20. }
  21.  
  22. print_r($collection);
  23. ?>


Takie wywołanie zwraca:
Kod
Array ( [0] => Array ( [0] => 2 [1] => Szwagierczak i jego maluch [2] => http://www.youtube.com/watch?v=O9Wckpx9wUg [3] => 2 ) [1] => Array ( [0] => 5 [1] => Najlepszy fragment "Dnia Świra" [2] => http://www.youtube.com/watch?v=sgTafCVlhA4 [3] => 2 ) [2] => Array ( [0] => 12 [1] => ś [2] => ć [3] => 2 ) [3] => Array ( [0] => 13 [1] => USPDF 2009 Championship [2] => http://www.youtube.com/watch?v=pWMrfggZzo0 [3] => 2 ) )


Klasę stworzyłem dla wygody winksmiley.jpg

Co do foreach'a w pętli - oczywiście, że można. W takim wypadku otrzymasz tablicę asocjacyjną, czyli taką jaką być potrzebował winksmiley.jpg
DonJeday
No to tak jak ja zrobiłęm pętlę ale nic nie wyświetla...



Dobra moze to zostawie i zrobię w tym foreach, lecz robie robie i nie wychodzi...

  1. <?php
  2.  
  3. while ($row_collection = $query -> fetch(PDO::FETCH_ASSOC)) {
  4.          $collectio[] = $row_collection;
  5.      }
  6.      foreach($collectio as $key => $value) $collection[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
  7.      $smarty->assign('collection', $collection);
  8.  
  9.  
  10.  
  11. ?>
megawebmaster
  1. <?php
  2. while ($row_collection = $query -> fetch(PDO::FETCH_ASSOC)) {  
  3.   foreach($row_collection as $key => $value)
  4.      $collection[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
  5. }
  6. $smarty->assign('collection', $collection);
  7. ?>


Jak coś to w ten sposób smile.gif Po co 2-krotnie przepisywać dane.

BTW. Sprawdzałeś print_r() czy jest coś w $collection?
DonJeday
Cytat(megawebmaster @ 23.04.2009, 17:01:42 ) *
  1. <?php
  2. while ($row_collection = $query -> fetch(PDO::FETCH_ASSOC)) {  
  3.   foreach($row_collection as $key => $value)
  4.      $collection[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
  5. }
  6. $smarty->assign('collection', $collection);
  7. ?>


Jak coś to w ten sposób smile.gif Po co 2-krotnie przepisywać dane.

BTW. Sprawdzałeś print_r() czy jest coś w $collection?

Print_r zwraca rekord ale pętla dalej nie działa. Tzn. nie wyświetla rekordów.


Dobra teraz dam wszystko co mam moze gdzieś indziej leży problem:

TPL np.:

Kod
{$collection[i].description}




PHP:

  1. <?php
  2.   
  3.      $pdo = new PDO('mysql:host=localhost;dbname=', '', '',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  4.      $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5.      $query = $pdo -> prepare('SELECT * FROM collection WHERE who = :who ORDER BY id');
  6.      $query -> bindValue(':who', $profileid, PDO::PARAM_STR);
  7.      $query -> execute();
  8.      while ($row_collection = $query -> fetch(PDO::FETCH_ASSOC)) { 
  9.          foreach($row_collection as $key => $value)
  10.          $collection[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
  11.      }
  12.      $smarty->assign('collection', $collection);
  13.      $query -> closeCursor();
  14.  
  15.  
  16.  
  17. ?>




Już denerwuje mnie to bo 4 dzień to robię haha.gif
bim2
nie powinno być:
  1. <?php
  2. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  3. $query = $pdo -> prepare('SELECT * FROM collection WHERE who = :who ORDER BY id');
  4. $query -> bindValue(':who', $profileid, PDO:ARAM_STR);
  5. $query -> execute();
  6. while ($row_collection = $query -> fetch(PDO::FETCH_ASSOC)) {
  7. $tmp = array();
  8. foreach($row_collection as $key => $value){
  9. $tmp[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
  10. }
  11. $collection[] = $tmp;
  12. }
  13. print_r($collection);
  14. $smarty->assign('collection', $collection);
  15. $query -> closeCursor();
  16. ?>

?
Moim skromnym zdaniem :]
DonJeday
Działa ;* Można zamknąć temat winksmiley.jpg
megawebmaster
  1. <?php
  2. while ($row_collection = $query -> fetch(PDO::FETCH_ASSOC)) {
  3. foreach($row_collection as $key => $value){
  4. $collection[][$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
  5. }
  6. }
  7. ?>

Tak nie zadziała? W sumie nie pomyślałem i pominąłem ten jeden poziom wstydnis.gif
bim2
No własnie na gg gadaliśmy i nie chciało zadziałać :/ Nie pytaj dlaczego ^^
megawebmaster
Pewnie wyrzuca więcej tablic, zresztą ten sposób nie był dla mnie pewny, a po wrzuceniu tutaj tak sobie pomyślałem, że w sumie niepotrzebnie. Głupio, że nie ma nic żeby ładnie mapowało zamiast array_map. A tworzyć własną funkcję to bezsens...
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.