Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQLite] Proces dodawania rekordu do bazy - skrócenie kodu
Forum PHP.pl > Forum > PHP
404
  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ł?
by_ikar
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
404
Tylko niestety korzystam z SQLite3 smile.gif
by_ikar
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.
404
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
by_ikar
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
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.