Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Brak zapisu do bazy
Forum PHP.pl > Forum > Przedszkole
lustfingers
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.
viking
Biała strona oznacza błąd 500. Sprawdź logi serwera.
lustfingers
Logi są puste.
SwiezuPL
http://stackoverflow.com/questions/8645889...one-auto-column
+ sprawdź czy wszystkie dane z formularza trafiają
Pyton_000
Po zapytaniu create nie masz ;.
lustfingers
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?
viking
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.
goartur
Zrob var_dump na tym zapytaniu sql. Skopiuj to i wklej w phpmyadmin jako zapytanie. Tak najlatwiej sprawdza sie bledy.
lustfingers
@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.
viking
Tak czy inaczej błąd powinien zostać wyświetlony zamiast pustej strony.
Pyton_000
Brakuje Ci też " dla stringów np:

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

wyprodukuje Ci
Kod
name = jakasnazwa,

a powinno
Kod
name = "jakasnazwa",
lustfingers
@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?
viking
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.
lustfingers
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?
viking
Nic nie wstrzymuje. Za to ja nie rozumiem. Dostajesz jakieś błędy wyjątków?
lustfingers
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";
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.