Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php + PDO] funckja
Forum PHP.pl > Forum > PHP
michal_robak
Witam. Chciałem sobie nieco uprościć sprawę z zapytaniami PDO i stworzyć funkcję zwracającą mi dane (jeden rekord):

  1. <?php
  2. //$db - połączenie z bazą
  3. //$zap - zapytanie
  4. //lista - przy bindValue
  5. //$typ - czy INSERT CZY SELECT CZY COS TAM COS TAM
  6.  
  7. function zapytanie($db,$zap,$lista,$typ)
  8. {
  9.    if($typ==1)//SELECT *FROM profile ...
  10.    {
  11.        $zapytanie = $db -> prepare($zap);
  12.        $i=1;
  13.  
  14.        foreach($lista as $klucz=>$wart)  
  15.        {
  16.            $zapytanie -> bindValue($i,$klucz,$wart);
  17.            $i++;
  18.        }
  19.        $zapytanie -> execute();
  20.  
  21.        return $dane = $zapytanie -> fetch();
  22.    }
  23. }
  24. ?>


Funkcję wywołuję w ten sposób:

  1. <?php
  2. $dane = zapytanie($db,"SELECT * FROM profile WHERE id= ?",$LISTA,1);
  3. ?>


Gdzie $LISTA to:
  1. <?php
  2. $LISTA = array($idek=>"PDO::PARAM_INT");
  3. ?>

Lecz nie działa mi ta linijka:
  1. <?php
  2. $zapytanie -> bindValue($i,$klucz,$wart);
  3. ?>


bo ja wiadomo ostatni prametr wygląda tak :
PDO::PARAM_STR (dla przykładu)

I z tego względu otrzymuje taki oto error:

Cytat
PDOStatement::bindValue() expects parameter 3 to be long, string given


Jak to poprawić questionmark.gif. Bo w sumie funkcja działa poprawnie jeżeli nie podam trzeciego parametru ale od tego on jest żeby go używać prawda smile.gif.
rzymek01
bindValue jak i bindParam:
Kod
bool bindParam ( mixed $parameter, mixed &$variable [, int $data_type [, int $length [, mixed $driver_options]]] )

róznią się tym, że do bindParam przekazujemy tylko adres obiektu (referencja od $variable), dlatego polecam korzystanie z bindParam

i jak widzisz jako trzeci argument podajesz PDO::PARAM_STR a nie $wart

na pewno potrzebna ci jest zmienna $klucz?
michal_robak
ALe w mojej funkcji właśnie potrzebuję takiego przekazywania parametru $wart ponieważ w zapytaniu mogę mieć różne obiekty nie tylko typu INT czy STRING i wtedy (zmienna $klucz również potrzebna, chyba że można to prościej zrobić).

  1. <?php
  2. $LISTA = array($email=>"PDO::PARAM_STR",$glowny=>"PDO::PARAM_INT");
  3.  
  4. $zapytanie = $db -> prepare("SELECT *FROM obrazki WHERE email = ? AND glowny = ?");
  5.  
  6. $i=1;
  7.  
  8.        foreach($lista as $klucz=>$wart)  
  9.        {
  10.            $zapytanie -> bindParam($i,$klucz,$wart);
  11.            $i++;
  12.        }
  13.        $zapytanie -> execute();
  14. ?>
antyqjon
Ale dlaczego w tej tablicy $LISTA pakujesz wartości stałych w cudzysłowy?
michal_robak
blinksmiley.gif HEHEHEHEHE no przemilczmy to minutą ciszy exclamation.gif. Widzisz takie to proste a ja tak główkowałem sadsmiley02.gif Dzięki wielkie biggrin.gif
rzymek01
no tak,

zmyliło mnie to, że raz masz $LISTA a raz $lista, heh
michal_robak
Nie chcę rozpoczynac nowego wątku więc pisze tu. Odpowiedzcie mi na pytanie DLACZEGO questionmark.gif

ten kod NIE działa:

  1. <?php
  2. $zap = $db -> prepare("SELECT *FROM wydarzenia WHERE kon>=? ORDER BY pocz ASC LIMIT ?, ?");    
  3. $zap -> bindValue(1,$dzis);
  4. $zap -> bindValue(2,$min);
  5. $zap -> bindValue(3,$ilosc);
  6. $zap -> execute();
  7. ?>


a ten DZIAŁA:
  1. <?php
  2. $zap = $db -> prepare("SELECT *FROM wydarzenia WHERE kon>=? ORDER BY pocz ASC LIMIT ".$min.",".$ilosc);    
  3. $zap -> bindValue(1,$dzis);
  4. $zap -> execute();
  5. ?>


ja już dostaje szewskiej pasji z tym PDO ... bo to takie toporne że człowiekowi witki opadają smile.gif

Probowałem kombinacje z PDO::PARAM_STR bądź PDO::PARAM_INT odpowiednio dla zmiennych i dupa kwas.
Mephistofeles
Nie działa, tzn. jaki błąd konkretnie? Spróbuj może z łańcuchami zamiast identyfikatorów.
michal_robak
Cytat
Nie działa, tzn. jaki błąd konkretnie?


kurde pisze jak początkujący informatyk <załamka>.

Odnośnie błędów. Tworze stronke od razu na serwerze i najgorsze jest to że żadnych błędów nie otrzymuję. A mam ustawione takie atrybuty przy łączniu się z bazą danych:
  1. <?php
  2. $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  3. ?>

Więc pewnie cos wina po stronie serwera skoro nie pokazuje błędów.

Teraz jeszcsze raz funkcyjka:

  1. <?php
  2. function zapytanie($db,$zap,$lista,$typ)
  3. {
  4.    if($typ==1)//SELECT *FROM profile ...
  5.    {
  6.        if(sizeof($lista)>0)
  7.        {
  8.            $zapytanie = $db -> prepare($zap);
  9.              $i=1;
  10.  
  11.            foreach($lista as $klucz=>$wart)  
  12.            {
  13.                if($wart==1)
  14.                    $zapytanie -> bindValue($i,$klucz,PDO::PARAM_INT);
  15.                elseif($wart==2)
  16.                    $zapytanie -> bindValue($i,$klucz,PDO::PARAM_STR);
  17.                
  18.                $i++;
  19.            }
  20.            $zapytanie -> execute();
  21.        }
  22.        else
  23.        {
  24.            $zapytanie = $db -> query($zap);
  25.            $zapytanie -> execute();
  26.        }
  27.        return $dane = $zapytanie -> fetch();
  28.    }
  29. }
  30. ?>



Jak na złość troche tu pozmieniałem i przy powrocie do tego kodu w którym pisałem że nie działa to teraz jest OK !. <masakra>. Tylko nieraz jak wypisuje zmienną $lista w funkcji pokazuje mi wszystkie dane lecz jakby nieraz nie działa ta funkcja bindValue i skrypt kończy działanie. Na pewno jeszcze niedługo będę pisał w tej sprawie bo czuje że to nie koniec moich zagwostek z PDO lib smile.gif.
rzymek01
Zamiast bindValue, użyj bindParam (ze względów wydajnościowych)

i jeszcze taka propozycja

zamiast tego:
  1. <?php
  2. if($wart==1)
  3.                   $zapytanie -> bindValue($i,$klucz,PDO::PARAM_INT);
  4.               elseif($wart==2)
  5.                   $zapytanie -> bindValue($i,$klucz,PDO::PARAM_STR);
  6. ?>


daj to:
  1. <?php
  2. $zapytanie -> bindParam($i,$klucz, ($wart == 1 ? PDO::PARAM_INT : PDO::PARAM_STR));
  3. ?>

smile.gif
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.