Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Brak zapisu do bazy
lustfingers
post
Post #1





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

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


Witam, mam 3 pliki a.php, b.php i c.php

Plik a.php ma formularz z action do pliku b.php gdzie najpierw chce uzyskać zapis do bazy oraz następnie użyć tych samych danych do kolejnego formularza który jest w pliku b.php dane sie ładnie przesyłają z pliku a.php do b.php tylko nie następuje zapis.

Kod zapisu z pliku b.php

  1. <?php
  2. ini_set('display_errors', '1');
  3. try
  4. {
  5. $pdo = new PDO('mysql:host=localhost;dbname=somename', 'someuser', 'somepass');
  6. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. $pdo->exec('SET NAMES "utf8"');
  8. }
  9. catch (PDOException $e)
  10. {
  11. $error = 'Nie można nawiązać połączenia z serwerem bazy danych.';
  12. include 'error.html.php';
  13. exit();
  14. }
  15.  
  16. if (isset($_POST['number']) OR isset($_POST['name']) OR isset($_POST['purpose']) OR isset($_POST['clientname']) OR isset($_POST['weight']) OR isset($_POST['datefrom']) OR isset($_POST['dateto']))
  17. {
  18. try
  19. {
  20. echo $_POST['date'];
  21. $sql = 'CREATE TABLE IF NOT EXISTS `table1` (
  22. `id_receipts` INT NOT NULL AUTO_INCREMENT,
  23. `number` TEXT,
  24. `name` TEXT,
  25. `purpose` TEXT,
  26. `clientname` TEXT,
  27. `weight` float,
  28. `datefrom` DATE,
  29. `dateto` DATE,
  30. `date` DATE
  31. )';
  32. $sql .= 'INSERT INTO `table1` SET
  33. number = '.$_POST['number'].',
  34. name = '.$_POST['name'].',
  35. purpose = '.$_POST['purpose'].',
  36. clientname = '.$_POST['clientname'].',
  37. weight = '.$_POST['weight'].',
  38. datefrom = '.$_POST['datefrom'].',
  39. dateto = '.$_POST['dateto'].',
  40. date = '.$_POST['date'].'';
  41. $s = $pdo->prepare($sql);
  42. $s->execute();
  43. }
  44. catch (PDOException $e)
  45. {
  46. $error = 'Błąd przy zapisie: ' . $e->getMessage();
  47. include 'error.html.php';
  48. exit();
  49. }
  50.  
  51. header('Location: .');
  52. exit();
  53. }
  54.  
  55. ?>


W pliku b.php poniżej tego kodu jest kolejny formularz z action do pliku c.php natomiast po przejściu z a.php do b.php jest biała strona bez żadnego komunikatu błędu.
Go to the top of the page
+Quote Post
viking
post
Post #2





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

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


Biała strona oznacza błąd 500. Sprawdź logi serwera.


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





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

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


Logi są puste.
Go to the top of the page
+Quote Post
SwiezuPL
post
Post #4





Grupa: Zarejestrowani
Postów: 38
Pomógł: 9
Dołączył: 16.11.2014
Skąd: Warszawa

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


http://stackoverflow.com/questions/8645889...one-auto-column
+ sprawdź czy wszystkie dane z formularza trafiają

Ten post edytował SwiezuPL 25.02.2017, 12:51:49
Go to the top of the page
+Quote Post
Pyton_000
post
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Po zapytaniu create nie masz ;.
Go to the top of the page
+Quote Post
lustfingers
post
Post #6





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

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


Pyton_000 być może nie widzę tego, być może źle rozumie, ale nawet gdy zamienię to:

  1. $sql = 'CREATE TABLE IF NOT EXISTS `table1` (
  2. `id_receipts` INT NOT NULL AUTO_INCREMENT,
  3. `number` TEXT,
  4. `name` TEXT,
  5. `purpose` TEXT,
  6. `clientname` TEXT,
  7. `weight` float,
  8. `datefrom` DATE,
  9. `dateto` DATE,
  10. `date` DATE
  11. )';
  12. $sql .= 'INSERT INTO `table1` SET
  13. number = '.$_POST['number'].',
  14. name = '.$_POST['name'].',
  15. purpose = '.$_POST['purpose'].',
  16. clientname = '.$_POST['clientname'].',
  17. weight = '.$_POST['weight'].',
  18. datefrom = '.$_POST['datefrom'].',
  19. dateto = '.$_POST['dateto'].',
  20. date = '.$_POST['date'].'';


na to:

  1. $sql = 'CREATE TABLE IF NOT EXISTS `table1` (
  2. `id_receipts` INT NOT NULL AUTO_INCREMENT,
  3. `number` TEXT,
  4. `name` TEXT,
  5. `purpose` TEXT,
  6. `clientname` TEXT,
  7. `weight` float,
  8. `datefrom` DATE,
  9. `dateto` DATE,
  10. `date` DATE
  11. );
  12. INSERT INTO `table1` SET
  13. number = '.$_POST['number'].',
  14. name = '.$_POST['name'].',
  15. purpose = '.$_POST['purpose'].',
  16. clientname = '.$_POST['clientname'].',
  17. weight = '.$_POST['weight'].',
  18. datefrom = '.$_POST['datefrom'].',
  19. dateto = '.$_POST['dateto'].',
  20. date = '.$_POST['date'];


To nadal mam białą stronę, chyba że tutaj też mi czegoś brakuje?
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%)
-----


display_errors włącz bezpośrednio w php.ini. I już ci mówiłem. Po co to zapytanie create za każdym razem? Tworzenie wyrzuć raz na zewnątrz i zostaw tylko inserta.


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





Grupa: Zarejestrowani
Postów: 233
Pomógł: 27
Dołączył: 19.10.2014

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


Zrob var_dump na tym zapytaniu sql. Skopiuj to i wklej w phpmyadmin jako zapytanie. Tak najlatwiej sprawdza sie bledy.
Go to the top of the page
+Quote Post
lustfingers
post
Post #9





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

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


@viking - Create jest po to żebym za każdym razem nie musiał tworzyć tej tabeli a przy testach często ją usuwam.
@goartur - dzięki zdaje się że po prostu brakuje primary key.
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%)
-----


Tak czy inaczej błąd powinien zostać wyświetlony zamiast pustej strony.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Brakuje Ci też " dla stringów np:

Kod
name = '.$_POST['name'].',

wyprodukuje Ci
Kod
name = jakasnazwa,

a powinno
Kod
name = "jakasnazwa",
Go to the top of the page
+Quote Post
lustfingers
post
Post #12





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

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


@Pyton_000 tak jeszcze wiele mi brakuje a szczególnie wiedzy biggrin.gif to akurat sam wyłapałem, teraz naczytałem sie wiele wątków i z tego co czytam to mysql_query() jest deprecated więc dla mojego kodu chcąc pobrać jakąś wartość z bazy najlepiej użyć PDO i tu znalazłem problem.

Mając taki kod skopiowany z postu #1 więc pomińmy oczywiste błędy:

  1. <?php
  2. ini_set('display_errors', '1');
  3. try
  4. {
  5. $pdo = new PDO('mysql:host=localhost;dbname=somename', 'someuser', 'somepass');
  6. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. $pdo->exec('SET NAMES "utf8"');
  8. }
  9. catch (PDOException $e)
  10. {
  11. $error = 'Nie można nawiązać połączenia z serwerem bazy danych.';
  12. include 'error.html.php';
  13. exit();
  14. }
  15.  
  16. if (isset($_POST['number']) OR isset($_POST['name']) OR isset($_POST['purpose']) OR isset($_POST['clientname']) OR isset($_POST['weight']) OR isset($_POST['datefrom']) OR isset($_POST['dateto']))
  17. {
  18. try
  19. {
  20. echo $_POST['date'];
  21. $sql = 'CREATE TABLE IF NOT EXISTS `table1` (
  22. `id_receipts` INT NOT NULL AUTO_INCREMENT,
  23. `number` TEXT,
  24. `name` TEXT,
  25. `purpose` TEXT,
  26. `clientname` TEXT,
  27. `weight` float,
  28. `datefrom` DATE,
  29. `dateto` DATE,
  30. `date` DATE
  31. )';
  32. $sql .= 'INSERT INTO `table1` SET
  33. number = '.$_POST['number'].',
  34. name = '.$_POST['name'].',
  35. purpose = '.$_POST['purpose'].',
  36. clientname = '.$_POST['clientname'].',
  37. weight = '.$_POST['weight'].',
  38. datefrom = '.$_POST['datefrom'].',
  39. dateto = '.$_POST['dateto'].',
  40. date = '.$_POST['date'].'';
  41. $s = $pdo->prepare($sql);
  42. $s->execute();
  43. }
  44. catch (PDOException $e)
  45. {
  46. $error = 'Błąd przy zapisie: ' . $e->getMessage();
  47. include 'error.html.php';
  48. exit();
  49. }
  50.  
  51. header('Location: .');
  52. exit();
  53. }
  54.  
  55. ?>


Po wykonaniu zapytania do bazy chcę pobrać ostatnią wartość id_receipts wykonam to zapytaniem SELECT id_receipts FROM table1 ORDER BY id_receipts DESC LIMIT 1

Natomiast gdy chce to zrobić po stronie php to nie mogę po prostu przypisać tego do zmiennej ponieważ zwróci mi string z zapytaniem zamiast wynik zapytania zapewne powinienem użyć PDO::query() ale nie mogę znaleźć przykładu a w manualu nie jest to dla mnie zbyt jasno opisane, korzystam z php 5.5 więc czy to powinno wyglądać tak:

  1. $idselect = "SELECT id_receipts FROM table1 ORDER BY id_receipts DESC LIMIT 1";
  2. $pdo->query($idselect);
  3. var_dump($idselect);


Jeśli to jest poprawne to dlaczego nie działa?

Ten post edytował lustfingers 26.02.2017, 22:05:56
Go to the top of the page
+Quote Post
viking
post
Post #13





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

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


Zacznij lekturę od https://prophp.pl/advice/show/14/jak_czytac...mentacje_php%3F. Później przeczytaj ze stopki o pdo. Ostatnią wartość powinno zwrócić http://php.net/manual/en/pdo.lastinsertid.php. twój cały prepare nie ma sensu bo przed niczym nie zabezpiecza ani nie poprawia nawet czytelności. Dodatkowo mieszasz zapytanie ddl ze zwykłym który rządzi się innymi prawami przy bindowaniu. Query coś zwraca - patrz pierwszy podany link.


--------------------
Go to the top of the page
+Quote Post
lustfingers
post
Post #14





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

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


Gdy umieszczę ten kod w pustym pliku to działa poprawnie:

  1. $sql3 = "SELECT id_receipts FROM table1 ORDER BY id_receipts DESC LIMIT 1";
  2. $sth = $pdo->prepare($sql3);
  3. $sth->execute();
  4. $result = $sth->fetch();
  5. $idreceipt = $result[0];
  6. var_dump($result);


Natomiast jak go umieszczę w kodzie w sekcji try już po zapytaniu to ten kod się nie wykonuje ani żaden inny poniżej czy funkcja execute() kończy działanie skryptu?
Go to the top of the page
+Quote Post
viking
post
Post #15





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

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


Nic nie wstrzymuje. Za to ja nie rozumiem. Dostajesz jakieś błędy wyjątków?


--------------------
Go to the top of the page
+Quote Post
lustfingers
post
Post #16





Grupa: Zarejestrowani
Postów: 99
Pomógł: 5
Dołączył: 18.03.2015

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


Już tłumacze co mam i co chcę osiągnąć oraz dlaczego.

Kod wygląda w skrócie tak:

  1.  
  2. <?php
  3. ini_set('display_errors', '1');
  4. try
  5. {
  6. $pdo = new PDO('mysql:host=localhost;dbname=somename', 'someuser', 'somepass');
  7. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  8. $pdo->exec('SET NAMES "utf8"');
  9. }
  10. catch (PDOException $e)
  11. {
  12. $error = 'Nie można nawiązać połączenia z serwerem bazy danych.';
  13. include 'error.html.php';
  14. exit();
  15. }
  16.  
  17. if (isset($_POST['number']))
  18. {
  19. try
  20. {
  21. echo $_POST['date'];
  22. $sql = 'CREATE TABLE IF NOT EXISTS `table1` (
  23. `id_receipts` INT NOT NULL AUTO_INCREMENT,
  24. `number` TEXT,
  25. )';
  26. $sql .= 'INSERT INTO `table1` SET
  27. number = '.$_POST['number'].';
  28. $s = $pdo->prepare($sql);
  29. $s->execute();
  30. }
  31. catch (PDOException $e)
  32. {
  33. $error = 'Błąd przy zapisie: ' . $e->getMessage();
  34. include 'error.html.php';
  35. exit();
  36. }
  37.  
  38. header('Location: .');
  39. exit();
  40. }
  41.  
  42. if (isset($_POST['othernumber']))
  43. {
  44. try
  45. {
  46. echo $_POST['date'];
  47. $sql2 = 'CREATE TABLE IF NOT EXISTS `table2` (
  48. `id` INT NOT NULL AUTO_INCREMENT,
  49. `othernumber` TEXT,
  50. )';
  51. $sql2 .= 'INSERT INTO `table2` SET
  52. number = '.$_POST['number'].',
  53. id = '.$zmienna_pobierajaca_id;
  54. $s2 = $pdo->prepare($sql2);
  55. $s2->execute();
  56. }
  57. catch (PDOException $e)
  58. {
  59. $error = 'Błąd przy zapisie: ' . $e->getMessage();
  60. include 'error.html.php';
  61. exit();
  62. }
  63.  
  64. header('Location: .');
  65. exit();
  66. }
  67.  
  68. ?>

Teraz do tego kodu przed zapytaniem

  1. INSERT INTO `table2` SET number = '.$_POST['number'].', id = '.$zmienna_pobierajaca_id;


chcę umieścić

  1. sql3 = "SELECT id_receipts FROM table1 ORDER BY id_receipts DESC LIMIT 1";
  2. $sth = $pdo->prepare($sql3);
  3. $sth->execute();
  4. $result = $sth->fetch();
  5. $zmienna_pobierajaca_id = $result[0];


Niestety nie dostaje żadnych błędów tylko biała strona, korzystam z wampa, czasami w jego logach pojawia się błąd:

General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.' in C:\wamp\www\some\c.php:69

Sama zmiana z fetch na fetchAll nic nie daje natomiast linia 69 to jest zapytanie: sql3 = "SELECT id_receipts FROM table1 ORDER BY id_receipts DESC LIMIT 1";

Ten post edytował lustfingers 28.02.2017, 19:11:03
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 - 07:44