[PHP] Probleme de IF, Else IF ... - Help

Bonsoir,

j’aurais besoin d’un coup de main :clap: pour résoudre mon probleme …

Je fait une requete sur ma BDD, et je souhaiterai quand lorque que ma requete ne rapporte aucun resultat, je puisse afficher un message ("aucun resultat pour cette requete") …

Pour le moment j’ai reussi a faire apparaitre un message lorsqu’aucune information n’est mentionné dans ma zone de texte … mais je n’arrive pas a affiché un message lorsque ma requete est infructueuse :riva:

pouvez vous m’aider ? merci d’avance :jap:



<body>
<form method="post" action="distribution2.php">

<span class="Style1">Votre Code Postal : </span></br>
<input name="cp" type="text" size="30"><input type="submit" name="bt" value="ok"></br>

<?php

require('conf.php');
mysql_selectdb("localhot") or die("Connexion impossible");
$space='     ';

$cp = $_POST['cp'];

$query = "SELECT * FROM actigaz WHERE cp= $cp";

$requeteID = mysql_query($query);


$count = mysql_query('SELECT COUNT(id) AS total FROM acti') or die("Connexion impossible"); 
$result = mysql_fetch_array($count);
echo '<span class="Style1"><center>'.$result['total']." points de vente r&eacute;f&eacute;renc&eacute;s.".'</br></br>';


if ($requeteID != "")  
{
while($data = mysql_fetch_array($requeteID)) 
{

echo '<tr><td><span class="Style3"><center>'.  $space, $data['cp'] , $space.'</center></td><td><span class="Style3"><center>'.  $data['ville'], $space.'</center></td><td><span class="Style4"><center>'. $data['client'], $space.'</td><td><span class="Style1"><center>'. $data['tel'] .'</br></center></td></tr>';
}

}
else
 {
if ($requeteID ==  "")
{
echo "Veuillez renseigner un code postal.".'<br></br>';
}
}

?>


Tu peux faire ça.


$sql = "SELECT * FROM user";
$result = mysql_query($sql);
if ($result  && mysql_num_rows($result )>0) {
 //ajoute ton traitement
} else {
 print ('Pas de résultat exploitable.');
}

Sinon, j’ai développé une classe pour effectuer toutes mes requêtes mysql. Je te l’ajoute ci-dessous.


<?php
/*
 * Created on 9 juil. 2006
 *
 * mysql class. Helper for querying the MySql server.
 */
 
 class mysql {
  var $host = "127.0.0.1:3306";
  var $user = "login";
  var $pass = "pass";
  var $database = "database_name";
  var $con;

	/**
  * Connect to the database.
  */
  function connect() {
  	$this->con = mysql_connect($this->host, $this->user, $this->pass);
  	if ($this->con) {
    mysql_select_db($this->database);
  	}
  	else die("Connexion impossible");
  }

	/**
  * Executes the query and returns all results.
  */
  function exec($sql) {
  	if ($this->con == null) {
    	$this->connect();
  	}
  $r = mysql_query($sql, $this->con);
  return $r;
  }

	/**
  * Executes the query and returns a single object.
  */
  function exec_single_object($sql) {
  	if ($this->con == null) {
    	$this->connect();
  	}
  	$r = mysql_query($sql, $this->con);
  	if ($r && mysql_num_rows($r)>0) {
    $o = mysql_fetch_object($r);
    mysql_free_result($r);
    return $o;
  	}
  	return NULL;
  }

	/**
  * Executes the query and returns a single value.
  */
  function exec_single_value($sql) {
  	if ($this->con == null) {
    	$this->connect();
  	}
  	$r = mysql_query($sql, $this->con);
  	if ($r && mysql_num_rows($r)>0) {
    $a = mysql_fetch_array($r);
    mysql_free_result($r);
    return $a[0];
  	}
  	return NULL;
  }

	/**
  * Closes the connection.
  */
  function close() {
  	if ($this->con) {
    mysql_close($this->con);
  	}
  }

	/**
  * Closes the connection and free the memory occupied by $res.
  */
  function closeEx($res) {
  	mysql_free_result($res);
  	mysql_close($this->con);
  }
 }
 
?>


9a marche avec

if ($requeteID && mysql_num_rows($requeteID )>0) 

Merci Stele :jap: :jap:

que représente les && dans la formule

if ($requeteI  && mysql_num_rows($requeteI )>0)

??

Me reste plus qu’a intégrer un controle sur la saise … merci en tout cas ! :jap: :jap:

C’est un ET logique. Je te renvoie à l’algèbre de boole, si tu veux plus d’information.
Cela signifie que la condition est validée si $result est différent de NULL (c’est à dire que mysql_query à su interpréter ta requête) ET si le nombre de ligne retourné par ta requête est supérieure à 0.

Edit: plus d’info sur les opérateurs ici: Manuel php - Opérateurs

Merci beaucoup !
j’te paye un verre :miam: ?

ça tourne au poil !

:jap: :clap: :hello: :jap:

stele, petite optimisation pour ta classe: Pourquoi ne pas se connecter directement à MySql quand tu construits ta class? Ce serait mieux :slight_smile:

En fait, je préférais me connecter uniquement au moment où j’en avais réellement besoin. Mais c’est vrai que j’aurais pu le faire dans le constructeur. Il faudrais que je fasse des tests pour voir les différences de performances entre les deux méthodes.

C’est personnellement ce que je fais : se connecter au moment où c’est utile. Bon j’admets aussi qu’avec une requête pour désactiver l’autocommit dés le début, c’est pas aussi utile…

En même temps, tu n’initialises pas une class sans raison…

MAX-k: en même temps tu peux être dans un endroit où tu ne sais pas que tu as besoin de la BDD, mais que tu risques quand même de t’en servir.

Ex: tu englobe une action (un fichier), dont tu ne sais rien. Donc tu crée l’objet par défaut. Si elle se sert de la bdd, ça se connectera. Sinon non.

Une autre solution serait une méthode statique du genre Database::getDatabase(), couplée à __autoload() et c’est le pied :wink:

Sans-Nom: Non, on initialise pas une class sans raison. Si on initialise une class, c’est qu’on va l’utiliser.

Pas forcément.

J’initialise un tas de classe Logger : ça veut pas dire que je vais les utiliser mais qu’à un moment je peux en avoir besoin.

C’est là toute la subtile nuance. Alors bien sûr, avec une méthode statique genre XXX::getDatabase() tu peux éviter ça, en faisant de ta BDD un pseudo singleton, mais dans le cas d’un Logger, c’est typiquement un objet alloué pour l’objet courant.

Donc bon, j’vais pas m’amuser à faire un XXX::getLogger($this) à chaque fois dans l’hypothèse où je ne m’en sers pas. C’est moins performant que d’initialiser l’objet.

(Surtout dans ce cas)

C’est un peu comme :

$x = 0;
while ($x < 9999) {
  if ( 0 == ($x % 3) ) {
    global $z;
    echo $z[0]*$z[1]+1;
  }
}

Certes $z est bien utilisé là où c’est nécessaire, mais faire 3333 appel à global $z, c’est plus lent que de le faire une fois :

$x = 0;
global $z;
while ($x < 9999) {
  if ( 0 == ($x % 3) ) {
    echo $z[0]*$z[1]+1;
  }
}

Et si trouves cela hors de propos, remplace global $z par $z = Foo::getZ() :slight_smile: (tu es forcé de déclarer la variable, php ne supportant pas getZ()[0]).

Bref, tu ne sais pas programmer. Car, si tu initialises une class, c’est que tu vas l’utiliser!
Initialiser une class, c’est:
$var = new class();

Donc, si tu fais ça, c’est que tu comptes l’utiliser… Sinon, tu perds du temps pour rien.

PS: Je rappelle que le but en PHP est de gagner un max de temps…

Et? :slight_smile:

Dans mon exemple avec une classe :

$x = 0;
while ($x < 9999) {
 if ( 0 == ($x % 3) ) {
   $z = new Z();
   echo $z->g[0]*$z->g[1]+1;
 }
}

Quand bien même Z() est toujours le même objet, tu le fais 3333 fois, donc tu perds du temps. Et pourtant, j’ai suivi ta logique hein :slight_smile:

$x = 0;
$z = new Z();
while ($x < 9999) {
 if ( 0 == ($x % 3) ) {
   echo $z->g[0]*$z->g[1]+1;
 }
}

Et ici donc, $z n’est pas utilisé 6666 fois. Est-ce un tort de l’initialiser? Non : simplement parce que tu évite d’initialiser 3333 fois l’objet. Tu parles de gagner un max de temps? Ca en gagne.

Donc oui : tu initialises une classe sans forcément l’utiliser.

Maintenant, ce n’est pas parce que le but de PHP est de gagner un max de temps, que :

  1. il faut se permettre de perdre du temps à coder salement pour gagner (peu) de temps.
  2. dans le cas de la BDD - démarrer la connexion à la création de l’objet n’est pas une bonne idée, surtout quand tu n’as aucune idée de comment l’objet est utilisé après (je te rappelle le cas où tu ne sais rien du code sous jacent…). Du reste, un objet BDD peut faire d’autre trucs, ne nécessitant pas la connexion (après tout : seule une requête le requiert).
  3. je dis bien (ou j’ai bien dit?) : j’initialise une classe parce que je risque de m’en servir. C’est une subtile différence avec j’initialise une classe parce que je ne m’en servirai jamais.

(au passage, on écrit classe)

Et secundo, l’homme qui ne sait pas programmer n’arrête pas de te parler de méthode statique, qui permet entre autre, d’éviter d’initialiser la classe si ce n’est pas nécessaire je te rappelle le squelette d’un tel basar :

public static function foo() {
  static $x = null;
  if ( $x === null) $x = new Foo();
  return $x;
}

Et vu le modèle objet de PHP, si tu veux gagner un max de temps, tu as plus vite fait d’installer un serveur J2EE avec jBoss and co…

(surtout si tu me dis que tes fichiers commencent à chaque fois par include ‘class.inc.php’; où tu inclus inutilement un fichier pour des classes que potentiellement tu n’utiliseras jamais…)

(vive __autoload())

A ce propos, je m’interroge : d’après l’algèbre de Boole, ça devrait être si $result vaut TRUE non ?
Mais pourtant PHP l’interprête comme “si $result différent de NULL”, est-ce parce que $result est une ressource (et pas un bool) ?

mysql_query renvoie au choix FALSE, TRUE (si requête de type INSERT, UPDATE, DELETE), ou une resource mySQL.

Donc en logique :

if (mysql_query('FOO') === false) {
  echo 'erreur mySQL', "\n";
  exit('fuck off, then!');
}