Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Konkatenacja - problemy
Forum PHP.pl > Forum > Przedszkole
dolar
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?
nospor
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 ?
com
spójrz na to jak koloruje Ci forum tam jest pierwszy błąd wink.gif
dolar
@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;
nospor
Nie:
$war=join(', ', $wartosc);

a:
$war="'" . join("','", $wartosc) . "'";
dolar
  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?
viking
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...?
nospor
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
dolar
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.  
viking
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.
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.