Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQLite] Proces dodawania rekordu do bazy - skrócenie kodu
404
post
Post #1





Grupa: Zarejestrowani
Postów: 226
Pomógł: 25
Dołączył: 22.05.2011

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


  1. $stmt = $this->db->prepare('INSERT INTO logs VALUES(null, DATETIME(), :fileName, :lineNumber, :message, :type ,:ipAddress, :host, :agent);');
  2.  
  3. if( $stmt === (object)0 )
  4. return false;
  5.  
  6. if( !$stmt->bindValue(':fileName', $log->getFileName(), SQLITE3_TEXT) )
  7. return false;
  8.  
  9. if( !$stmt->bindValue(':lineNumber', (int)$log->getLineNumber(), SQLITE3_INTEGER) )
  10. return false;
  11.  
  12. if( !$stmt->bindValue(':message', $log->getMessage(), SQLITE3_TEXT) )
  13. return false;
  14.  
  15. if( !$stmt->bindValue(':type', (int)$log->getType(), SQLITE3_INTEGER) )
  16. return false;
  17.  
  18. if( !$stmt->bindValue(':ipAddress', (int)ip2long($log->getIP()), SQLITE3_INTEGER) )
  19. return false;
  20.  
  21. if( !$stmt->bindValue(':host', $log->getHost(), SQLITE3_TEXT) )
  22. return false;
  23.  
  24. if( !$stmt->bindValue(':agent', $log->getAgent(), SQLITE3_TEXT) )
  25. return false;
  26.  
  27. if( $stmt->execute() === (object)0 )
  28. return false;
  29.  
  30. return $stmt->close();

Nie podobają mi się te instrukcje warunkowe - czy to naprawdę musi tak być? Nie da się tego jakoś skrócić? Ma ktoś jakiś pomysł?

Ten post edytował 404 23.03.2012, 01:23:54
Go to the top of the page
+Quote Post
by_ikar
post
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Nie nie musi, możesz w jednej tablicy przekazać wszystkie dane do execute. Tutaj masz przykład w manualu: http://www.php.net/manual/en/pdostatement.execute.php
Go to the top of the page
+Quote Post
404
post
Post #3





Grupa: Zarejestrowani
Postów: 226
Pomógł: 25
Dołączył: 22.05.2011

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


Tylko niestety korzystam z SQLite3 smile.gif
Go to the top of the page
+Quote Post
by_ikar
post
Post #4





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Yyy nie rozumiem, a co to jest za różnica? Żadna. Nawet nie wiem czy da się przełączyć na sqlite2, próbowałem, bo potrzebowałem num_rows, ale się obyłem bez tego.. Nie musisz podawać typu danych podczas podpinania zapytania. Ten typ podaje się po to żeby nam rzutowało na taki typ, w przypadku kiedy dane które przesyłamy są inne niż te których oczekujemy. O czym zresztą jest wspomniane w manualu.

Sam również korzystam ze sqlite, i to nie ma żadnego znaczenia czy podpinasz dane poprzez bindValue czy podajesz tablicę tych danych do execute.
Go to the top of the page
+Quote Post
404
post
Post #5





Grupa: Zarejestrowani
Postów: 226
Pomógł: 25
Dołączył: 22.05.2011

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


Da się przełączyć na SQLite2, ale na SQLite3 już chyba nie. Zresztą, podsunąłeś mi pomysł z tą tablicą.
  1. $values2Bind = array
  2. (
  3. array(':fileName', $log->getFileName(), SQLITE3_TEXT),
  4. array(':lineNumber', (int)$log->getLineNumber(), SQLITE3_INTEGER),
  5. array(':message', $log->getMessage(), SQLITE3_TEXT),
  6. array(':type', (int)$log->getType(), SQLITE3_INTEGER),
  7. array(':ipAddress', (int)ip2long($log->getIP()), SQLITE3_INTEGER),
  8. array(':host', $log->getHost(), SQLITE3_TEXT),
  9. array(':agent', $log->getAgent(), SQLITE3_TEXT)
  10. );
  11.  
  12. $stmt = $this->db->prepare('INSERT INTO logs VALUES(null, DATETIME(), :fileName, :lineNumber, :message, :type, :ipAddress, :host, :agent);');
  13. if( $stmt === (object)0 )
  14. return false;
  15.  
  16. foreach($values2Bind as $value)
  17. {
  18. if( !$stmt->bindValue($value[0], $value[1], $value[2]) )
  19. return false;
  20. }
  21.  
  22. if( $stmt->execute() === (object)0 )
  23. return false;

Dzięki smile.gif

Ten post edytował 404 24.03.2012, 14:54:05
Go to the top of the page
+Quote Post
by_ikar
post
Post #6





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Ale nadal nie do końca rozumiesz po co się podaje typ danych jakie się podpina. Typ danych który się podaje, podaje się po to, gdyby w przypadku innych danych niż oczekiwane (chcesz inta, a tutaj ktoś ci śle stringa) to te dane są rzutowane. Czyli nie musisz nigdzie indziej tych danych rzutować, a w kilku miejscach rzutujesz do inta. Druga sprawa to nie musisz w ogóle podawać jaki to jest typ danych. Od tego masz walidator, który sprawdza twój formularz, czy w innych miejscach możesz w inny sposób sprawdzać te dane, i w tamtych miejscach je rzutować, zamiast rzutowanie przenosić na PDO.

Robi tak chociażby zend_db, i pewnie kilka innych "nakładek" na PDO i wcale to nie zmniejsza bezpieczeństwa. A w przypadku kiedy dane nie pochodzą od użytkownika (jego adres IP pobrany z tablicy super globalnej SERVER) to nie musisz ich sprawdzać czy rzutować, jak dla mnie jest to zbędny zabieg wink.gif

Sam zresztą nie podaje typu danych, bo dane pobrane z POST/GET odpowiednio są sprawdzane przez walidator/router i nie ma możliwości aby przeszło coś innego niż to co chcę wink.gif
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 - 09:07