PDO - nie mogę dodać danych w bazie MySQL

0

Hejka!

Ostatnio dłubałam troszkę w PHP i mam mały problem - nie wiem dlaczego, ale nie mogę dodać wpisu do bazy danych i już naprawdę nie mam pomysłów. Może Wy coś poradzicie? Oto kod:
plik index.php:

<!doctype html>
<html>
	<head>
		<title>Lista zakupów</title>
		
		<meta
			charset = "UTF-8"/>
	<head/>
	
	<body>
		<?php
			require_once "engine.php";
			//lz to obiekt listaZakupow ($uzytkownik, $haslo, $nazwaBazy, $serwer)
			try{
				$lz = new listaZakupow("mysql:host = localhost; dbname = baza","uzytkownik", "haslo");
				echo("Udało się utworzyć obiekt i połączyć się z bazą<br/>");
				
				$lz->dodaj('banany');//testowy zapis
				echo("<br/>Po dodaj<br/>");
			}
			catch (PDOException $e) {
				echo("Error!: " . $e->getMessage() . "<br/>".PHP_EOL);
				die("Błąd przy tworzeniu obiektu<br/>");
			}
		?>
	<body/>
</html>

A oto plik engine.php:

<?php
	class listaZakupow extends PDO{
		//pdo ma własny konstruktor więc nie muszę tworzyć osobnego
		
		function dodaj($nazwa){
			try{
				$zapytanie = "INSERT INTO tabela VALUES(null,:nazwa,'N')";
				$db = $this->prepare($zapytanie);
				echo("Komenda do wyslania: ".$zapytanie."<br/>");
				$db->bindValue(':nazwa', $nazwa, PDO::PARAM_STR);
				$db->execute();
				$db->fetch();

				$db->closeCursor();
			}catch (PDOException $e) {
				echo("Błąd: ".$e->getMessage());
				die("koniec");
			}
		}
		
		function usun($id){
		}
		
		function zmienStan($id){
			
		}
	}
?>
2
  1. Pierwsze pytanie, na które brakuje odpowiedzi w poście: czy pojawia się jakiś błąd?
  2. Sprawdź co zwraca metoda execute.
  3. Metoda fetch nie ma sensu tutaj, bo robisz insert, a nie select.
  4. Czy wartości w zapytaniu są poprawne?
  5. Czy dane przesyłane do constructora są poprawne?
0

Pokaż jeszcze jak masz zdefiniowaną tabele w bazie.

0
serek napisał(a):
  1. Pierwsze pytanie, na które brakuje odpowiedzi w poście: czy pojawia się jakiś błąd?
  2. Sprawdź co zwraca metoda execute.
  3. Metoda fetch nie ma sensu tutaj, bo robisz insert, a nie select.
  4. Czy wartości w zapytaniu są poprawne?
  5. Czy dane przesyłane do constructora są poprawne?
  1. Nie, nie pojawia się żaden błąd. Wrzuciłam również instrukcje echo, aby widzieć która część kodu się wykonuje
  2. Sprawdzę i dam znać
  3. Tak, faktycznie masz rację
  4. Tak, są poprawne, ponieważ sprawdziłam to w konsoli
  5. Tak, ponieważ sprawdziłam, jak program reaguje na wprowadzenie błędnych danych - przy błędnych danych wyrzuca błąd (wyjątkiem jest tutaj podanie błędnej nazwy bazy danych, ale 100 razy się upewniałam i nazwa bazy danych jest poprawna)
Tomek Pycia napisał(a):

Pokaż jeszcze jak masz zdefiniowaną tabele w bazie.
Do stworzenia tabeli użyłam takiej instrukcji:

CREATE TABLE tabela(
ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
TOWAR VARCHAR(255),
STAN ENUM ('T', 'N')
);
2
  1. Nie używaj enumów. Spokojnie możesz użyć bool.
  2. ID nie może być nullem, więc może tu jest problem. Po prostu w zapytaniu zdefiniuj jeszcze kolumny, dla których wysyłasz wartości.
0

OK zmieniłam konstrukcję tabeli - kolumnę STAN zmieniłam z ENUM na BOOLEAN. Nie podaję również ID przy wysyłaniu zapytania MySQL.
@serek nie wiem, czy dobrze sprawdzam co zwraca execute, ale po użyciu kodu

$db->debugDumpParams();

otrzymuję takie coś na wyjściu:

SQL: [52] INSERT INTO tabela(TOWAR, STAN) VALUES(:nazwa,false) Sent SQL: [54] INSERT INTO tabela(TOWAR, STAN) VALUES('banany',false) Params: 1 Key: Name: [6] :nazwa paramno=-1 name=[6] ":nazwa" is_param=1 param_type=2

Niestety wciąż to nie działa (nie pojawia się nic w tabeli MySQL). Dla jasności, przedstawiam aktualny kod:
index.php:

<!doctype html>
<html>
	<head>
		<title>Lista zakupów</title>
		
		<meta
			charset = "UTF-8"/>
	<head/>
	
	<body>
		<?php
			require_once "engine.php";
			//lz to obiekt listaZakupow ($uzytkownik, $haslo, $nazwaBazy, $serwer)
			try{//listaZakupow("mysql:host = localhost; dbname = "nazwa_bazy","nazwa_usera", "haslo");
				$lz = new listaZakupow("mysql:host = localhost; dbname = "nazwa_bazy","nazwa_usera", "haslo");
				echo("Udało się utworzyć obiekt i połączyć się z bazą<br/>");
				
				$lz->dodaj('banany');
				echo("<br/>Po dodaj<br/>");
			}
			catch (PDOException $e) {
				echo("Error!: " . $e->getMessage() . "<br/>".PHP_EOL);
				die("Błąd przy tworzeniu obiektu<br/>");
			}
		?>
	<body/>
</html>

engine.php:

<?php
	class listaZakupow extends PDO{
		//pdo ma własny konstruktor więc nie muszę tworzyć osobnego
		
		function dodaj($nazwa){
			try{
				$zapytanie = "INSERT INTO tabela(TOWAR, STAN) VALUES(:nazwa,false)";
				$db = $this->prepare($zapytanie);
				echo("Komenda do wyslania: ".$zapytanie."<br/>");
				$db->bindValue(':nazwa', $nazwa, PDO::PARAM_STR);
				$db->execute();
				//$db->fetch();
				
				//var_dump ($db);
				//$db->execute();
				$db->debugDumpParams();
				//echo($db->execute());
				$db->closeCursor();
			}catch (PDOException $e) {
				echo("Błąd: ".$e->getMessage());
				die("koniec");
			}
		}
		
		function usun($id){
		}
		
		function zmienStan($id){
			
		}
	}
?>
1

A jak puścisz takie zapytanie na bazie bezpośrednio to coś dostajesz:

INSERT INTO tabela(TOWAR, STAN) VALUES('banany',false) 
0
Tomek Pycia napisał(a):

A jak pościsz takie zapytanie na bazie bezpośrednio to coś dostajesz:

INSERT INTO tabela(TOWAR, STAN) VALUES('banany',false) 

Próbowałam już tak ręcznie puszczać to w konsoli. Oczywiście wtedy wiersz jest poprawnie dodawany do tabeli.

3

Słuchajcie, już mam. Dodałam taki zapis do funkcji dodaj() w pliku engine.php, zaraz po zdefiniowaniu zapytania:

$this->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

I otrzymałam komunikat:

SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected

Czujecie bluesa? Okazało się, że w zapisie

$lz = new listaZakupow("mysql:host = localhost; dbname = "nazwa_bazy","nazwa_usera", "haslo");

przeszkadzały spacje przy namiarach na hosta i nazwę bazy przez co PDO nie wiedział o jaką bazę chodzi. Więc poprawny zapis powinien wyglądać tak:

$lz = new listaZakupow("mysql:host=localhost;dbname="nazwa_bazy","nazwa_usera", "haslo");

Dzięki za wszystko :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1