Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]mysqli a pdo
Forum PHP.pl > Forum > Przedszkole
eminiasty
mam następującą funkcję filtrującą w mysqli:
  1. function filter_data($link,$zmienna){
  2. $zmienna = mysqli_real_escape_string($link,trim($zmienna));
  3. return $zmienna;
  4. }

chciałbym napisać jednak kod z użyciem pdo(ponoć jest lepsze?)
Jak odwzorować taka funkcje w pdo? wystarczy bindowanie?
Pyton_000
tak,wystarczy bindowanie.

mysqli też ma bindowanie.

Jeśli masz już mysqli możesz zostać przy tym.
eminiasty
tak wiem, aczkolwiek wszystkie artykuły w necie świadczą o tym że PDO jest obecnie lepsze
Pyton_000
To z innej beczki. W czym PDO będzie dla Ciebie lepsze? Co ma PDO czego nie ma mysqli? (chodzi o funkcjonalność której użyjesz w PDO)
eminiasty
Chce poprostu się podszkolić i przejść na coś innego

pytanie dwa:
Jeśli na tabelach jest prefix to stosuje konstrukcje jak poniżej? czy jest jakiś inny zapis?
  1. $sth = $pdo->prepare("SELECT login FROM ".$db_prefix."users WHERE login= :login LIMIT 1;");
SmokAnalog
PDO niestety nie obsługuje prefiksów tabel. Niektóre (pewnie większość) ORM-ów to robi. Poczytaj sobie o ORM.

Jeśli chodzi o PDO vs. MySQLi, to wybierz po prostu to, co Ci się bardziej podoba. Jedyną znaczącą różnicą jest to, że przesiadka z jednego systemu bazy danych na inny będzie znacznie łatwiejsza z PDO. W praktyce jednak pewnie zostaniesz przy MySQL.
eminiasty
chyba ostatnie:
Mam kawalek kodu:
  1. $sth = $pdo->prepare("SELECT login FROM " . $db_prefix . "users WHERE login= :login LIMIT 1;");
  2. //$sth->bindParam(':login', $login, PDO::PARAM_STR);
  3. bind(':login', $login);
  4. $sth->execute();
  5. $sth->setFetchMode(PDO::FETCH_ASSOC);
  6. if ($sth->fetch() > 0) {
  7. echo 'ttt';
  8. }

Chciałbym bindować parametry ale z użyciem funkcji:
  1. bind(':login', $login);


  1. function bind($parameter, $value, $var_type = null)
  2. {
  3. if (is_null($var_type)) {
  4. switch (true) {
  5. case is_bool($value):
  6. $var_type = PDO::PARAM_BOOL;
  7. break;
  8. case is_int($value):
  9. $var_type = PDO::PARAM_INT;
  10. break;
  11. case is_null($value):
  12. $var_type = PDO::PARAM_NULL;
  13. break;
  14. default:
  15. $var_type = PDO::PARAM_STR;
  16. }
  17. }
  18. $sth->$pdo->bindParam($parameter, $value, $var_type);
  19. }


Jak do takiej funkcji przekazć wartości $sth oraz $pdo / jak wywołać funkcje

W przypadku mysqli przekazywalem $link przez parametr funkcji tu co bym robił nie działa.
SmokAnalog
Daruj sobie taką funkcję. Jeśli tak bardzo chcesz uniknąć podawania typu, to po prostu używaj wszedzie PDO::PARAM_STR (czyli domyślnej wartości, więc możesz pominąć całkowicie podawanie typu).
eminiasty
mimo to chciałbym poznać sposób co trzeba zrobić by taka funkcja zadziałała,w jaki sposób zdefiniować odpowiednie parametry

Notice: Undefined variable: sth in ...
Notice: Undefined variable: pdo in ...
Notice: Trying to get property of non-object in ...
Fatal error: Uncaught Error: Call to a member function bindParam() on null in ..
SmokAnalog
To są podstawy funkcji i obiektów. W PHP, funkcje nie mają dostępu do zmiennych spoza ich zasięgu. W wielu innych językach programowania jest inaczej.

Musisz przekazać to, czego chcesz użyć w funkcji, jako parametry. Tylko że tu jest mały problem, bo bindParam działa na referencji (w przeciwieństwie do bindValue), więc trochę bajzel się robi. Po prostu tak się nie "upiększa" kodu. Ewentualnie mógłbyś zrobić własną klasę dziedziczącą po PDO i tam dodać własną metodę, która by sama czytała typ. Nie widzę jednak sensu.

Ale jak już się bawisz, to zobacz i przeanalizuj:
  1. class Kot {
  2. public $imie;
  3.  
  4. public function __construct($imie) {
  5. $this->imie = $imie;
  6. }
  7. }
  8.  
  9. function ustawWageKotu($kot, $waga) {
  10. $kot->waga = $waga;
  11. }
  12.  
  13. $kot = new Kot('Puszek');
  14. ustawWageKotu($kot, 127);
  15. echo $kot->waga;
viking
Przekazać jako parametr funkcji.
eminiasty
  1. function bind($parameter, $value, $var_type = null,$sth,$pdo)


//przekazanie na tej zasadzie nie dziala.
SmokAnalog
Spróbuj tak:

  1. function bind($sth, $parameter, $value) {
  2. // ustal $var_type
  3.  
  4. $sth->bindValue($parameter, $value, $var_type);
  5. }


Komentarz zastąp tym swoim switchem (chociaż nie pochwalam używania switcha w taki sposób ). Zamiast bindParam wstawiłem bindValue - przeczytaj sobie jaka jest różnica. Poza tym nie potrzebujesz $pdo jako parametru, bo połączenie z bazą jest już znane w $sth. Innymi słowy, jest przechowywane jako stan $sth.

Na Twoim obecnym etapie wiedzy te zależności mogą Cię trochę przytłaczać. Nie przejmuj się.
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.