Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Konkatenacja - problemy
dolar
post
Post #1





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 19.10.2016

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


Stworzylam sobie taka klase, ktora bedzie obslugiwac mi bazy danych. I podczas tworzenia ostataniej metody insert napotkalam problem. Nie wiem jak powinnam polaczyc te wszystkie zmienne i polecenia. W ogole mam problem z kontatenacja ostatnio ehh. Oto kod:
  1. class Tabela
  2. {
  3.  
  4. private $nazwa;
  5. private $limit = 1;
  6.  
  7.  
  8. function __construct(String $nazwa)
  9. {
  10. $this->nazwa = $nazwa;
  11. }
  12.  
  13. function limit(int $ile)
  14. {
  15. $this->limit = $ile;
  16. }
  17.  
  18. function select(array $kolumny = array('*'))
  19. {
  20.  
  21. $zapytanie = "SELECT " . join(',', $kolumny) . " FROM $this->nazwa LIMIT $this->limit";
  22. $db = Db::getInstance();
  23. $wynik = mysqli_query($db, $zapytanie);
  24. return $wynik->fetch_all(MYSQLI_ASSOC);
  25.  
  26. }
  27.  
  28.  
  29. function where(string $kolumna, $cos)
  30. {
  31. $zapytanie = "SELECT * FROM $this->nazwa WHERE $kolumna='$cos'";
  32. $db = Db::getInstance();
  33. $wynik = mysqli_query($db, $zapytanie);
  34. return $wynik->fetch_all(MYSQLI_ASSOC);
  35. }
  36.  
  37. function showKolumns()
  38. {
  39. $zapytanie = "SHOW COLUMNS FROM $this->nazwa";
  40. var_dump($zapytanie);
  41. $db = Db::getInstance();
  42. $wynik = mysqli_query($db, $zapytanie);
  43. return $wynik->fetch_all(MYSQLI_ASSOC);
  44. }
  45.  
  46. function insert (array $kolumny, array $wartosc){
  47. [b] $zapytanie="INSERT INTO $this->nazwa ".join(',', $kolumny) ." VALUES '. join(',', $wartosc) .'";[/b] -> tu nie zwraca mi prawidlowego zapytania.
  48. Powinno to wygladac na przyklad tak: "INSERT INTO `oceny`(`id`, `imie`, `przedmiot`, `ocena`) VALUES ('23', 'Ania', 'matematyka', '5')".
  49. var_dump($zapytanie);
  50. $db = Db::getInstance();
  51. $wynik = mysqli_query($db, $zapytanie);
  52. return $wynik->fetch_all(MYSQLI_ASSOC);
  53. }



Czy sa jakies zlote zasady konkatenacji?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




1) Nigdzie nie podales jak odpalasz te metode insert()
2) I czemu VALUE bierzesz wszystko w ciapki? Toz otrzymasz
..VALUES 'somevalue, somevalue2, somevalue2'
Zagladal do manuala jak wyglada poprawna skladnia INSERT .... VALUES ?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
com
post
Post #3





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


spójrz na to jak koloruje Ci forum tam jest pierwszy błąd wink.gif
Go to the top of the page
+Quote Post
dolar
post
Post #4





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 19.10.2016

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


@nospor -> jak nie wezme Value w '' to mi mysql nie chce dodac wartosci.W ogole jak dodac nawiasy dla values i nazw kolumn?

Dobra zrobilam cos takiego, ale nadal mysql krzyczy zeby values byly w nawiasach pojedynczych:

  1.  
  2. function insert (array $kolumny, array $wartosc){
  3. $kol=join(', ', $kolumny);
  4. $war=join(', ', $wartosc);
  5. $zapytanie="INSERT INTO `$this->nazwa` ($kol) VALUES ($war)";
  6. var_dump($zapytanie);
  7. $db = Db::getInstance();
  8. $wynik = mysqli_query($db, $zapytanie);
  9. return $wynik;


Ten post edytował dolar 13.01.2017, 12:21:41
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie:
$war=join(', ', $wartosc);

a:
$war="'" . join("','", $wartosc) . "'";


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
dolar
post
Post #6





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 19.10.2016

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


  1. function insert (array $kolumny, array $wartosc){
  2. $kol=join(', ', $kolumny);
  3. $war="'".join("','", $wartosc)."'";
  4. $zapytanie="INSERT INTO `$this->nazwa` ($kol) VALUES ($war)";
  5. var_dump($zapytanie);
  6. $db = Db::getInstance();
  7. $wynik = mysqli_query($db, $zapytanie);
  8. return $wynik;
  9.  
  10. }
  11.  


Dziala! smile.gif A teraz jeszcze jdeno szybkie pytanie: czy konstruowanie zapytania do bazy tak jak ja to zrobilam, ze zrobilam wczesniej zmienne z interesujacymi mnie wartosciami i pozniej dopiero je wlozylam do zapytania to jest to poprawna forma? Czy nie powinnam ich raczej robic i wszystko pisac jednym ciagiem w zapytaniu? Chodzi mi o $kol i $ war czy mozna je robic czy lepiej unikac takiego rozwiazania?
Go to the top of the page
+Quote Post
viking
post
Post #7





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Już to kilka razy wcześniej pisałem że cała ta klasa jest do niczego. Zapewne nie escapujesz wprowadzanych danych. Jak zapiszesz zapytanie insert into .... select...?


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jest to ok i zwieksza to czytelnosc.

Zas tak czy siak calosc nie jest ok bo jestes teraz totalnie podatna na SQL Injection.
Skoro uzywasz mysqli to wypadaloby uzyc bindowania smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
dolar
post
Post #9





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 19.10.2016

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


Cytat(viking @ 13.01.2017, 12:57:10 ) *
Już to kilka razy wcześniej pisałem że cała ta klasa jest do niczego. Zapewne nie escapujesz wprowadzanych danych. Jak zapiszesz zapytanie insert into .... select...?


Zdaje sobie sprawe ze nie jest to idealna klasa, ale to tylko moje cwiczenia, nie bede tego uzywac w zadnych projektach itp... na czyms musze sie uczyc.


Zmienialm ten kod na bardzije uniwersalny, czy teraz jest lepszy wydajnosciowo? tongue.gif

  1. <?php
  2. include '../db.php';
  3.  
  4. class Tabela
  5. {
  6.  
  7. private $nazwa;
  8. private $limit = null;
  9. private $where = null;
  10. private $order = null;
  11.  
  12.  
  13. function __construct(String $nazwa)
  14. {
  15. $this->nazwa = $nazwa;
  16. }
  17.  
  18.  
  19. function showKolumns()
  20. {
  21. $zapytanie = "SHOW COLUMNS FROM $this->nazwa";
  22. $db = Db::getInstance();
  23. $wynik = mysqli_query($db, $zapytanie);
  24. return $wynik->fetch_all(MYSQLI_ASSOC);
  25. }
  26.  
  27. function limit(int $ile)
  28. {
  29. $this->limit = $ile;
  30. }
  31.  
  32. function where(string $kolumna, $cos)
  33. {
  34.  
  35. $this->where = "$kolumna='$cos'";
  36.  
  37. }
  38.  
  39. function order(string $kolumna, string $order)
  40. {
  41. $this->order = "$kolumna $order";
  42. }
  43.  
  44. function select(array $kolumny = array('*'))
  45. {
  46. if ($this->limit != null) {
  47. $limit = "LIMIT $this->limit";
  48. } else {
  49. $limit = null;
  50. }
  51.  
  52. if ($this->where != null) {
  53. $where = "WHERE $this->where";
  54. } else {
  55. $where = null;
  56. }
  57.  
  58. if ($this->order != null) {
  59. $order = "ORDER BY $this->order";
  60. } else {
  61. $order = null;
  62. }
  63.  
  64. $zapytanie = "SELECT " . join(',', $kolumny) . " FROM $this->nazwa " . $where . " " . $order . " " . $limit . "";
  65. $db = Db::getInstance();
  66. $wynik = mysqli_query($db, $zapytanie);
  67. return $wynik->fetch_all(MYSQLI_ASSOC);
  68.  
  69. }
  70.  
  71.  
  72. function insert(array $kolumny, array $wartosc)
  73. {
  74. $kol = join(', ', $kolumny);
  75. $war = "'" . join("','", $wartosc) . "'";
  76. $zapytanie = "INSERT INTO `$this->nazwa` ($kol) VALUES ($war)";
  77. var_dump($zapytanie);
  78. $db = Db::getInstance();
  79. $wynik = mysqli_query($db, $zapytanie);
  80. return $wynik;
  81.  
  82. }
  83.  
  84. }
  85.  
Go to the top of the page
+Quote Post
viking
post
Post #10





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Dalej jest podatny na ataki. Tylko po co wymyślać koło na nowo? Skoro się uczysz to nie lepiej od razu dobrze? Ciekawych projektów do obsługi bazy jest od groma.


--------------------
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 - 18:48