PDO Votesystem | Problem : Fatal error: Uncaught exception 'PDOException' with...

Bobo2040

Mitglied
Hi :D
Ich versuche mich gerade nen bisschen mit PDO und OOP rum nur bin ich jetzt auf
ein Problem gestoßen und zwar:
Code:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in C:\xampp\htdocs\OOPLike\lib2.php:89 Stack trace: #0 C:\xampp\htdocs\OOPLike\lib2.php(89): PDOStatement->execute() #1 C:\xampp\htdocs\OOPLike\lib2.php(70): Vote->GetStatus('22', '11') #2 C:\xampp\htdocs\OOPLike\index.php(8): Vote->GetVars() #3 {main} thrown in C:\xampp\htdocs\OOPLike\lib2.php on line 89
Bekomme ich diesen Fehler.. ich weiß nicht warum die Datenbank und Tabelle existiert und es befinden sich auch Datensätze darin..
Mein Script sieht bis jetzt so aus...
PHP:
<?php

//include('connection.php');

class Vote {
	
	private $db;
	
	
	public function __construct() {
		$pass = "";
		$user = "root";
		try {
		
			$this->db = new PDO('mysql:localhost; dbname=votes;',$user,$pass);
			$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	
		} catch(PDOException $e) {
			
			echo 'ERROR: ' . $e->getMessage();
		
		}
		
	}
	
	public function GetVars() {
	
		$err = 0;
		$intErr = 0;
		
		if(isset($_GET['uID'])) {
			
			$uID = $_GET['uID'];
			
		}else{
			
			echo "UserID was not declared";
			$err++;
			
		}
		
		if(isset($_GET['pID'])) {
		
			$pID = $_GET['pID'];
		
		}else{
		
			echo "PostID was not declared";
			$err = $err++;
			
			
		}
		
		if($err == 0) { //Falls kein Fehler aufgetreten ist
			
			if(!is_numeric($_GET['uID'])) {
			
				$intErr++;
			
			}
			
			if(!is_numeric($_GET['pID'])) {
			
				$intErr++;
			
			}
			
			if($intErr == 0) {
			
				$this->GetStatus($uID,$pID);
			
			}else{
			
				echo "The URL Values aren't a Nummer";
			
			}
			
		}
		
	}
	
	public function GetStatus($uID,$pID) {
	
		//Status ermitteln (SELECT)
		$query = "SELECT COUNT(*) FROM votes WHERE userID=:uID AND postID=:pID LIMIT 1";
		$sth = $this->db->prepare($query);
		$sth->bindParam(':uID',$uID,PDO::PARAM_INT);
		$sth->bindParam(':pID',$pID,PDO::PARAM_INT);
		$res = $sth->execute();
		//Überprüfen
		if($res > 0) { // Falls ein Datensatz gefunden wurde...
			//Fetchen
			$row = $res->fetchAll("PDO::FETCH_OBJ");
			//Ergebniss Switchen
			switch($row->status) {
				
				case('0'): //Falls User davor sein Like weggenommen hat
					
					$status = 1; // Status auf 1 Setzen 
				
				break;
				
				case('1'): // Falls User jetzt sein Like wegnehmen will
					
					$status = 0; //Status auf 0 setzen
				
				break;
			
			}
			
			//Status Updaten
			$this->UpdateStatus($uID,$pID,$status);
			
		}else{ // Falls kein Datensatz gefunden wurde...
			
			$this->InsertStatus($uID,$pID);
			
		}
		
		echo "Was Inserted in " . $uID . " and " . $pID . " GetStatus()";
		
	}
	
	public function InsertStatus($uID,$pID) {
		
		//$status braucht nicht erwähnt zu werden, da $status beim "Liken" 
		//immer auf 1 gesetzt wird
		//Neuen Status erstellen
		$query = "INSERT INTO votes (userID,postID,status) VALUES (:uID,:pID,1)";
		$sth = $this->db->prepare($query);
		$sth->bindParam(':uID',$uID,PDO::PARAM_INT);
		$sth->bindParam(':pID',$pID,PDO::PARAM_INT);
		$sth->execute();
		
		$status = 1;
		
		$this->ReturnStatus($uID,$pID,$status);
		echo "Was Inserted in " . $uID . " and " . $pID . " InsertStatus";
	}
	
	public function UpdateStatus($uID,$pID,$status) {
	
		//Status Updaten
		$query = "UPDATE votes SET status=:status WHERE userID=:uID AND postsID=:pID";
		//$query = "UPDATE `votes` SET status= :status WHERE userID= :uID AND postsID= :pID"
		$sth = $this->db->prepare($query);
		$sth->bindParam(':uID',$uID,PDO::PARAM_INT);
		$sth->bindParam(':pID',$pID,PDO::PARAM_INT);
		$sth->bindParam(':status',$status,PDO::PARAM_INT);
		$sth->execute();
		
		$this->ReturnStatus($uID,$pID,$status);
	
	}

	public function ReturnStatus($uID,$pID,$status) {
		//Status (Link) zurückgeben
		if($status >= 0) {
		
			switch($status) {
				
				case('0'):
					
					echo "<a href=\"index.php?uID=" . $uID . "&pID=" . $pID . "\">Like</a>";
				
				break;
				
				case('1'):
				
					echo "<a href=\"index.php?uID=" . $uID . "&pID=" . $pID . "\">Unlike</a>";
				
				break;
			}	
		
		}else{
		
			//Falls es einen unbekannten Status gibt
			echo "Error";
		
		}
		
	}

}
?>

Mfg

PS: Vorschläge,Wünsche und Kritik zu meinem Code nehme ich gerne an ;)
 
Also da gibts mehrere Sachen die garnicht gehen abgesehen davon dass die Klasse offensichtlich nicht funktioniert :D

1.) Deine Klasse ist eine Gottklasse: Sie erledigt den Verbindungsaufbau zur Datenbank, jegliche weitere Interatkion zu der Ressource, die eigentliche Votinglogik, Ausgabelogik sowie eine relativ ausführliche Fehlerbehandlung.
2.) Deine Methoden haben keinen return-Wert, stattdessen wird alles direkt ausgegeben (siehe 1), Ausgabelogik)

Wie kannst du das ändern?
Die Datenbank sollte eine eigene Klasse sein, die du der Vote-Klasse lediglich übergibst. Das nennt sich Dependency-Injection.
Sollte es zu einem unerwarteten(!) Fehler kommen, der verhindert, dass die Klasse ihre Aufgabe ausführen kann, sollte eine Exception geworfen werden! (Das sind extra "Fehler"-Klassen)
Zu guter letzt würde ich in einer Nicht-View-Klasse kein echo benutzen und auch noch kein HTML darin zusammenmatschen - was hat das mit Voting zu tun? Um dem jeweils ausführenden Code (der die Methode aufruft) eine Rückgabe zu geben, sollte return verwendet werden.
 
Okay :D Das mit der auslagerung der Klasse habe ich jetzt gemacht danke ^^
So nur ich weiß nicht warum wenn ich echo durch return ersetze gibt er mir nichts aus ;(
 
Ja richtig ;)
Aber das ist auch gut so, denn wenn ich deine Klasse verwenden wollen würde, müsste ich sie an mein persönliches HTML anpassen. Oder vielleicht will ich garkeine Rückgabe werte, sondern alles nur in die datenbank schreiben.

Das echo muss dann in dem Aufrufenden Code auftauchen, zB
PHP:
<?php

$vote = new Vote();
echo '<p>'.$vote->GetStatus($uID,$pID).'</p>';
 

Neue Beiträge

Zurück