8797 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

matmat a écrit :
Je profite pour poser une petite question quel est la différence entre :
SELECT c.Code_client, c.Nom, i.Code_client, i.Code_inter FROM Clients c, Intervention i WHERE c.Code_client = i.Code_client AND Nom = '%nom%'"


et

SELECT Clients.Code_client, Clients.Nom, Intervention.Code_client,Intervention.Code_inter 
FROM Clients LEFT JOIN Intervention ON Clients.Code_client = Intervention.Code_client WHERE Clients.Nom LIKE '%nom%'"

?

Pourquoi la première marcherais vu que la table Intervention n'a pas de champs nom donc ne remplie pas les deux conditions du select? C'est pour ça que je comprend pas trop la logique de cette requête mais il y a peut être un truc que j'ai pas pigé.

Si la première marche alors pourquoi des fois utiliser LEFT JOIN et d'autre fois non?


Exact il y a deux erreurs dans la première requête !



SELECT 
c.Code_client, 
c.Nom, 
i.Code_client, 
i.Code_inter 
FROM Clients c, Intervention i 
WHERE c.Code_client = i.Code_client 
AND c.Nom LIKE '%nom%'"


c.Nom au lieu de Nom dans le AND
et LIKE au lieu de =

La sélection sur le nom se fait dans la table Client. Quoi que ça marcherait peut-être quand même, selon les SGBD.

Ta seconde requête est plus correcte, nettement plus propre. Sur deux tables on peut s'en passer, mais dès qu'on part sur des jointures à plusieurs tables, il vaut mieux utiliser LEFT JOIN ou RIGHT JOIN. Ca permet de donner un ordre à la jointure, si tu veux. C'est pas facile à expliquer Smiley murf

Utiliser la clause WHERE pour faire la jointure est une syntaxe plus ancienne, et sémantiquement incorrecte (puisqu'on est sur Alsa :-p ). Une clause WHERE sert à filtrer, pas à faire la jonction entre deux tables. De plus, les SGBD modernes sont plus efficaces sur un JOIN ... ON que sur un WHERE m.machin = t.truc.

Dans la mesure du possible, si on veut faire une jointure, il faut utiliser la clause faite exprès pour ça...

Et puis moi je trouve ça plus lisible Smiley rolleyes

Un cours très bien : http://sqlpro.developpez.com/cours/sqlaz/jointures/

Heyoan a écrit :

Et autresinon je propose qu'on arrête de dériver de la question de mokacola (qui, s'il en a besoin, pourra consulter une foultitude de ressources comme http://dev.mysql.com/doc/ ou http://sqlpro.developpez.com/ ). cligne


Vi t'as raison on est complètement HS Smiley confused
Modifié par mistike (05 Dec 2008 - 19:27)
Je me suis foutue une bonne dizaine de baffe pour le LIKE et le = (un jour je vais plus oublier je vous jure Smiley confused )

Heyoan a écrit :
As-tu essayé celle que je te donnais plus haut ?

J'ai essayé et ca me donne le message :

Warning: sprintf() [function.sprintf]: Too few arguments in C:\Program Files\wamp\www\BDD\modification_intervention3.php on line 23
La requête

a échoué : Query was empty


J'ai essayé aussi avec :

//$query_Clients = "SELECT c.Code_client, c.Nom, i.code_client, i.Code_intervention FROM Clients c, Intervention i WHERE c.Code_client = i.code_client AND Nom LIKE '%nom%'";


ce qui me donne toujours le même résultat (la dernière ligne de ma table intervention)

juste pour info je vous donne mes tables sql :


CREATE TABLE `intervention` (
  `Code_intervention` mediumint(30) NOT NULL auto_increment,
  `Code_client` varchar(30) collate latin1_general_ci NOT NULL,
  `Type` varchar(30) collate latin1_general_ci NOT NULL,
  `Type_inter` varchar(30) collate latin1_general_ci NOT NULL,
  `Resume_panne` varchar(250) collate latin1_general_ci NOT NULL,
...
  PRIMARY KEY  (`Code_intervention`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=8 ;

--
-- Structure de la table `clients`
--

CREATE TABLE `clients` (
  `code_client` mediumint(50) NOT NULL auto_increment,
  `nom` varchar(50) collate latin1_general_ci NOT NULL,
  `prenom` varchar(50) collate latin1_general_ci NOT NULL,
  `adresse` varchar(50) collate latin1_general_ci NOT NULL,
  `ville` varchar(50) collate latin1_general_ci NOT NULL,
...
  PRIMARY KEY  (`code_client`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=10 ;


Je voulais juste dire que pour cette page (modification) tu ma donner la solution Heyoan en faisant une page qui filtre les nom et ensuite une qui filtre les inter par rapport au nom mais pour ma prochaine page (historique) je ne pourrait pas le faire en 2 pages.
mokacola a écrit :

J'ai essayé aussi avec :

//$query_Clients = "SELECT c.Code_client, c.Nom, i.code_client, i.Code_intervention FROM Clients c, Intervention i WHERE c.Code_client = i.code_client AND Nom LIKE '%nom%'";


ce qui me donne toujours le même résultat (la dernière ligne de ma table intervention)


Peux-tu tester la requête seule dans ta base ? Avec phpMyAdmin par exemple ?

L'as-tu mise telle quelle, i.e. comment passes-tu la variable "nom" dans la clause WHERE ? Parce qu'en php il faudrait faire un truc du genre WHERE = ".$nom."

Essaye aussi de corriger Nom par c.Nom stp, et de mettre tout ça en "case sensitive". De même, je ne pense pas que tu aies besoin de récupérer i.code_client (puisque tu récupères déjà c.code_client).

Sinon, on dirait que c'est comme si tu n'utilisais pas ensuite les fonctions et boucles php pour récupérer l'ensemble des résultats
Smiley confus
Modifié par mistike (05 Dec 2008 - 23:26)
voila je vous donne le code que j'ai pour ma page historique peu être mon problème vous parlera t'il plus comme ca.


$query_Clients = "SELECT i.*, c.code_client FROM Clients c, Intervention i LIMIT 50";

    $result = mysql_query($query_Clients) or die("La requête <BR><PRE>$SQL</PRE>a échoué : ".mysql_error()); 
    $article =mysql_fetch_object($result);
    $result = mysql_query($query_Clients);
    
//on incremente la variable
  $i=$i+1;
  //initialiser la variable $i a 0
   $i=0;
   while($row = mysql_fetch_row($result)) 
      {
    if ($i==0) 
     {
  }
    echo "
nom : [b][#000000]??????[/#][/b] - n° client : $row[1] - Type : $row[2] - Type2 : $row[3] - Résumé panne : $row[4]
 if ($i==1) 
  {
echo "<br>";
$i=0;
  }
   }


Ce que je trouve pas c'est quoi mettre pour le nom $row[????]
Modifié par mokacola (05 Dec 2008 - 23:32)
autant pour moi effectivement ça fonctionne avec :


$query_Clients = "SELECT c.Code_client, c.Nom, i.cclient, i.Code_intervention FROM Clients c, Intervention i WHERE c.Code_client = i.code_client AND Nom LIKE '%$nom%'";


Merci Beaucoup pour votre aide à tous (Je risque de vous souler encore un moment avec mes questions Smiley biggrin )
ouh là là... bon, je ne suis pas sûre de comprendre ce que tu veux exactement : faire une liste de TOUTES les interventions passées, en y ajoutant le nom du client à chaque fois ?

Je répète que je ne suis pas une flèche en php, alors ce que je vais dire après est peut-être faux, mais... ton code n'est pas logique.

D'abord tu lances deux fois ta requête SQL, qui ne fonctionne pas (il n'y a pas de clause de jointure et de toute façon le nom tu ne le récupères pas).

Ensuite tu incrémentes un $i pour le mettre à zéro juste après Smiley eek

Bon moi je tenterais un truc comme ça :


$result = mysql_query("SELECT c.code_client, c.nom, i.type, i.type2, i.resume FROM clients c JOIN intervention i ON c.code_client = i.code_client LIMIT 50") or die("La requête <BR><PRE>$SQL</PRE>a échoué : ".mysql_error()); 

while ($data = mysql_fetch_array($result) )
{
	echo("code client : ".$data['code_client']." - nom : ".$data['nom']." - Type : ".$data['type']." - Type2 : ".$data['type2']." - Résumé : ".$data['resume']."<br />");
}


Attention, c'est écrit comme ça à la volée, pas testé, rien... m'étonnerait que ça marche du premier coup Smiley smile

Je réitère mon conseil : teste tes requêtes SQL directement dans phpMyAdmin, ça t'évitera de devoir débugger en même temps ton code SQL et ton code php !
Euh... il y a 2 erreurs dans la structure de tes tables. Smiley cligne

1) puisque code_client sert de lien le champ doit être du même type dans chacune (et pas numérique / alphanumérique).

2) à quoi servent le (30) et le (50) après mediumint ? Voir ce post pour plus d'infos.


Sinon je t'invite fortement à utiliser mysql_real_escape_string dans tes requêtes car on ne sait jamais à l'avance quelles valeurs contiennent des variables postées.

Ce qui donne avec le jeu de test suivant :
a écrit :

--
-- Structure de la table `clients`
--

CREATE TABLE `clients` (
`code_client` mediumint(9) NOT NULL auto_increment,
`nom` varchar(50) collate latin1_general_ci NOT NULL,
`prenom` varchar(50) collate latin1_general_ci NOT NULL,
`adresse` varchar(50) collate latin1_general_ci NOT NULL,
`ville` varchar(50) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`code_client`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=5 ;

--
-- Contenu de la table `clients`
--

INSERT INTO `clients` (`code_client`, `nom`, `prenom`, `adresse`, `ville`) VALUES
(1, 'Martin', 'Xavier', '', ''),
(2, 'Popol', 'Paul', '', ''),
(3, 'Martin', 'Michel', '', ''),
(4, 'George', 'Michael', '', '');

-- --------------------------------------------------------

--
-- Structure de la table `intervention`
--

CREATE TABLE `intervention` (
`code_intervention` mediumint(9) NOT NULL auto_increment,
`code_client` mediumint(9) NOT NULL,
`Type` varchar(30) collate latin1_general_ci NOT NULL,
`Type_inter` varchar(30) collate latin1_general_ci NOT NULL,
`Resume_panne` varchar(250) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`code_intervention`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=6 ;

--
-- Contenu de la table `intervention`
--

INSERT INTO `intervention` (`code_intervention`, `code_client`, `Type`, `Type_inter`, `Resume_panne`) VALUES
(1, 1, '', '', ''),
(2, 1, '', '', ''),
(3, 2, '', '', ''),
(4, 3, '', '', ''),
(5, 4, '', '', '');

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Test</title>
</head>
<body>
<?php
if (!empty($_POST['nom'])) {
	require_once('connexion.php');
	$nom = $_POST['nom'];
	$sql = sprintf("SELECT C.code_client, nom, prenom, code_intervention FROM Clients C, Intervention I WHERE C.code_client = I.code_client AND nom = '%s'",
	mysql_real_escape_string($nom));
	$result = mysql_query($sql) or die("La requête <br /><pre>$sql</pre>a échoué : ".mysql_error());
	if(mysql_num_rows($result) > 0) {
		while($row = mysql_fetch_assoc($result)) {
			echo '<p>code Client : '.$row['code_client']. ' / Nom : '.$row['nom'].' / Prénom : '.$row['prenom'].' / code Intervention : '.$row['code_intervention']."</p>\n";
		}
	} else {
		echo "<p>Aucun résultat</p>";
	}
}
?>
<div>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
	<p>
		<label for="nom">Nom :</label>
		<input type="text" id="nom"  name="nom"  />
	</p>
	<p>
		<input type="submit" />
	</p>
</form>
</div>
</body>
</html>
A tester avec le nom Martin.
Modifié par Heyoan (06 Dec 2008 - 01:26)
mistike a écrit :

Bon moi je tenterais un truc comme ça :

ça fonctionne c'est exactement ce que je voulais pour ma page historique

Heyoan a écrit :

Ce qui donne avec le jeu de test suivant :


ça fonctionne parfaitement aussi (après avoir fait les modifications dans ma base)


Merci beaucoup à vous pour votre aide. Dés que mon projet sera fini je vous donnerais l'adresse pour que vous compreniez mieux ou je voulais en venir (faudra pas être trop dure avec moi pour la présentation
Smiley cligne )
Pages :