8791 sujets

Développement web côté serveur, CMS

Bonjour, je sollicite votre aide pour une requête avec PDO et MySql en php.

Pour l'installation de mon CMS, je demande de rentrer les informations suivante Smiley decu host, username, password, database) pour ainsi vérifier si la connexion et ok et si la base de donnée existe :

if (!empty($host) && !empty($username) && !empty($database)) {				
	$db = new Connection($host, $database, $username, $password);

	$result = $db->check_database_config();
}
else {
    	$result = DB_UNKNOW_ERROR;
}


Jusque là tout va bien, la requête me renvoie bien une valeur dans $result, si la connexion est OK et que la base de donnée existe alors j'exécute une requête pour créer mes tables, sinon je créer ma base de donnée avec la requête suivante :

try {
	$db->executeQuery('CREATE DATABASE IF NOT EXISTS '.$database.';');
	$result = DB_CONFIG_SUCCESS;
}
catch (Exception $e) {
	print_r($e);
}


Et là c'est le drame voici le message d'erreur que j'obtient et je ne sais pas du tout pourquoi et comment le résoudre :

Fatal error: Call to a member function executeQuery() on a non-object in Y:\WebMastering\Ressources\CMS\Royal-Tracker\1.0_final_files\install\install.php on line 323


Je tient à préciser que la ligne 323 contient le code suivant:
$db->executeQuery('CREATE DATABASE IF NOT EXISTS '.$database.';');


Voici la class de Connection PDO complète :

class Connection extends AbsConnection {

	// private variables -----------------------------------------------------+
	private $connection;
	private $user;
	private $pass;
	private $dsn;
	private $host;
	private $database;

	// function __construct --------------------------------------------------+
	public function __construct($host, $database, $username, $password) {
		$this->dsn = "mysql:host=$host;dbname=$database";
		$this->user = $username;
		$this->pass = $password;
	}

	// function setConnection ------------------------------------------------+
	public function setConnection($db) {
		$this->connection = $db;
	}

	// function getConnection ------------------------------------------------+
	public function getConnection() {
		return $this->connection;
	}
	
	// function check_database_config ----------------------------------------+
	public function check_database_config() {
		try {
			$pdoConnect = new PDO($this->dsn, $this->user, $this->pass);
			
			$this->connection = $pdoConnect;
			
			return DB_CONFIG_SUCCESS;
		}
		catch(PDOException $e) {
		
			if(strstr($e->getMessage(), 'SQLSTATE[')) { 
				preg_match('/SQLSTATE\[(\w+)\] \[(\w+)\] (.*)/', $e->getMessage(), $matches); 

				if ($matches[1] == 42000 & $matches[2] == 1049) {
					return DB_CONFIG_ERROR_DATABASE_NOT_FOUND;
				}
				
				if ($matches[1] == 28000 & $matches[2] == 1045) {
					return DB_CONFIG_ERROR_CONNECTION_TO_DBMS;
				}
			}
		}
	}
	
	// function connect ------------------------------------------------------+
	public function connect() {
		try {
			$pdoConnect = new PDO($this->dsn, $this->user, $this->pass);
			$this->connection = $pdoConnect;
		} catch (PDOException $e) {
			die("Error connecting database: Connection::connect(): ".$e->getMessage());
		}
	}
	
	// function executeDML ---------------------------------------------------+
	public function executeDML($query) {
		if (!$this->getConnection()->query($query)) {
			throw new ErrorConnection($this->getConnection()->errorInfo());
		} else {
			return true;
		}
	}
	
	// function executeQuery -------------------------------------------------+
	public function executeQuery($query) {
		$rs = null;
		if ($stmt = $this->getConnection()->prepare($query)) {
			if ($this->executePreparedStatement($stmt, $rs)) {
				return $rs;
			}
		} else {
			throw new ErrorConnection($this->getConnection()->errorInfo());
		}
	}

	// function executePreparedStatement -------------------------------------+
	private function executePreparedStatement($stmt, & $row = null) {
		$boReturn = false;
		if ($stmt->execute()) {
			if ($row = $stmt->fetchAll()) {
				$boReturn = true;
			} else {
				$boReturn = false;
			}
		} else {
			$boReturn = false;
		}
		return $boReturn;
	}

	// function beginTransaction ---------------------------------------------+
	public function beginTransaction() {
		if (!$this->getConnection()->beginTransaction()) {
			throw new ErrorConnection($this->getConnection()->errorInfo());
		}
	}
	
	// function commit -------------------------------------------------------+
	public function commit() {
		if (!$this->getConnection()->commit()) {
			throw new ErrorConnection($this->getConnection()->errorInfo());
		}
	}
	
	// function rollback -----------------------------------------------------+
	public function rollback() {
		if (!$this->getConnection()->rollback()) {
			throw new ErrorConnection($this->getConnection()->errorInfo());
		}
	}
}
Apparemment quand tu obtiens cette erreur c'est que la variable $db ne correspond pas, au moment de l'exécution de ta ligne de code, à une instance de la classe Connection. Donc le problème est sans doute en amont, dans du code que tu ne nous montre pas: l'étape ou les étapes où tu vérifie que ta connexion existe, la base existe, etc.
Voilà ma condition complète, en premier lieu, je teste la connexion, si j'obtient l'erreur numéro SQLSTATE [42000] [1049] alors je retourne DB_CONFIG_ERROR_DATABASE_NOT_FOUND et donc j'essaye de créer ma base de donnée en suite je passe à la suite en retournant DB_CONFIG_SUCCESS. Si la base de donnée, je passe directement à la suite en retournant : DB_CONFIG_SUCCESS. Ma condition si la base de donnée existe déjà marche parfaitement, j'ai le message d'erreur uniquement si ma base n'existe pas.

if (!empty($host) && !empty($username) && !empty($database)) {	
				$db = new Connection($host, $database, $username, $password);
				$result = $db->check_database_config();
    		}
    		else {
    			$result = DB_UNKNOW_ERROR;
    		}
    		
			switch ($result) {

				case DB_CONFIG_ERROR_DATABASE_NOT_FOUND:
						$db->executeQuery("CREATE DATABASE IF NOT EXISTS ".$database);
						//var_dump($res);
			 			$result = DB_CONFIG_SUCCESS;
				break;
					
				case DB_CONFIG_SUCCESS:
					
					$file_path = ENGINE_DIR . 'data/dbconfig.php';
					
					$db_config_content = '<?php' . "\n" .
                        '	define("DBHOST", "' . $host . '");' . "\n" .
                        '	define("DBUSER", "' . $username . '");' . "\n" .
                        '	define("DBPASS", "' . $password . '");' . "\n" .
                        '	define("DBNAME", "' . $database . '");' . "\n" .
                        '	define("PREFIX", "' . $tables_prefix . '");' . "\n" .
                        '	define("COLLATE", "");' . "\n" .
                        '	define("USERPREFIX", "");' . "\n" .
                        '?>';
						
					$db_config_file = new File($file_path);
					$db_config_file->write($db_config_content);
					$db_config_file->close();
					
					$mysql_file = INSTALL_DIR . 'data/mysql.php';
					if (file_exists($mysql_file)) {
						include_once $mysql_file;
						$db->executeQuery($sql); 
					}
					else {
						// ERROR MESSAGE
					}
					
					$db = null;
					
    				redirect(add_lang('install.php?step=' . (STEP_DB_CONFIG + 1), true));
    			break;
					
    			case DB_CONFIG_ERROR_TABLES_ALREADY_EXIST:
    			    $error = '';
    			    break;
					
    			case DB_CONFIG_ERROR_CONNECTION_TO_DBMS:
    				$error = '<div class="error">' . $LANG['db_error_connexion'] . '</div>';
    				break;
					
    			case DB_CONFIG_ERROR_DATABASE_NOT_FOUND_AND_COULDNOT_BE_CREATED:
    				$error = '<div class="error">' . $LANG['db_error_selection_not_creable'] . '</div>';
    				break;
					
    			case DB_UNKNOW_ERROR:
    				$error = '<div class="error">' . $LANG['db_unknown_error'] . '</div>';
				break;
    		}
			
    	}