Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]mysqli a pdo
eminiasty
post
Post #1





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


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?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


tak,wystarczy bindowanie.

mysqli też ma bindowanie.

Jeśli masz już mysqli możesz zostać przy tym.
Go to the top of the page
+Quote Post
eminiasty
post
Post #3





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


tak wiem, aczkolwiek wszystkie artykuły w necie świadczą o tym że PDO jest obecnie lepsze
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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)
Go to the top of the page
+Quote Post
eminiasty
post
Post #5





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


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;");


Ten post edytował eminiasty 12.12.2017, 22:07:12
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #6





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
eminiasty
post
Post #7





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


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.
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #8





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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).
Go to the top of the page
+Quote Post
eminiasty
post
Post #9





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


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 ..
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #10





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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;
Go to the top of the page
+Quote Post
viking
post
Post #11





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Przekazać jako parametr funkcji.


--------------------
Go to the top of the page
+Quote Post
eminiasty
post
Post #12





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


  1. function bind($parameter, $value, $var_type = null,$sth,$pdo)


//przekazanie na tej zasadzie nie dziala.
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #13





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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ę.

Ten post edytował SmokAnalog 13.12.2017, 00:09:26
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: 21.08.2025 - 20:30