Page 1 sur 1

Code non compris

Posté : 27 juin 2014, 20:56
par persepolis
Bonjour,

Je fais actuellement un tutoriel d'elephorm, et il y a un code que je n'ai pas compris :
<?php
require_once("connexionMySql.inc.php");
if(isset($_GET['famille']))
$requete="SELECT reference,prix  FROM articles WHERE famillesID=".$_GET['famille'] ;
else
$requete="SELECT reference,prix  FROM articles ";

$resultat=mysql_query($requete);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans nom</title>
</head>

<body>

<form id="form1" name="form1" method="get" action="<?php  echo $_SERVER['PHP_SELF']; ?>">
  <label>Sélectionnez une famille :
  <select name="famille" id="famille">
    <option value="1">Guitares</option>
	<option value="2">Accessoire</option>
  </select>
  </label>
  <label>
  <input type="submit" name="bouton" id="bouton" value="Envoyer" />
  </label>
</form>

<table width="600" border="1" cellspacing="0" cellpadding="5">
  <tr>
    <td>Référence</td>
    <td>Prix</td>
	<td>Voir la fiche</td>
  </tr>
  <?php while($articles=mysql_fetch_array($resultat)) {	 ?>
  <tr>
    <td><?php echo $articles['reference']; ?></td>
    <td><?php echo $articles['prix']; ?></td>
	<td><a href="fiche5.php?reference=<?php echo $articles['reference']; ?>">Voir</a></td>
  </tr>
  <?php } ?>
</table>


</body>
</html>
A la ligne 4, je ne comprends pas pourquoi la double cotte " est placée après famillesID= moi j'aurais mis cette double cotte à la fin, et aussi je ne comprends pas pourquoi il y a un point de concaténation à cet endroit. Moi j'aurais mis :
famillesID=$_GET['famille']"
Mais ça ne marche pas.

Re: Code non compris

Posté : 27 juin 2014, 21:42
par telnes
hello

écrire
<?php

$test['titi'] = 'tata';

echo "ma chaine de $test['titi'] test";

?>
ta balance une erreur au visage !!!
techniquement PHP ne doit pas savoir si tu veux afficher la var $test collé à la string ['titi'] ou chercher la var du tableau $test['titi'] ... :non:



une solution consiste à faire :priere:
<?php

$test['titi'] = 'tata';

echo "ma chaine de ${test['titi']} test";

php sait que ce qui est dans le ${} est du php et roule ma poule =D>

Re: Code non compris

Posté : 27 juin 2014, 22:22
par persepolis
Désolée mais je ne comprends toujours pas pourquoi le code que j'ai posté est juste...

Re: Code non compris

Posté : 27 juin 2014, 22:37
par moogli
salut,

ton code utilise la concaténation.

Comme tu le sais certainement php offre plusieurs façon d'utiliser les chaines de caractères :
- en utilisant des apostrophes ( ' )
- en utilisant des guillemets ( " )
- la syntaxe heredoc
- la syntaxe nowdoc

la différence entre les deux premiers c'est l'utilisation de l'apostrophe ne permet pas d'utiliser des variables (qui seront interprétées) dans les chaines de caractères. (ce que permet l'utilisation de guillemets comme tu le sais).

Comme l'indique telnes, l'analyseur syntaxique de php a ses limites et parfois il faut l'aider. c'est pour cela que l'on voit souvent l'utilisation de la concaténation (même avec l'utilisation de guillemets) lorsque l'on utilise des tableaux.
c'est bien le cas de ton code.

De mon points de vu l'utilisation de la concaténation est préférable à l'insertion de variable dans les chaines de caractères, c'est beaucoup plus lisible et économise le temps de l'analyse syntaxique (même si c'est que des bouts de chandelles ;) ).

@+

Re: Code non compris

Posté : 27 juin 2014, 22:51
par persepolis
Salut moogli, merci pour ta réponse ! Malheureusement je n'ai toujours pas compris pourquoi ce code était juste, l'apprentissage du php avec elephorm ne suffit pas, je vais lire des bouquins, ya trop de choses qui sont survolées dans les vidéos, dans les livres ce sera plus clair.

Re: Code non compris

Posté : 28 juin 2014, 12:20
par sirakawa
je vais me lancer à mon tour:
$requete="SELECT reference,prix FROM articles WHERE famillesID='1'"; serait une requête juste: u ne chaîne de caractères délimitée par des doubles quotes.
Si la valeur est passée par la méthode GET,
/
*j'ajoute des accolades systématiquement
if (isset($_GET['famille'])) //si la valeur $_GET['famille'] existe
{
//la valeur de $_GET['famille'] est cobncaténée à la chain'e entre doubles quotes
$requete="SELECT reference,prix  FROM articles WHERE famillesID=".$_GET['famille'] ;
//pour comprendre pourquoi ça marche,tu peux tester:
print "<br>$requete";
}
else //sinon
{
$requete="SELECT reference,prix  FROM articles ";
}
Mais je préfère :
if (isset($_GET['famille'])) //si la valeur $_GET['famille'] existe
{
$famille = $_GET['famille'] ;
//la valeur de $_GET['famille'] est cobncaténée à la chain'e entre doubles quotes
$requete="SELECT reference,prix FROM articles WHERE famillesID='$famille'";//en mettant la valeur entre simples quotes
//pour comprendre pourquoi ça marche,tu peux tester:
print "<br>$requete";
}
else //sinon
{
$requete="SELECT reference,prix FROM articles ";
}[/php]

Re: Code non compris

Posté : 28 juin 2014, 12:35
par persepolis
Merci beaucoup sirakawa ! J'ai mieux compris, mais maintenant ce que je voudrais savoir :
- Dans quels cas faut-il mettre des doubles quotes ?
- Dans quels cas faut-il mettre des simples quotes ?
- Dans quels cas ne faut-il rien mettre ?

Re: Code non compris

Posté : 28 juin 2014, 12:43
par persepolis
Et j'en profite pour vous demander un autre morceau de code que je n'ai pas compris, il s'agit de la création d'un menu déroulant dynamique :
<?php
require_once("connexionMysql.inc.php");
if(isset($_GET['famille']))
$requete="SELECT reference,prix  FROM articles WHERE famillesID=".$_GET['famille'] ;
else
$requete="SELECT reference,prix  FROM articles ";

$resultat=mysql_query($requete);
//--------------requête du menu
$requete2="SELECT ID,intitule  FROM familles ";
$resultat2=mysql_query($requete2);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans nom</title>
</head>

<body>

<form id="form1" name="form1" method="get" action="<?php  echo $_SERVER['PHP_SELF']; ?>">
  <label>Sélectionnez une famille :
  <select name="famille" id="famille">
  <?php while($familles=mysql_fetch_array($resultat2))  { ?>
    <option <?php  if(!isset($_GET['famille'])) $_GET['famille']=1; if($familles['ID']==$_GET['famille']) echo  "selected='selected'"; ?> value="<?php echo $familles['ID']; ?>"><?php echo $familles['intitule']; ?></option>
  <?php } ?>
  </select>
  </label>
  <label>
  <input type="submit" name="bouton" id="bouton" value="Envoyer" />
  </label>
</form>

<table width="600" border="1" cellspacing="0" cellpadding="5">
  <tr>
    <td>Référence</td>
    <td>Prix</td>
	<td>Voir la fiche</td>
  </tr>
  <?php while($articles=mysql_fetch_array($resultat))  { ?>
  <tr>
    <td><?php echo $articles['reference']; ?></td>
    <td><?php echo $articles['prix']; ?></td>
	<td><a href="fiche5.php?reference=<?php echo $articles['reference']; ?>" >Voir</a></td>
  </tr>
  <?php } ?>
</table>


</body>
</html>
A la ligne 26, je ne comprends pas ceci : echo "selected='selected'"

Merci !

Re: Code non compris

Posté : 28 juin 2014, 13:36
par sirakawa
Exécute ce code qui essaie d'expliquer:
<?PHP
$a = 'chaine simple quotes';
$b = "chaine double quotes";

print "<hr>Avec Print";
print "<br>Affichage avec des doubles quotes $a $b";
print '<br>Affichage avec des simples quotes $a $b<br>';
print "<hr>Avec echo<br>";
echo($a);
echo($b);

print "<hr>Requetes<br>";
print "<p>Quand on fait un select... where, par exemple, il faut que la valeur soit quotée, sinon mysql croit que c'est un nom de champ; Mysql accepte simple et double.<br> Sur une table à moi qui contient une colonne mot, dont un des mots est <b>la</b> en ligne de commande ou avec EasyPHP: <br>";
print  "select * from kalig_dico where mot=la";
print " <br>entraine cette erreur : ERROR 1054 (42S22): Unknown column 'la' in 'where clause'";
print "<br>Il faut écrire : select * from kalig_dico where mot='la' ou mettre des doubles quotes autour du mot la.</p>
<p>Si la colonne a une valeur numérique, on peut ne pas quoter.";
$str = <<<'EOD'
<p>Avec PHP pour exprimer une reqête, le plus simple à mon avis est de procéder ainsi:
<ul>
<li>affecter les valeurs qui serviront dans la requete (SELECT, INSERT, UPDATE...($mot_cherche = "la"</li>
<li>encadrer la requête de doubles quotes :  $requete = "SELECT * from kalig_mots";</li>
<li>encadrer les valeurs de simples quotes (là on est chez Mysql) :  $requete = "SELECT * from kalig_mots where mot = '$mot_cherche'";</li>
EOD;
print "$str";
?>
?>

Re: Code non compris

Posté : 28 juin 2014, 13:53
par persepolis
Merci pour ta réponse, le début de la page affiche ceci :

Avec Print
Affichage avec des doubles quotes chaine simple quotes chaine double quotes
Affichage avec des simples quotes $a $b

Avec echo
chaine simple quoteschaine double quotes

Ce n'est pas très clair, je n'ai pas compris...

Pour ce qui est de sql, si j'ai bien compris, les requêtes doivent être entourées de doubles quotes, et les chaînes de caractères de simplaes quotes, à l'intérieur de ces requêtes. Mais dans cet exemple :
$requete="UPDATE INTO articles SET prix='".$_POST['prix']."', famillesID='".$_POST['famillesID']."'";
Je ne comprends pas pourquoi il y a des points de concaténation avant et après chaque valeur, ni pourquoi il y a des simples quotes entourées de doubles quotes, sachant que le prix et famillesId sont des chiffres.

Re: Code non compris

Posté : 28 juin 2014, 14:05
par sirakawa
Quand tu affiches avec des simples quotes, les variables ne sont pas interprétées, alors qu'elles le sont avec des dou
bles quotes.

On peut toujours quoter simple les valeurs numériques dans la requête mysql...
L'exemple que tu ne comprends pas vient de ce que la requete est scindée en deux:
une sorte de partie fixe: "UPDATE INTO articles SET prix='
où si tu regardes bien il y a la simple quote début de valeur mysql puis la double quote fin de chaine php.*
suivie de la valeur du prix (concaténée pour en faire une seule chaine .)
.$_POST['prix']."' la double quote pour commencer le bout de chaine suivant qui contient la simple quote terminatrice de la valeur précédente, etc

, famillesID='".$_POST['famillesID']."'";
C'est en raison du manque de lisibilité de cette façon de procéder et du fait qu'il faut toujours vérifier la validité des valeurs passées que je pense qu'il ne faut pas mettre de
$_POST[''] ou $_GET directement dans la requêtre.

Re: Code non compris

Posté : 28 juin 2014, 14:32
par persepolis
OK, pour que le code soit plus lisible et moins compliqué, comment tu procéderais ?

Re: Code non compris

Posté : 28 juin 2014, 14:47
par sirakawa
quelque chose dans ce genre:
$erreurs = 0;
if (isset($_POST['val1']))
{
//autres test de validité; échappement des chaines de caractères....
}
else
{
$erreurs = 1;
}
if (isset($_POST['val2']))
{
//autres test de validité; échappement des chaines de caractères....(mysqli_escapeqqch)
}
else
{
$erreurs += 2;
}
if ($erreurs !=0)
{
//traitement des erreurs
}
else
{
$requete = "UPDATE table set val1 = '$val1', ";
}