<?php
/**
  Le but de cette classe est de garder un accès au BDD de façon très proche du SQL.
  Surtout pas d'inventer une nouvelle couche de syntaxe. Juste de se simplifier la vie.
 
  Il y a beaucoup de "copier-coller" mais c'est pour que les fonctions
  puissent être appellées indépendement, que tout se fasse le plus rapidement possible.
 
  Salagir mars 2007
  v0.95
 
  A définir: define('DEBUG', true/false);
 */
class sqlQueries {
	var $tr_status=false; //!< à true pendant une transaction
	var $tr_erreurs=0; //!< compte le nombre d'erreurs durant une transaction
 
	//! Si appelle, ouvre connexion sql. Sinon utilisez les fonction en ::
	function sqlQueries($database='', $login='', $pass='', $host='localhost') {
		if (!$database) return; // on considère qu'on est déjà connecté
		$this->link = mysql_connect($host, $login, $pass) or die("<p>DB Error: Can't connect to database.</p>");
		mysql_select_db($database, $this->link) or die("<p>DB Error: Can't open database.</p>");
	}
 
	//! Ecris les erreurs
	function loggue($sql, &$me) {
		if ($me) $me->tr_erreurs++;
		if (DEBUG!==true) return false;
 
		// N'hésitez pas à modifier selon votre système de report d'erreur
		$log_sql = str_replace(array("\n","\r"), array('<br>',''), $sql);
		echo 'Erreur SQL #'.mysql_errno().' : '.mysql_error();
		echo "<p><code>$log_sql</code></p>";
		return false;
	}
 
	//! identique à mysql_query() avec erreurs etc.
	function query($q) {
		$R = $this->link? mysql_query($q, $this->link) : mysql_query($q);
		if ($R==false) sqlQueries::loggue($q, $this);
		return $R;
	}
 
	//! Retourne un tableau au lieu d'un result. Si donne $indexfield le tableau sera indexé par ce dernier
	function query2assoc($q, $indexfield=null) {
		$R = $this->link? mysql_query($q, $this->link) : mysql_query($q);
		if ($R==false) return sqlQueries::loggue($q, $this);
		$out = array();
		if ($indexfield===null)
			while ($r = mysql_fetch_assoc($R)) $out[] = $r;
		else
			while ($r = mysql_fetch_assoc($R)) $out[$r[$indexfield]] = $r;
		return $out;
	}
 
	//! Choppe un resultat de query avec un seul champ dans le SELECT. Si index est vrai, on choppe 2 champs et le 1er est l'index.
	function query2list($q, $index=false) {
		$R = $this->link? mysql_query($q, $this->link) : mysql_query($q);
		if ($R==false) return sqlQueries::loggue($q, $this);
 
		$out = array();
		if ($index)
			while ($r = mysql_fetch_row($R)) $out[$r[0]] = $r[1];
		else
			while ($r = mysql_fetch_row($R)) $out[] = $r[0];
		return $out;
	}
 
	//! Choppe un resultat unique de query, une ligne, une colone
	function query2cell($q) {
		$R = $this->link? mysql_query($q, $this->link) : mysql_query($q);
		if ($R==false) return sqlQueries::loggue($q, $this);
		$r = mysql_fetch_row($R);
		if (!$r) return false;
		return $r[0];
	}
 
	//! identique à  mysql_query("start transaction");
	function tr_begin() {
		if ($this->tr_status !== false)
			sqlQueries::loggue("Erreur SQL Transaction: un begin lancé alors qu'on est déjà dans une transaction.", $this);
		$this->link? mysql_query("start transaction", $this->link) : mysql_query("start transaction");
		$this->tr_erreurs = 0;
		$this->tr_status = true;
	}
	//! identique à  mysql_query("commit");
	function tr_end() {
		if ($this->tr_status !== true)
			sqlQueries::loggue("Erreur SQL Transaction: un end lancé alors qu'on est pas dans une transaction.", $this);
		if ($this->tr_erreurs > 0) {
			sqlQueries::loggue("Erreur SQL Transaction: une fin de transaction avec {$this->tr_erreurs} erreur(s). On fait un rollback.", $this);
			$this->link? mysql_query("rollback", $this->link) : mysql_query("rollback");
			$this->tr_status = false;
			return;
		}
		$this->link? mysql_query("commit", $this->link) : mysql_query("commit");
		$this->tr_status = false;
	}
 
 
	//! ecrire le + vite possible... c important
	function e($a) {
		if ($this->link) return mysql_real_escape_string($a, $this->link);
		return mysql_real_escape_string($a);
	}
 
	///// copy paste
	function errno() {
		return $this->link? mysql_errno($this->link) : mysql_errno();
	}
	function error() {
		return $this->link? mysql_error($this->link) : mysql_error();
	}
	function affected_rows() {
		return $this->link? mysql_affected_rows($this->link) : mysql_affected_rows();
	}
	function insert_id() {
		return $this->link? mysql_insert_id($this->link) : mysql_insert_id();
	}
}
?>