Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z klasą, Dodawanie danych poprzez PDO
MMySlime
post
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 22.08.2012

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


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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?
Go to the top of the page
+Quote Post
MMySlime
post
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 22.08.2012

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


Nie korzystam gdyż chciałbym zrobić wreszcie coś swojego (IMG:style_emoticons/default/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 :/

Ten post edytował MMySlime 11.11.2012, 16:36:31
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
MMySlime
post
Post #5





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 22.08.2012

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


Ehhh, szkoda że nie da się tego zautomatyzować.
W każdym bądź razie dzięki za pomoc!
Go to the top of the page
+Quote Post
zegarek84
post
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


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...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.12.2025 - 10:48