Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z edytowaniem rekordów w bazie mysql z wykorzystaniem mysqli
Forum PHP.pl > Forum > Przedszkole
Misza71
Dzien dobry.
Próbuje zrobić swój pierwszy rozbudowany projekt. Wszystko szło okey do momentu w którym chciałbym edytować pojedynczy rekord w bazie. Wstawie kod będzie łatwiej wytłumaczyć. Wyskakuje mi wiadomość z catcha mimo tego że żadne throw nie zostaje uruchomiony a sama edycja pominięta jeżeli ktoś by mi wytłumaczył gdzie robię błąd byłbym wdzięczny.

  1.  
  2. <?php
  3.  
  4. require_once "TryToConnect.php"; // Jest tam funkcja magicConnect
  5.  
  6.  
  7. try
  8. {
  9.  
  10. $connection = new magicConnect;
  11. $resultOfMagicConnect=$connection->tryToConnect();
  12.  
  13. if($resultOfMagicConnect==false)
  14. {
  15. echo "Pierwszy throw";
  16. throw new Exception(mysqli_connect_errno());
  17. }
  18.  
  19. $comic_id = $_GET["id"];
  20.  
  21. $rowResults = $resultOfMagicConnect->query("SELECT * from registration where id_registration = $comic_id"); // Wyswietla dane w formularzu
  22.  
  23. $results=$rowResults->fetch_assoc();
  24.  
  25. $editCategory =$results["category"];
  26. $editPriority = $results["priority"];
  27. $editPayment = $results['payment'];
  28.  
  29.  
  30.  
  31. if(!$rowResults)
  32. {
  33. echo "Drugi throw";
  34. throw new Exception($connect->error);
  35. }
  36.  
  37. if($rowResults)
  38. {
  39.  
  40.  
  41.  
  42. if(isset($_POST['yourTitle']))
  43. {
  44. $newTitle =$_POST['yourTitle'];
  45.  
  46. $updateQuery=("UPDATE registration SET title ='$newTitle' WHERE id_registration = '$comic_id' ");
  47. echo "Drugi "; // Kod działa tylko do tego momentu
  48. $edit=mysqli_query($resultOfMagicConnect, $updateQuery);
  49.  
  50. echo "Drugi ";
  51. if(mysqli_query($resultOfMagicConnect, $updateQuery)) // Nie wchodzi do tego ifa
  52. {
  53. echo "Drugi ";
  54. echo "Records were updated successfully.";
  55. }
  56. echo "Drugi "; // te echo też omija
  57.  
  58.  
  59.  
  60.  
  61. }
  62.  
  63.  
  64. }
  65.  
  66. }
  67.  
  68.  
  69.  
  70. catch(Exception $e)
  71. {
  72. echo '"Błąd serwera! Spróbuj innym razem."'; // Wyswietla sie htrow ppo wszystkim
  73. }
  74.  
  75. ?>



Tutaj funcja magic Connect

  1. <?php
  2.  
  3. class magicConnect
  4. {
  5. public function tryToConnect()
  6. {
  7. $result = new mysqli('localhost','root','','systemzglaszaniaawarii');
  8. if ($result->connect_errno ===0)
  9. {
  10. return $result;
  11. }
  12. else
  13. {
  14. return false;
  15. }
  16. }
  17. }
  18.  
  19. ?>
  20.  



Z góry dziekuję i pozdrawiam
nospor
Przeciez obiekt $e zawiera dokladna wiadomosc co i gdzie jest zle. Zamiast latac po forach, wpierw wyswietl to sobie a sie dowiesz co ci rzuca wyjatkiem
Misza71
Dzięki za opowiedz. Nie pomyślałem o tym
Dobra stary dzięki wielkie mam problem ze zmienną $comic_id/ Gdy zmieniłem na numer rekordu 32 normalnie zmienia tytuł w bazie.
Treść błędu to
"mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '32''' at line 1 in C:\xampp\htdocs\SystemZglaszaniaMarkNaDomene\editTitle.php:50 Stack trace: #0 C:\xampp\htdocs\SystemZglaszaniaMarkNaDomene\editTitle.php(50): mysqli_query(Object(mysqli), 'UPDATE registra...') #1 {main}

Wiesz może czy zmienną którą wprowadzam w instrukcji update musze konwertować na jakis konkretny typ?

Działa musiałem skonwertować na inta dziękuję za podpowiedz
nospor
Skoro uzywasz mysqli poczytaj o BINDowaniu danych do zapytania. W tej chwili twoj kod jest dziurawy jak ser szwajcarski
Misza71
Zabezpiecze przed sqlinjection jak będzie działac. Jeszcze musze edytować całą bązę danych. No i teraz jest kolejny problem bo po konwersji wartośc mojej zmiennej to zero... facepalmxd.gif
nospor
Watpie ze 0 jest wynikiem kowersji. Poprostu ta zmienna od poczatku jest kijowa wink.gif

Zaprzyjaznij sie z VAR_DUMP i stosuj zawsze gdzie popadnie


var_dump($_GET);
i zobacz dokladnie co siedzi w get a nie polegasz na jakis zalozeniach
Misza71
nospor dzięki za wskazówki i pomoc. Bez Ciebie siedziałbym jeszcze pół dnia albo zmieniał cały kod. Pozdrawiam smile.gif

Za chwilkę sprawdze co robi Var_dump bo myślałem badziej o ctype_alnum i sprawdzaniu o długości. W zmiennej siedział string zle zabrałem się za konwersje .

Bindowanie działa też przy użyciu mysqli? czy tylko w pdo?
nospor
mysqli tez ma bindowanie. Temu napisalem ze skoro uzywasz mysqli to zainteresuj sie bindowaniem wink.gif
Misza71
Wstawie mój skończony kod. Zrobiłem te binodwanie ale nie działa nie wyskakuje żaden błąd ale dane nie są aktualizowane.

  1.  
  2. <?php
  3.  
  4. require_once "TryToConnect.php"; // Jest tam funkcja magicConnect
  5.  
  6.  
  7.  
  8. try
  9. {
  10.  
  11. $connection = new magicConnect;
  12. $resultOfMagicConnect=$connection->tryToConnect();
  13.  
  14. if($resultOfMagicConnect==false)
  15. {
  16.  
  17. throw new Exception(mysqli_connect_errno());
  18. }
  19.  
  20. $comic_id = $_GET["id"];
  21.  
  22. $rowResults = $resultOfMagicConnect->query("SELECT * from registration where id_registration = $comic_id"); // Wyswietla dane w formularzu
  23.  
  24. $results=$rowResults->fetch_assoc();
  25.  
  26. $editCategory =$results["category"];
  27. $editPriority = $results["priority"];
  28. $editPayment = $results['payment'];
  29. $check=true;
  30.  
  31.  
  32.  
  33. if(!$rowResults)
  34. {
  35.  
  36. throw new Exception($connect->error);
  37. }
  38.  
  39. if($rowResults)
  40. {
  41.  
  42.  
  43.  
  44. if(isset($_POST['yourTitle']))
  45. {
  46. $newTitle =$_POST['yourTitle'];
  47. if(strlen($newTitle)<=3 || strlen($newTitle)>30) //imie musi skladac sie od 3 do 20 liter
  48. {
  49. $check=false;
  50. echo "Tytuł musi składać się od 3 do 30 liter.";
  51.  
  52. }
  53. if(ctype_alnum($newTitle)==false) // Sprawdza czy ciąg znaków składa się z cyfr i liczb
  54. {
  55. $check=false;
  56. echo "Tyutł może składać się tylko z liter (bez polskich znaków).";
  57.  
  58. }
  59.  
  60. if($check ==true)
  61. {
  62. htmlentities($newTitle,ENT_QUOTES, "UTF-8");
  63.  
  64. intval($comic_id);
  65.  
  66. $updateQuery=("UPDATE registration SET title ='$newTitle' WHERE id_registration = $comic_id");
  67.  
  68. //TUTAJ
  69.  
  70. $stmt =$resultOfMagicConnect->prepare("UPDATE registration SET title =? WHERE id_registration = ?");
  71.  
  72. $stmt->bind_param("si",$newTitle, $comic_id);
  73. echo "Cos";
  74. $stmt->execute();
  75.  
  76. $edit=mysqli_query($resultOfMagicConnect, $updateQuery);
  77.  
  78. header ('Location:accident.php');
  79.  
  80.  
  81. }
  82.  
  83. }
  84.  
  85.  
  86. }
  87.  
  88. }
  89.  
  90.  
  91.  
  92. catch(Exception $e)
  93. {
  94. echo '"Błąd serwera! Spróbuj innym razem."'; // Wyswietla sie htrow ppo wszystkim
  95. echo $e;
  96. }
  97. $resultOfMagicConnect->close();
  98. ?>


Prosze jak znajdziesz chwilę rzuć okiem bo nie mam pomysłu. To już ostatnia prośba pozdrawiam
nospor
1) Sie zdecyduj i albo robisz bindowanie albo nie. Teraz to samo zapytanie raz odpalasz z bindowaniem a raz bez

2) VAR_DUMP, pamietasz?

Pokaz co zwraca
var_dump($newTitle);
var_dump($comic_id)
Misza71
Wiem że miałem dwa sposoby edycji ale nie działało bindowanie i po prostu robiłem dalej projekt.
Zawartośc zmiennych:
newTitle = string(9) "Tytul"
comic_id =string(4) "'32'"

Ten sam problem z tym że nie wiem jak konwertować na inta. Wcześniej w kodzie odbywa się taka konwersja
nospor
no jak ci to ma dzialac, jak twoja liczba przekazana do bindowania zawiera apostrofy... Teraz masz '32' a masz miec 32. Do bindowania przekazuje sie normalne dane a nie w ciapkach

Prosilem wczesniej zrobic
var_dump($_GET);
Bo teraz to wyglada jakbys te dane w ciapkach przekazywal juz GET i POSTem. No chyba ze gdzies tam w odchlani twojego kodu sam dodajesz te ciapki. Nie wiem, z kodu co pokazales tutaj nic takiego nie wynika. Wiec albo GETem slesz od razu w ciapkach albo sprawdz czy sam gdzies nie dodajesz.
Misza71
Miałes rację w get przekazywałem dodatkowe ''. Byłem świecie przekonany że gdy używasz instrukcji echo to apostrofy drukują nazwę zmiennej za to średniki jej wartośc.
  1. <table>
  2. <thead>
  3. <tr>
  4. <th>Tytuł</th> <th>Opis</th> <th>Priorytet</th><th>Kategoria</th><th>Platnosc</th>
  5. </tr>
  6. </thead>
  7. <tbody>
  8. <tr>
  9.  
  10.  
  11. <?php
  12.  
  13. echo "<td><a href=editTitle.php?id=$comic_id>"
  14. ?> <?php echo $editTitle?></a></td>
  15. <td><a href="#"> OpisKtoregoNIEma</td>
  16. <?php
  17.  
  18. echo "<td><a href=editPriory.php?id=$comic_id>"
  19. ?>
  20. <?php echo $editPriority?></td>
  21.  
  22. <?php
  23.  
  24. echo "<td><a href=editCategory.php?id=$comic_id>"
  25. ?>
  26. <?php echo $editCategory?></td>
  27. <?php
  28.  
  29. echo "<td><a href=editPayment.php?id=$comic_id>"
  30. ?>
  31. <?php echo $editPayment?></td>
  32. </tr>
  33.  
  34. </tr>
  35. </tbody>

To jest kod który wysyła geta z strony poprzedzającej edycje tytułu. Dzięki za poświęcony czas i pomoc, najprawdopodobniej odpuściłbym bindowanie i zrobił to tradycyjną metodą. Pozdrawaim ten php wcale nie jest porsoty jak się wydaje
nospor
Cytat
ten php wcale nie jest porsoty jak się wydaje

Jak ktos robi glupie bledy to wszystko wydaje sie trudne wink.gif


Cytat
Byłem świecie przekonany że gdy używasz instrukcji echo to apostrofy drukują nazwę zmiennej za to średniki jej wartośc.

Nie boj sie robic eksperymentow by doskonalic swoja wiedze. NIe robisz przeciez aktywnego reaktora jadrowego. Nie rozwalisz pol swiata:

  1. $zmienna ="Ala ma kota z apostrofem'";
  2. echo "$zm";
  3. echo $zm;
  4. echo '$zm';
Misza71
Dobra pomieszało mi się jej na odwrót blink.gif Jest jakaś zasada kiedy używać cudzysłowów a kiedy nie? W sensie zmienna zapisana normalnie daje ten sam efekt. Wiem że gdy pisałem różne instrukcje np SELECT bazie musiałem operować na cudzysłowiach i
nospor
Cudzyslow uzywasz z grubsza gdy masz dlugi tekst do ktorego wkladasz zmienna a jestes na tyle leniwy ze nie chce ci sie laczyc tekstow np:

  1.  
  2. $zm ='blabla';
  3. echo "Wersja $zm dla leniwych";
  4. echo 'Wersja ' . $zm .' dla laczycych teksty';

Oczywiscie zartuje z ta wersja dla "leniwych" wink.gif
Misza71
Dobra na teraz już sobie odpuszczam. Kurczę nie wiem nawet jak mam Ci podziękować bo pisanie tego po raz 10 to już trochę cringe. Mam nadzieję ża nauka będzie owocna bo chciałbym sie po tym projekcie postarać gdzieś o praktyki

Lewniwi obracją świat arrowheadsmiley.png
nospor
Swoja droga w ostatnim kodzie co pokazales, bez sensu w oogle ze wchodziles w php. Skoro wiekszosc kodu to html to powinno to wygladac tak:

  1. <table>
  2. <thead>
  3. <tr>
  4. <th>Tytuł</th> <th>Opis</th> <th>Priorytet</th><th>Kategoria</th><th>Platnosc</th>
  5. </tr>
  6. </thead>
  7. <tbody>
  8. <tr>
  9.  
  10.  
  11.  
  12. <td><a href=editTitle.php?id=<?= $comic_id ?>>
  13. <?= $editTitle?></a></td>
  14. <td><a href="#"> OpisKtoregoNIEma</td>
  15.  
  16. <td><a href=editPriory.php?id=<?= $comic_id?>>
  17. <?= $editPriority?></td>
  18.  
  19.  
  20. <td><a href=editCategory.php?id=<?= $comic_id?>>"
  21. <?= $editCategory?></td>
  22. <td><a href=editPayment.php?id=<?= $comic_id?>>"
  23. <?= $editPayment?></td>
  24. </tr>
  25.  
  26. </tr>
  27. </tbody>
Misza71
Okey zmienię dzieki.
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.