No database selected ohne Fehler in der Select-DB-Anweisung

fbfeix

Erfahrenes Mitglied
Hallo Community:

Ich hab folgendes eigentlich funktionierendes (es wirft zumindest keine Fehler) Script, das einen Nutzer in einer Datenbank speichert.

Die Fehlerstelle habe ich kommentiert. Als mysql_error gibt er mir aus: No database selected

Kann mir da jemand helfen? Hock da jetzt seit 2 Stunden davor und finde nichts. Vielleicht entdeckt ja einer von euch etwas.

PHP:
	public function Register($name,  $password, $email, $land, $nickname = NULL, $surname = NULL)
	{
		if($name != NULL && $password != NULL && $email != NULL && $land != NULL &&
		   $name != "" && $password != "" && $email != "" && $land != "")
		{
		
			$email = htmlspecialchars($email);
			$password = htmlspecialchars($password);
			$name = htmlspecialchars($name);
			$land = htmlspecialchars($land);
			
			echo username;
			
			$con = mysql_connect(localhost, username, password) or die("Fehler:".mysql_error());
			if( !$con )
			{
				return "Leider ist ein Fehler in unserer Datenbank aufgetreten.
						Probier es später bitte nochmal.";
			}
			
			$select = mysql_select_db('meinegeheimeDatenbank', $con) or die("Fehler:".mysql_error());
			if( !$select )
			{
				return "Leider ist ein Fehler in unserer Datenbank aufgetreten.
						Probier es später bitte nochmal.";
			}
			
			$emailresult = $this->CheckPrimaryRegisterElements($email);
			if ($emailresult)
			{	//registrieren		
				$sql = "";
				if($nickname != NULL && $nickname != "" && $surname != NULL && $surname != "")
				{
					$nickname = htmlspecialchars($nickname);
					$surname = htmlspecialchars($surname);
					$sql = "INSERT INTO user (user_nickname, user_name, user_surname, user_password,
							user_email, user_land) VALUES ('".$nickname."', '".$name."', '".$surname."', 
							'".$password."', '".$email."', '".$land."')";
				}
				else if($nickname != NULL && $nickname != "")
				{
					$nickname = htmlspecialchars($nickname);
			
					$sql = "INSERT INTO user (user_nickname, user_name, user_password,
							user_email, user_land) VALUES ('".$nickname."', '".$name."', 
							'".$password."', '".$email."', '".$land."')";
				}
				else if($surname != NULL && $surname != "")
				{
					$surname = htmlspecialchars($surname);
					
					$sql = "INSERT INTO user (user_name, user_surname, user_password,
							user_email, user_land) VALUES ('".$name."', '".$surname."', 
							'".$password."', '".$email."', '".$land."')";
				}
				else
				{
					$sql = "INSERT INTO user (user_name, user_password,
							user_email, user_land) VALUES ('".$name."', 
							'".$password."', '".$email."', '".$land."')";
				}
				
				
				$result = mysql_query($sql);
				if ( !$result )
				{
					$output = "Leider ist ein Fehler in unserer Datenbank aufgetreten.
							Probier es später bitte nochmal.";
							var_dump($select);
							echo "Fehler:".mysql_error();   //diesen Error spuckt er mir (habe ich nachträglich eingebaut um zu sehen wo das Problem liegt)
				}
				else
				{
					
					$output = true;
				}
				$linkid = mysql_insert_id();
				if($this->RegisterObject("User", $linkid))
				{
					return true;
				}
			}
			else
			{ //registrieren nicht möglich
				$output = $emailresult;
			}
			
			mysql_close( $con );
			
			return $output;
		}
		else
		{
			return "Sie müssen alle Werte angeben";
		}
	}
 
Sind username und password Konstanten? Ansonsten fehlt das $-Zeichen davor. Schreibe zu Debuggingzwecken auch mal ein
PHP:
error_reporting(E_ALL);
an den Anfang deines Scriptes.
Versuche sonst mal ein mysql_query($sql, $con);


Und noch als Tipp:
Führe die Überprüfung auf gültige Werte (inklusive der Nutzernamen etc) am ANFANG der Funktion durch, damit sparst du dir unnötige Performance wie Datenbankverbindungen wenn du sie am Ende gar nicht benötigst.
 
hab ich grad mal gemacht. und ja das sind konstanten. Einmal extern deklariert und dan per require eingebunden.

Den Tipp werde ich später noch beherzigen.

Die Situation sieht jetzt so aus:
In der Zeile des mysql_close() gibt er mir diese Warnung aus: Warning: mysql_close(): 6 is not a valid MySQL-Link
Mehr spuckt er nicht aus.
 
Ich habe mir mal die Mühe gemacht und deinen Quelltext etwas aufgeräumt. Vielleicht funktioniert er jetzt so besser.
PHP:
public function Register($name, $password, $email, $land, $nickname = null, $surname = null) { 
  if(empty($name) || empty($password) || empty($email) || empty($land)) {
    trigger_error('Sie müssen alle Werte angegeben', E_USER_WARNING);
    return false;
  }
  
  $email    = htmlspecialchars($email);
  $password = htmlspecialchars($password);
  $name     = htmlspecialchars($name);
  $land     = htmlspecialchars($land);
  
  echo username;
  if(($connection = mysql_connect(localhost, username, password)) === false) {
    trigger_error('Fehler: ' . mysql_error(), E_USER_WARNING);
    return false;
  }
  
  if(mysql_select_db('meinegeheimeDatenbank', $connection) === false) {
    mysql_close($connection);
    trigger_error('Fehler: ' . mysql_error(), E_USER_WARNING);
    return false;
  }
  
  $emailresult = $this->CheckPrimaryRegisterElements($email);
  if(!$emailresult) {
    mysql_close($connection);
    return $emailresult;
  }
  
  $check  = 0;
  $check += ((int) empty($surname))  * 1;
  $check += ((int) empty($nickname)) * 2;
  
  # surname und nickname gesetzt
  if($check === 3) {
    $nickname = htmlspecialchars($nickname);
    $surname  = htmlspecialchars($surname);
    $sql      = 'INSERT INTO user (
                  user_nickname,
                  user_name,
                  user_surname,
                  user_password, 
                  user_email,
                  user_land
                ) VALUES (
                  "' . $nickname . '",
                  "' . $name     . '",
                  "' . $surname  . '",
                  "' . $password . '",
                  "' . $email    . '",
                  "' . $land     . '"
                )';
  # nur nickname gesetzt
  } elseif($check === 2) {
    $nickname = htmlspecialchars($nickname);
    
    $sql = 'INSERT INTO user (
              user_nickname,
              user_name,
              user_password,
              user_email,
              user_land
            ) VALUES (
              "' . $nickname . '",
              "' . $name     . '",
              "' . $password . '",
              "' . $email    . '",
              "' . $land     . '"
            )';
  # nur surname gesetzt
  } elseif($check === 1) {
    $surname = htmlspecialchars($surname);
    
    $sql = 'INSERT INTO user (
              user_name,
              user_surname,
              user_password,
              user_email,
              user_land
            ) VALUES (
              "' . $name     . '",
              "' . $surname  . '",
              "' . $password . '",
              "' . $email    . '",
              "' . $land     . '"
            )';
  # weder surname noch nickname gesetzt
  } else {
    $sql = 'INSERT INTO user (
              user_name,
              user_password,
              user_email,
              user_land
            ) VALUES (
              "' . $name     . '",
              "' . $password . '",
              "' . $email    . '",
              "' . $land     . '"
            )';
  }
  
  if(($result = mysql_query($sql)) == false) {
    mysql_close($connection);
    trigger_error('Leider ist ein Fehler in unserer Datenbank aufgetreten. Probier es später bitte nochmal.', E_USER_WARNING);
    return false;
  } else {
    $this->RegisterObject('User', mysql_insert_id());
    mysql_close($connection);
    return true;
  }
}
 
Zuletzt bearbeitet:
Sorry, aber soviel sich wiederholender Code
PHP:
  # surname und nickname gesetzt
  if($check === 3) {
    $nickname = htmlspecialchars($nickname);
    $surname  = htmlspecialchars($surname);
    $sql      = 'INSERT INTO user (
                  user_nickname,
                  user_name,
                  user_surname,
                  user_password, 
                  user_email,
                  user_land
                ) VALUES (
                  "' . $nickname . '",
                  "' . $name     . '",
                  "' . $surname  . '",
                  "' . $password . '",
                  "' . $email    . '",
                  "' . $land     . '"
                )';
  # nur nickname gesetzt
  } elseif($check === 2) {
    $nickname = htmlspecialchars($nickname);
    
    $sql = 'INSERT INTO user (
              user_nickname,
              user_name,
              user_password,
              user_email,
              user_land
            ) VALUES (
              "' . $nickname . '",
              "' . $name     . '",
              "' . $password . '",
              "' . $email    . '",
              "' . $land     . '"
            )';
  # nur surname gesetzt
  } elseif($check === 1) {
    $surname = htmlspecialchars($surname);
    
    $sql = 'INSERT INTO user (
              user_name,
              user_surname,
              user_password,
              user_email,
              user_land
            ) VALUES (
              "' . $name     . '",
              "' . $surname  . '",
              "' . $password . '",
              "' . $email    . '",
              "' . $land     . '"
            )';
  # weder surname noch nickname gesetzt
  } else {
    $sql = 'INSERT INTO user (
              user_name,
              user_password,
              user_email,
              user_land
            ) VALUES (
              "' . $name     . '",
              "' . $password . '",
              "' . $email    . '",
              "' . $land     . '"
            )';
  }
Das führt zu Chaos.
Nutzen wir 2 Sachen.
1) Wenn kein Wert gesetzt ist, können wir im INSERT den Wert NULL übergeben.
2) Da wir nur auf 1=surname und 2=nickname testen müssen, können wir das ganze Auswahlverfahren Streichen und mit einem einfachen Bit-Vergleich arbeiten.
Siehe dazu auch PHP Byte Berechtigung

Und so sieht dasselbe gekürzt aus
PHP:
	define('C_SURNAME',    1);
	define('C_NICKNAME',   2);

	//Mit einem Bitvergleich prüfen ob der Wert vorhanden ist oder wir NULL übergeben
	//Wenn ein Wert vorhanden ist, bereits in Anführungszeichen setzen
	$surname= ($check & C_SURNAME === 0) ? '"' . htmlspecialchars($surname) . '"' : 'NULL';
	$nickname = ($check & C_NICKNAME === 0) ? '"' . htmlspecialchars($nickname) . '"' : 'NULL';

	$sql      = "INSERT INTO user (
                  user_nickname,
                  user_name,
                  user_surname,
                  user_password, 
                  user_email,
                  user_land
                ) VALUES (
                  {$nickname},
                  '{$name}',
                  {$surname},
                  '{$password}',
                  '{$email}',
                  '{$land}'
                )";
 
Zuletzt bearbeitet:
Danke leute.
Habe in letzter Zeit nie zeit gefunden, werds mir aber heute anschauen.
Ich melde mich dann nochmal.
 
Zurück