Erreur sql n°12

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Erreur sql n°12

par agité » 19 sept. 2008, 12:19

Je me demandais si tu créais un User par ci, par là, ou bien si tu instanciais une batterie de User en même temps.

sinon, pour ton soucis de out_of_memory, il faudrait que tu fasses une factory qui ne recrée pas une connexion si une est déjà ouverte.

Comme ça, j'ai aucune méthodologie, mais je sais que Propel et Doctrine y parvienne sans soucis ;)
En fait dans mes pages je fais instancier User dans mon header pour pouvoir faire appel a la gestion de la session utilisateur et ensuite j'utilise cette instance dans mes pages.

Par contre si elle doit être utilisée dans une autre classe a ce moment la j'en refais une instance donc au pire il y en a 4 en tout sur le site.

Sinon oui me tourner vers un système tout fait était une autre solution mais je n'avais pas le temps de me documenter sur Propel ou Doctrine voir passer sur un framework j'ai donc fais ces quelque classes qui m'ont bien été utile pour comprendre les concept POO.

J'ai aussi modifier les valeur du mysql.ini pour mettre tout a des valeurs maximum, redémarrer apache, rien à faire il me ressors toujours cette erreur.

par zeus » 19 sept. 2008, 12:15

Je me demandais si tu créais un User par ci, par là, ou bien si tu instanciais une batterie de User en même temps.

sinon, pour ton soucis de out_of_memory, il faudrait que tu fasses une factory qui ne recrée pas une connexion si une est déjà ouverte.

Comme ça, j'ai aucune méthodologie, mais je sais que Propel et Doctrine y parvienne sans soucis ;)

par agité » 19 sept. 2008, 12:10

Bonjour,

alors, plusieurs remarques :
1/ visiblement, l'erreur signifie que tu atteinds un "out of memory", donc que tu ouvres trop de connexion simultanée
2/ Quel est le code de connexion de DbQuery() ?
3/ A quel volume est ce que tu crées tes User ?
Oui il ya bien un problème de mémoire, pour les connexion simultanées je viens de rajouter un destructeur sur ma classe DbQuery qui est comme ceci :

<?php
/************************************************** 
*  Classe des requetes sql :											
*		
*	 Mode pré-production : Affiche les erreurs		
* 															
*  Mode production : Ne pas afficher les erreurs
**************************************************/

class DbQuery extends mysqli  {

 // Onlan
 protected $Config = array(
 'host' => 'localhost',
 'user' => 'root',
 'pass' => '****',
 'dbname' => 'gft_loc'
 );
 
 protected $connexion;
 protected $DisplayError = true;

 // Connection a la bdd
  public function __construct() {
 
 		$this->connexion = @parent::__construct($this->Config['host'],
																					  $this->Config['user'], 
																					  $this->Config['pass'], 
																					  $this->Config['dbname']); 
																	 
	
		// Mode pré-prod
		// Retirer mysql_connect_error() en prod
		if(mysqli_connect_errno())
		{
			if($this->DisplayError)
			{
 				echo "<b>- Impossible de se connecter a la base de donnée : ".mysqli_connect_error()."</b><br />";
				exit();
			}
			else
			{
				echo "<div id="sqlError">Le site n'est pas accessible pour le momemnt.</div>";
				exit();
			}
		}
		
		$this->set_charset("utf8");		 
		return $this->connexion;				
		mysql_query('SELECT @pwdkey:="*****"');				
 }
 

 // Fonction requete select sur la bdd
 public function ReqQuery($req) 
 {
	if(empty($req))
	{
		$this->displayError(true);
	}
	else
	{
	 if(!$reponse = parent::query($req))	
	 {
		 $this->displayError(true);
	 }else{
		 return $reponse;
	 }	
	}	
 }
 
 protected function displayError($displayError)
 {
	if($displayError)
	{
		echo "<div id="sqlError"><b>Erreur sql n°".$this->errno." :</b> ".$this->error." <br /><br /> ".$req."<br /><br /></div>";
	}
	else
	{
		echo "<center><b>Une erreur est survenue sur cette page.</b><br /><br /><a href="#" onclick="javascript:history.back()" ">Retour</a></center>";
		exit();
	}
 }
 
  // Fonction requete fetch_array sur la bdd
 public function ArrayQuery($req) {

	if(!empty($req))
	{
		if(!$reponse = $req->fetch_array())	
		{
			if($this->DisplayError)
			{
				echo "<b>Erreur sql n°".$this->errno." :</b> ".$this->error." <br /><br />";
			}
		}else{
			return $reponse;
		}
	}		
 }
 
 public function __destruct()
 {
 	 parent::close())
 }
}
?>
Quant a la 3ème question je ne comprends pas, à quel volume ?

par zeus » 19 sept. 2008, 12:08

Bonjour,

alors, plusieurs remarques :
1/ visiblement, l'erreur signifie que tu atteinds un "out of memory", donc que tu ouvres trop de connexion simultanée
2/ Quel est le code de connexion de DbQuery() ?
3/ A quel volume est ce que tu crées tes User ?

Erreur sql n°12

par agité » 19 sept. 2008, 11:17

Bonjour,

La manière dont je procède pour lier mes classes entre elles est la suivante :
class User {

public $Error = NULL;
private $Db; 
private $Str;
private $SessionTime = 20;

	function __construct() 
	{
		$this->Db  = new DbQuery();
		$this->Str = new String();
		$this->Lot = new Lot();
	}

lorsque j'ai ajouter une nouvelle classe il me retourne l'erreur suivante :
Can't create a new thread (errno 12); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
Et je ne vois pas trop a quoi ça correspond, j'ai rechercher sur le net sans grand succès.

Une idée ?