Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z klasą
Forum PHP.pl > Forum > PHP
MMySlime
Witam,

stworzyłem sobie klasę łączącą z bazą danych, a w niej funkcję insert, która nie działa poprawnie. Nie ma żadnych błędów ale przeglądając bazę danych nie widać nowo dodanych wartości.

Funkcja:
  1. public function insert( $table, $values){
  2.  
  3. // Set Up Columns
  4.  
  5. $key = array_keys($values);
  6. $column = implode(',',$key);
  7. $column = '(' . $column . ')';
  8.  
  9. // Set Up Rows
  10.  
  11. $row = implode(',',$values);
  12. $row = '(' . $row . ')';
  13.  
  14. // INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)
  15.  
  16. $insert = $this->db->prepare('INSERT INTO :table :column VALUES :row');
  17.  
  18. $insert->bindParam(':table', $table);
  19. $insert->bindParam(':column', $column);
  20. $insert->bindParam(':row', $row);
  21.  
  22. $insert->execute();
  23.  
  24. }


Dziękuję za wszelkie odpowiedzi smile.gif
Crozin
Bindować możesz tylko wartości dla kolumn. Nazwa tabeli, a już tym bardziej cały fragment SQL-a nie może być bindowana.

PS. Dlaczego nie skorzystasz z jakiegoś gotowego narzędzia ułatwiającego komunikację z bazą, np. Doctrine DBAL?
MMySlime
Nie korzystam gdyż chciałbym zrobić wreszcie coś swojego wink.gif ,a tak w ógole zauważyłem że trzeba instalować ten moduł poprzez PEAR do czego nie jestem pozytywnie nastawiony.
Btw. dzięki za odpowiedź

No niestety, ale nadal nie działa, kod zmieniony:
  1.  
  2. public function insert( $table, $values){
  3.  
  4. // Set Up Columns
  5.  
  6. $key = array_keys($values);
  7. $column = implode(',',$key);
  8. $column = '(' . $column . ')';
  9.  
  10. // Set Up Rows
  11.  
  12. $row = implode(',',$values);
  13. $row = '(' . $row . ')';
  14.  
  15. // INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)
  16.  
  17. $insert = $this->db->prepare('INSERT INTO '.$table.' :column VALUES :row');
  18.  
  19. $insert->bindParam(':column', $column);
  20. $insert->bindParam(':row', $row);
  21.  
  22. $insert->execute();
  23.  
  24. }


Najwidoczniej nie do końca zrozumiałem o co ci chodziło :/
Crozin
Jak napisałem, możesz bindować jedynie wartość dla pojedynczej kolumny, tj.:
  1. INSERT INTO tbl_name (col_name_1, col_name_2, col_name_3) VALUES (:value1, :value2, :value3);
Reszta zapytania musi być złączona ręcznie.
Cytat
Nie korzystam gdyż chciałbym zrobić wreszcie coś swojego
Najpierw uczy się wykorzystywać istniejące narzędzia, później tworzy się swoje jeżeli zachodzi taka potrzeba.
MMySlime
Ehhh, szkoda że nie da się tego zautomatyzować.
W każdym bądź razie dzięki za pomoc!
zegarek84
Cytat(MMySlime @ 11.11.2012, 16:47:14 ) *
Ehhh, szkoda że nie da się tego zautomatyzować.

nie jestem żadnym programistą a już to robiłem kilka razy ;p - da się to rozsądnie zautomatyzować nie narażając się na sql iniection ale trochę pomyśl...

możesz wartości zimplodować tyle razy ile ich masz np. po znaku zapytania, poczytaj w manualu jak wtedy bindować i wtedy przypisz tablicę (zwróć uwagę od którego indeksu binduje - łatwiej Ci będzie to zrobić w pętli ;p), lub gdy tworzysz dynamiczne zapytanie to do kluczy musisz dać przedrostek ":" i potem nawet w skrócie do execute dać całą tablicę lub zbindować w pętli po kluczu... nie jestem za dawaniem gotowców niestety więc tylko nakierowuję, jednak znowu się powtórzę, że musisz zrobić dynamiczne zapytanie SQL z parametrami a potem to zbindować, ale jeszcze poczytaj o różnicy w bindowaniu przez referencję a przez wartość ;p - są do tego 2 funkcje ;p lub tablicę możesz przekazać jeszcze raz piszę w execute jeśli nie stosujesz dodatkowych parametrów przy bindowaniu...
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.