ďťż

[php5/sql]PHP Data Object pare pytań.

       

Podstrony


telcocafe

Witajcie nigdy się nie bawiłem PDO no mam kilka pytań
<?php $query = $PDO->prepare("SELECT id, nick, pass, mail FROM ".GUEST_TBL." where nick = :login and pass = :pass"); $query->bindValue(':login', $login, PDO::PARAM_STR); $query->bindValue(':pass', md5($password), PDO::PARAM_STR); $query->execute(); if($query->fetchColumn() == BAD_LOGIN_OR_PASS) return 'no'; $query->execute(); $query->fetch(PDO::FETCH_ASSOC); $query->closeCursor(); $nick = $row['nick']; $pass = $row['pass']; $mail = $row['mail']; $stat = $row['stat']; ?>
jak zrobić żeby to było optymalniejsze bez 2 execute() i spełniało funkcję osobno mysql_num_rows i osobno mysql_fetch_assoc ?
i drugie pytanie czy tak zdefiniowane zapytanie powyżej trzeba filtrować przez addslashe itd żeby zapobiec sql injection? i jeszcze jedno pytanie, czy to na dole trzeba filtrować te zmienne już?
<? $query = $PDO->query("SELECT title, text FROM ".MENU_TBL." where posx = '$menu' and status = 1 order by posy"); ?>
pozdrawiam i czekam na szybką odpowiedź



Na PDO nie znam się - wolę własne mechanizmy, dlatego nie wiem jak zrobić pojedyncze wywołanie execute. Jednak patrząc na ten kod, można wywnioskować, iż funkcja bindValue zapewne filtruje coś (sprawdź).
Co do drugiego kodu - co to jest za zmienna: $menu? Czy jest ona zabezpieczona?

też mi się wydawało że za pomocą query bedzie trzeba filtrować ale kurde tego bindvalue nie rozumiem w manualu pisze tylko coś takiego

Binds a value to a corresponding named or question mark placeholder in the SQL statement that was use to prepare the statement.

Zajrzyj do kodu, czy w bindValue jest addslashes - będzie szybciej :-)



jak mam zajrzeć do kodu skoro to jest biblioteka wbudowana w php > 5.0 ?

bind po to jest by zachować bezpieczeństwo - coś ma być łańcuchem lub liczbą. Co do optymalizacji po co drugi raz wywołujesz execute?

no bo select nic nie zwraca w pdo co nie?
a inaczej nie umiem zrobić żeby policzyć ilość rekordów, a do logowania jest tro potrzbne zeby zobaczyc czy jest taki user.
TO jak to rozwiązać żeby nie było drugi raz execute?

możesz umieścić to w jednej transakcji, a execute nie wykonuje zapytania tylko przygotowuje zapytanie SQL wstawiając odpowiednie parametry z tego co pamiętam :)

jak wywaliłem to drugie execute to żadnych rekordów nie wyswietlał

A to nie wiem, ja robię na PHP 4.
To wiesz co, przerób to (piszę na telefonie więc tego nie zrobię) tak:
Wyrzuć pierwsze wywołanie zapytania, a po wykonaniu drugiego i pobraniu danych, sprawdź czy nie są puste. Rozumiesz?
Użytkownik andrzej_aa edytował ten post 06 styczeń 2008, 13:07
wiem rozumiem ale wtedy mam jedno dodatkowe zapytanie czyli dwa zamiast jednego. odnosnie php4 wyczytalem ze mysql_num_rows jest oszukane ;) bo nie da sie pobrac z selecta tylko po prsotu jeszcze przed zapytaniem pobiera cala baze czy jakos tak i przy bazie wiekszej niz 1mb niezle muli :P
sam jechałem do niedawna na php4 ale postanowiłem zrobić krok na przód bo php4 to archaizmy i to prawda wiele przydatnych rzeczy odkryłem w php5 po za tym podobno wraz z wyjsciem php6 skonczy sie support dla php4 ;)
Użytkownik dEz17 edytował ten post 06 styczeń 2008, 13:44
od początku roku php4 jest martwe - tylko wydają poprawki błędów bezpieczeństwa :)


wiem rozumiem ale wtedy mam jedno dodatkowe zapytanie czyli dwa zamiast jednego. Jak to dwa zapytania? Wyrzuć jedno execute, a po wywołaniu drugiego sprawdzaj, czy dane istnieją (w PHP 4 jest to możliwe :P ).

odnosnie php4 wyczytalem ze mysql_num_rows jest oszukane ;) bo nie da sie pobrac z selecta tylko po prsotu jeszcze przed zapytaniem pobiera cala baze czy jakos tak i przy bazie wiekszej niz 1mb niezle muli :P
sam jechałem do niedawna na php4 ale postanowiłem zrobić krok na przód bo php4 to archaizmy i to prawda wiele przydatnych rzeczy odkryłem w php5 po za tym podobno wraz z wyjsciem php6 skonczy sie support dla php4 ;)

Też się kiedyś przerzucę na piątkę, ale nie mam na to funduszy.

od początku roku php4 jest martwe - tylko wydają poprawki błędów bezpieczeństwa :)
Właśnie, ja - niestety - nie mam nowego komputera, którego wymaga nowe oprogramowanie i nie mam zbyt dużego pola do popisu.

<?php $query = $PDO->prepare("SELECT id, nick, pass, mail FROM ".GUEST_TBL." where nick = :login and pass = :pass"); $query->bindValue(':login', $login, PDO::PARAM_STR); $query->bindValue(':pass', md5($password), PDO::PARAM_STR); if($query->execute() == BAD_LOGIN_OR_PASS) return 'no'; $query->fetch(PDO::FETCH_ASSOC); $query->closeCursor(); $nick = $row['nick']; $pass = $row['pass']; $mail = $row['mail']; $stat = $row['stat']; ?>
zrobiłem to tak może być? nie wiem czy jest dobrze ale niby działa.
i tak przy okazji metode query stosuje do selectów z danymi wewnątrz skryptu
metody exec do updatowania itd danych z zmiennymi wewnatrz skryptu
a metode prepare do selectow i updatow itd ze zmiennymi ktorymi moze manipoulowac uzytkownik. moze tak byc?

i jeszcze takie pytanie jak mogę uzyskać w pdo coś w stylu
mysql_data_seek() i mysql_results()?
Użytkownik dEz17 edytował ten post 06 styczeń 2008, 18:37
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.