ďťż
Podstrony
|
telcocafeWitajcie 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 |
|||
Sitedesign by AltusUmbrae. |