Bindowanie danych OOP PHP

2015-08-20 18:41:05 Post #1 gość_Oct1

 
Napisałem taki kod:
$query = $this->_dbHandler->prepare("INSERT INTO (`nick`, `date`, `topic`, `news`) VALUES (:nick, :add_date, :topic, :news");
$query->bindValue(":nick", $nick, PDO:ARAM_STR);
$query->bindValue(":add_date", $add_date, PDO:ARAM_INT);
$query->bindValue(":topic", $topic, PDO:ARAM_STR);
$query->bindValue(":news", $news, PDO:ARAM_STR);
var_dump($query);
if (!$query){
	print 'error';
	}else{
	echo 'Youe news will be added!';
}


Jednakże nie dodaje się rekord do bazy danych. Oto co jest zwracane przez var_dump():

object(PDOStatement)#6 (1) { ["queryString"]=> string(85) "INSERT INTO (`nick`, `date`, `topic`, `news`) VALUES (:nick, :add_date, :topic, :news" } Youe news will be added!


Dlaczego tak się dzieje?

2015-08-20 18:54:09 Post #2 nospor

 
Nigdzie nie wykonujesz zapytania wiec sie nie wykonuje... dosc logiczne
Zapomniales o execute()

http://uk1.php.net/manual/en/pdostatement.execute.php

2015-08-20 19:04:09 Post #3 nospor

 
Inna sprawa ze masz blad zapytania. INSERT INTO wymaga podania nazwy tabeli. Chyba nie oczekujesz, ze baza sama zgadnie do jakiej tabeli chcesz wlozyc dane?

2015-08-20 21:50:57 Post #4 gość_Oct1

 
No tak, nie zauważyłem tego. Jednakże mimo użycia obiektu execute(), nie pojawia się nic nowego:

$query = $this->_dbHandler->prepare("INSERT INTO `news` (`nick`, `date`, `topic`, `news`) VALUES (:nick, :add_date, :topic, :news");
$query->bindValue(":nick", $nick, PDO:ARAM_STR);
$query->bindValue(":add_date", $add_date, PDO:ARAM_INT);
$query->bindValue(":topic", $topic, PDO:ARAM_STR);
$query->bindValue(":news", $news, PDO:ARAM_STR);
$query->execute();
var_dump($query);
if (!$query){
	print 'error';
	}else{
	echo 'Youe news will be added!';
}


PS. Mam włączone raportowanie błędów. Nadal nie dodaje się rekord do bazy, nawet pusty, nic. A wartość zwrócona z var_dump() jest taka sama jak w poście wyżej. Czemu nic się nie dzieje?

2015-08-20 21:57:52 Post #5 nospor

 
Jak sie nie powiedzie to obiekt PDO ma info o bledzie. error cos tam. Sprawdz w manualu, wyswietl to sobie a zobaczysz czemu sie nie powiodlo.

2015-08-20 22:07:57 Post #6 gość_Oct1

 
Ok. Dzięki za podpowiedź. Zwróciłem sobie błąd obiektem errorInfo(); i ku mojemu zdziwieniu otrzymuję coś takiego:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


print_r($query->errorInfo());


A przecież zapytanie jest poprawne. No chyba, że coś nie tak robię:

$query = $this->_dbHandler->prepare("INSERT INTO `news` (`nick`, `date`, `topic`, `news`) VALUES (:nick, :add_date, :topic, :news");[

2015-08-20 22:14:47 Post #7 nospor

 
Nie zamknales nawiasu dla VALUES

2015-08-20 22:22:07 Post #8 gość_Oct1

 
Ajć! Jak to mówią: "Jaki fail...". Dobra, dzięki za podpowiedź. Swoją drogą. Jak można tego nie zauważyć?

2015-08-20 22:23:16 Post #9 nospor

 
Slepniesz na starosc i tyle

2015-08-20 22:31:58 Post #10 gość_Oct1

 
Czy mógłbyś rzucić okiem jeszcze na całość mojej klasy? Czy dobrze jest napisane, ewentualnie co poprawić?

public function AddNews(){
	if (isset($_POST['submit_news'])) {
		$topic = isset($_POST['topic']) ? $_POST['topic'] : false;
		$news = isset($_POST['news']) ? $_POST['news'] : false;
		$add_date = date('Y-m-d H:i:s');
		$ip = $_SERVER['REMOTE_ADDR'];
		$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
		$nick = 'nick'; //na razie bez sesji
		$query = $this->_dbHandler->prepare("INSERT INTO `news` (`nick`, `date`, `topic`, `news`) VALUES (:nick, :add_date, :topic, :news)");
		$query->bindValue(":nick", $nick, PDO:ARAM_STR);
		$query->bindValue(":add_date", $add_date, PDO:ARAM_INT);
		$query->bindValue(":topic", $topic, PDO:ARAM_STR);
		$query->bindValue(":news", $news, PDO:ARAM_STR);
		if (!$query){
			print_r($query->errorInfo());
			}else{
			print 'Youe news will be added!';
		}
		return $query->execute();
	}
}

2015-08-20 22:36:49 Post #11 nospor

 
1) Jak moge ocenic calosc klasy kiedy pokazujesz mi tylko jedna metode...

2) if (!$query){
print_r($query->errorInfo());
}else{
print 'Youe news will be added!';
}

To jest bez sensu. $query na tym etapie zawsze jest prawdziwe

3) $topic = isset($_POST['topic']) ? $_POST['topic'] : false;
to tez jest bez sensu... false bedziesz do bazy wkladal?

4) Poza tym metoda ma AddNews ma wkladac rekord do bazy na podstawie przekazanych jej parametrow a nie ona sama szuka ich w POST.

2015-08-21 00:33:53 Post #12 gość_Oct1

 
Chodziło mi o ocenę metody, źle się wyraziłem. Jeszcze mylę niektóre pojęcia z programowania obiektowego. Cóż, najpierw napiszę a potem pomyślę, tak bywa ale do rzeczy.

Mam rozumieć, że jeśli $query jest zawsze prawdziwe to powinienem zrezygnować z tej instrukcji warunkowej i wstawić
print_r($query->errorInfo());
po bindowaniu danych a przed ich zwracaniem?

Druga sprawa:

$topic = isset($_POST['topic']) ? $_POST['topic'] : $_POST['topic'];
$news = isset($_POST['news']) ? $_POST['news'] : $_POST['news'];


Czy tak jest dobrze? Jaka to w zasadzie różnica? Jeśli nie wykona się jedna część kodu to druga powinna zwrócić false dlatego też napisałem tak:

$topic = isset($_POST['topic']) ? $_POST['topic'] : false;
$news = isset($_POST['news']) ? $_POST['news'] : false;


Oba te kody mają takie same działanie, nic się nie zmienia, wszystko jest w porzali. Czy mógłbyś mi przybliżyć różnicę w tym konretnym przykładzie, bo nie bardzi rozumiem co masz na myśli.

Co do ostatniego punktu to tego też nie bardzo rozumiem. W jaki sposób można przekazywać takie dane do metody? Może trochę trywialnie to zabrzmi ale dlaczego tak jest źle skoro działa notabene działa poprawnie? Twoje uwagi są jak najbardziej trafne lecz chciałbym abyś je nieco rozwinął.

2015-08-21 00:56:52 Post #13 gość_Oct1

 
Jeszcze apropo filtrowania danych z formularza. To czytam teraz książkę Hassina Haydera pt. "Programowanie obiektowe w PHP5 i przedstawia on tam inny sposób na filtrowanie danych. Chciałbym się zapytać czy tak jest poprawnie do dziś:
Kod:

$user_input = $_POST['field']; 
$filtered_content = filter($user_input);

2015-08-21 07:00:45 Post #14 nospor

 
$query->errorInfo masz wyswietlac gdy execute() zwroci false

$topic = isset($_POST['topic']) ? $_POST['topic'] : $_POST['topic'];
Jeszzcze wieksza bzdura.... Jak jest topic to pobierz topic a jak nie ma topic to tez pobierz topic....

Jak nie ma topic, to reszta kodu ma sie nie wykonac, bo przeciez nie ma topic, no nie? Wiec albo reszta kodu ma byc w IF albo masz rzuci wyjatek albo masz dac return false.

Jak przekazac dane do metody? Normalnie, jako parametry funkcji
public function blabla(parametr1, parametr2)


Uzywasz bindowania a to zalatwia wszystko i nie musisz zabezpieczac danych przed wlozeniem do bazy. No chyba ze chcesz cos konkretnego filtrowac to kto ci broni

2015-08-21 12:58:39 Post #15 gość_Oct1

 
Nadal nie rozumiem jak to mam zrobić. Najpierw piszesz, czy chcę dodawać false do bazy a potem, żeby zwracać.
Nie wiem czy to dobrze rozumuję, miło by było gdybyś przedstawił swój punkt widzenia.

Ja to rozumiem tak:
$topic = isset($_POST['topic']) ? $_POST['topic'] : false;


gdy jest spełniony warunek isset($_POST['topot']) to wyślij POSTem dane a jak nie to zwróć false. Tak zresztą kiedyś mi doradzono korzystać na forum.php.pl

Przedstawiam całą klasę, rzuć proszę okiem.
http://pastebin.com/bAAL3M1B

Dlaczego var_dump($this->topic); zwraca mi NULL? Próbuję zrozumieć przekazywanie parametrów. Co możesz na ten temat powiedzieć? Czy pozostałe elementy, na które zwróciłeś mi uwagę są poprawne?

2015-08-21 14:53:48 Post #16 nospor

 
gdy jest spełniony warunek isset($_POST['topot'] to wyślij POSTem dane a jak nie to zwróć false.

No wlasnie, masz zwrocic false, a ty nigdzie nie zwracasz false....
Gdy danych nie ma to masz zrobic
return false; // TO JEST ZWROCENIE FALSE.

A niby czemu to
var_dump($this->topic);
ma ci nie zwrocic null? Nigdzie nie ustawiasz $this->topic to nic nie zawiera - logiczne.

2015-08-21 15:01:30 Post #17 gość_Oct1

 
Tak?
public function filterTopic(){
	$this->topic = $topic = isset($_POST['topic']) ? $_POST['topic'] : false;
	$this->news = $news = isset($_POST['news']) ? $_POST['news'] : false;
	return $this->topic.''.$this->news;
}

Tak?
public function filterTopic(){
	$this->topic = $topic = isset($_POST['topic']) ? $_POST['topic'] : false;
	$this->news = $news = isset($_POST['news']) ? $_POST['news'] : false;
	return false;
}


Możesz to poprawić?
Co do $this->topic, to ustawiam tak:

$query->bindValue(":topic", $this->topic, PDO:ARAM_STR);

2015-08-21 16:26:13 Post #18 nospor

 
$query->bindValue(":topic", $this->topic, PDO:ARAM_STR);
To nie jest przypisane $this->topic.... to jest pobranie $this->topic....


Tak ma byc, nie wiem po co zes rozdzielil przypisanie do topic i news... to mialo byc w tej samej funkcji przekazanie parametrow

<?php
  public function AddNews($topic, $news){


                $add_date = date('Y-m-d H:i:s');

                        $ip = $_SERVER['REMOTE_ADDR'];

                        $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);

                        $nick = 'admin';

                $query = $this->_dbHandler->prepare("INSERT INTO `news` (`nick`, `date`, `topic`, `news`) VALUES (:nick, :add_date, :topic, :news)");

                $query->bindValue(":nick", $nick, PDO:ARAM_STR);

                        $query->bindValue(":add_date", $add_date, PDO:ARAM_INT);

                        $query->bindValue(":topic", $topic, PDO:ARAM_STR);

                        $query->bindValue(":news", $news, PDO:ARAM_STR);


            if($query->execute() == false){

                print_r($query->errorInfo());
return false;

            }else{

               // print 'Your news will be added!'; - TEGO MA NIE BYC. Funkcja dodajaca newsy nie jest od wyswietlania informacji na ekran.
return true;
            }


    }
?>

2015-08-21 16:27:08 Post #19 nospor

 
I wywolanie

$ins->AddNews('topic','news');
oczywiscie za 'topic' i 'news' masz podstawic dane z forma

2015-08-21 17:21:46 Post #20 gość_Oct1

 
A co mam podstawić za:

$ins->AddNews('topic','news');


i w, którym miejscu do dodać?
Widzę, że pozbyłeś się isset, zatem ja je dodałem w części pod formularzem. W którym miejscu dodawać komunikaty?

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Add news - CMS</title>
		<style>
		a { color: #000; text-decoration:none; }
		a:hover { color: #40b000; }
		nav { text-align:center; width: 50%; }
		nav li { display: inline; list-style-type:none; }
		textarea { width: 250px; height: 150px; }
		.name { font-size: 1.250em; text-align: center; }
		.content { text-align:center; margin: 120px; }

		</style>
	</head>

	<body>
		<div class="name">
			<p>Content management system</p>
		</div>
		<nav>
			<ul>
				<li><a href="page">Home page</a></li>
				<li><a href="add_news">Add news</a></li>
			</ul>
		</nav>
		<div class="content">
			<form action="add_news" method="post">
				<p>Enter your news topic:</p>
					<input type="text" name="topic" placeholder="topic"/>
				<p>Enter your news</p>
					<textarea type="text" name="news" placeholder="news"></textarea>
				<p><button type="submit" name="submit_news">Add news</button></p>
			</form>
		</div>
		<?php
			require_once 'sql_database.class.php';
			require_once 'add_news.class.php';
			if(isset($_POST['submit_news'])){
				$dbObject = new SqlDatabase();
				$ins = new ValidateUrl($dbObject->getInstance());
				$ins->filterTopic();
				$ins->validateInput();
				$ins->addNews('topic', 'news'); 
			}
		?>
	</body>
</html>


A co z kwestią filtracji danych z formularza?
[php
public function filterTopic(){
$this->topic = $topic = isset($_POST['topic']) ? $_POST['topic'] : false;
$this->news = $news = isset($_POST['news']) ? $_POST['news'] : false;
return false;
}
[/php]

Odpowiedz

1 2 >

Ostatnio komentowane

  1. Pager 2.5.1 oraz EPa... Na szybko2
  2. Pager 2.5.1 oraz EPa... Sławek
  3. Mysql - FAQ Piotr
  4. Liczba dni roboczych Na szybko2
  5. Liczba dni roboczych Naszybko
  6. Klasa widoku nospor
  7. Klasa widoku freebox

Ostatnio na forum

  1. PHP Developer / Prog... MaxieHill
  2. programista php-webm... pracamatysart
  3. Programista PHP/ Mag... Create Magento 2 Marketplace
  4. Baza Danych gosc
  5. Baza Danych YankeS
  6. Baza Danych gosc
  7. Baza Danych YankeS

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer