while ou foreach, je comprend pas trop

Mammouth du PHP | 790 Messages

04 juin 2012, 15:01

voila, j'ai un formulaire pour enregistrer dans une table el1 des liens vers des vidéos de grand prix,
j'ai une bdd qui a plusieurs tables dont el1, grand_prix et circuit:
--
-- Structure de la table `grand_prix`
--

CREATE TABLE IF NOT EXISTS `grand_prix` (
  `id_gp` int(11) NOT NULL AUTO_INCREMENT,
  `member_id` int(11) NOT NULL,
  `id_pays` int(11) NOT NULL,
  `id_ville` int(11) NOT NULL,
  `id_circuit` int(11) NOT NULL,
  PRIMARY KEY (`id_gp`),
  KEY `fk_grand_prix_members` (`member_id`),
  KEY `fk_grand_prix_pays1` (`id_pays`),
  KEY `fk_grand_prix_ville1` (`id_ville`),
  KEY `fk_grand_prix_circuit1` (`id_circuit`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;

--
-- Structure de la table `circuit`
--

CREATE TABLE IF NOT EXISTS `circuit` (
  `id_circuit` int(11) NOT NULL AUTO_INCREMENT,
  `circuit` varchar(45) NOT NULL,
  PRIMARY KEY (`id_circuit`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
j'ai fait une tentative de jointure, je pense qu'elle fonctionne mais j'affiche avec un while et je crois commencer a comprendre qu'il faut un foreach !!
voici mon code avec 2 ou 3 explications:
<form action="el1_exec.php" method="post">
    <fieldset>
        <legend>Uploade</legend>


       <div>
            <label>Grand Prix</label>
            <div>
                <select name="id_gp"> 
                    <?php
                    try
                    {
                     // connexion bdd

                     }
                    catch(Exception $e)
                    {
                        die('Erreur : '.$e->getMessage());
                    }
                    
                    // jointure pour mes 2 tables: grand prix (gp) et circuit (ci)
                    $reponse = $bdd->query('SELECT 
                                                gp.id_gp          AS    id_gp,
                                                gp.id_circuit     AS    gp_id_circuit,


                                                ci.id_circuit     AS    id_circuit,
                                                ci.circuit        AS    circuit

                                            FROM grand_prix AS gp

                                            LEFT OUTER JOIN circuit ci    ON   gp.id_circuit = ci.id_circuit
                                           ');


                    while ($donnees = $reponse->fetch())

                    {
                    ?>
                        <!-- select html pour avoir l'id du grand prix comme valeur pour la bdd
                             en affichant le nom du circuit, ca ca marche bien -->
                        <option value="<?php echo $donnees['id_gp']; ?>" name="id_gp">
                            <!-- ici j'ai bien le nom du circuit dans donc je pense que la jointure fonctionne bien -->
                            <?php echo stripcslashes($donnees['circuit']); ?>
                        </option>
                    <?php
                    }
                    $reponse->closeCursor();
                    
                    // tentative de récupération de l'id_circuit mais ne fnctionne pas !!!!
                    // je pense que c'est parce que je ne suis pas dans la boucle
                    // j'ai voulu déclarer $circuit pour l'input citué plus bas.
                    $circuit = $donnees['id_circuit'];


                    ?>

                </select>
            </div>
        </div> 

        <div>
            <label>Essai 1</label>
            <div>                      
                <!-- l'input suivant ne fonctionne pas non plus et je n'enregistre pas l'id du circuit en bdd 
                     encore une fois je pense que la raison est la boucle -->
                <input type="hidden" name="id_circuit" value="<?php echo $circuit ?>"/>
                <input type="submit" class="btn btn-inverse" name="envoyer"  value="Envoyer" />
            </div>
        </div>                        
    </fieldset>
</form>
et je veux enregistrer dans cette table:
--
-- Structure de la table `el1`
--

CREATE TABLE IF NOT EXISTS `el1` (
  `id_el1` int(11) NOT NULL AUTO_INCREMENT,
  `lien` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `id_gp` int(11) NOT NULL,
  `id_circuit` int(11) NOT NULL,
  `member_id` int(11) NOT NULL,
  PRIMARY KEY (`id_el1`),
  KEY `fk_el1_grand_prix1` (`id_gp`),
  KEY `fk_el1_members1` (`member_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=18 ;
je pense donc que mon soucis est la boucle, j'ai lu sur le site du zéro mais j’avoue que j'ai un peut de mal a comprendre la mise en place de la boucle foreach, si quelqu'un peut m'aidé a mieux comprendre, je l'en remercie d'avance...
merci, a plus.
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

04 juin 2012, 16:00

En effet tu cernes bien le problème, la portée des variables.
Si tu veux récupérer une donnée de $data il faut la récupérer dans la boucle.
A noter que le while va itérer X fois, donc il stockera à chaque fois la valeur courante.
Donc si tu souhaites ne pas avoir uniquement la dernière itération il faut stocker les valeurs dans un tableau.
$monTableau = array();
while($data = ...){
  //...
  $monTableau[] = $data['valeur'];
  // ...
}
var_dump($monTableau);

Mammouth du PHP | 790 Messages

04 juin 2012, 16:55

désolé mais je ne suis pas trop, connais tu un tuto ressemblant à cas ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 790 Messages

04 juin 2012, 17:38

pas sur d'avoir compris mais j'en arrive la:
<?php
include('config.php');

try
{

    $bdd = new PDO('mysql:host='.$hote.';dbname='.$nom_bd, $utilisateur, $passe, $pdo_options);
       
}
    catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
    $tab = array();
    $reponse = $bdd->query('SELECT 
                                gp.id_gp          AS    id_gp,
                                gp.id_circuit     AS    gp_id_circuit,


                                ci.id_circuit     AS    id_circuit,
                                ci.circuit        AS    circuit

                            FROM grand_prix AS gp

                            LEFT OUTER JOIN circuit ci    ON   gp.id_circuit = ci.id_circuit
                           ');

    
    
    while($donnees =  mysql_fetch_assoc($reponse))
    {
      //...
      $tab[] = $donnees['id_gp'];
      // ...
    }
$reponse->closeCursor();

var_dump($tab);
?>
bien sur ca ne marche pas, var_dump me donne: array(0) { }
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

04 juin 2012, 19:16

Ta requête renvoie-t-elle quelque chose ? :roll:
Car si l'array est vide c'est que la boucle while ne se fait pas.

Mammouth du PHP | 790 Messages

04 juin 2012, 19:31

dans le 1er code php de mon 1er post, la requête envois bien des informations et je n'i ai pas touché, donc je pense que oui !!!
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

04 juin 2012, 20:23

Pas de raison dans ce cas que $tab soit vide. ;)

Mammouth du PHP | 790 Messages

04 juin 2012, 23:17

Je ne vois vraiment pas, ce qui m'arrive, ya rien a faire #-o
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

05 juin 2012, 08:35

Ah bah... Tu commences avec PDO, puis tu continues avec mysql_xxxx ...
M'étonnes vraiment que ça ne t'affiche pas d'erreur...

ViPHP
ViPHP | 2577 Messages

05 juin 2012, 08:41

Bonjour,

Ajoute un echo dans la boucle pour vérifier que tu passe bien dedans.
Il faut tester ta requete directement dans phpmyadmin pour la mettre au point

Edit :
- il faudrait remplacer mysql_fetch_assoc($reponse) par $reponse->fetch()
- il faudrait aussi voir le report des erreurs dans php.ini ou ajouter :
ini_set('display_errors', 1);
error_reporting(E_ALL | E_STRICT);

Mammouth du PHP | 790 Messages

05 juin 2012, 13:39

alors, je pense avoir quelque réponse:

le site est sur le serveur d'un copain qu'il a paramétrer lui même et je trouve dans le php ini:
error_append_string no value no value
error_log no value no value
error_prepend_string no value no value
error_reporting 32767 22527
exit_on_timeout Off Off

ce qui explique certainement le manque d'affichage que tu signale xTG, bizarrement je me suis souvent dit sur ce projet que mon pc fonctionner mal: je comprend mieux...

maintenant, j'en suis la:
-ma requête fonctionne parfaitement dans phpmyadmin
-j'ai fait un echo dans le while et il s'affiche bien
-pour les difference pdo et mysql xTG, je ne pense pas que ce soit ca, c'est une erreur suite a un teste mais je met bien $reponse->fetch, tu peux le voir dans mon 1er code php...

désormais ce code:
<?php
include('config.php');

try
{

    $bdd = new PDO('mysql:host='.$hote.';dbname='.$bdd, $utilisateur, $passe, $pdo_options);
       
}
    catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
    
    $reponse = $bdd->query('SELECT 
                                gp.id_gp          AS    id_gp,
                                gp.id_circuit     AS    gp_id_circuit,

                                ci.id_circuit     AS    id_circuit,
                                ci.circuit        AS    circuit

                            FROM grand_prix AS gp

                            JOIN circuit ci    ON   gp.id_circuit = ci.id_circuit
                           WHERE id_gp = 25');

    $tab = array();
    
    while($donnees =  $reponse->fetch())
    {
      //...
      $tab[] = $donnees['id_gp']['gp_id_circuit'];
      echo 'boucle';
    }
    
    
$reponse->closeCursor();

echo'<br />';
var_dump($donnees);
echo'<br />';
var_dump($tab);

?>
affiche:
Array
bool(false)
array(1) { [0]=> string(1) "2" }

voila en gros...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 790 Messages

05 juin 2012, 13:51

du coup, j'ai mis comme echo:
<?php echo $donnees['id_gp'];?>
et j'obtiens:
25
bool(false)
array(1) { [0]=> string(2) "25" }

mais je crois que j'ai pas bien compris les tableaux, je n'arrive pas a y mettre d'autre infos...
je vais de ce pas faire d'autre recherches, merci...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
ViPHP | 2577 Messages

05 juin 2012, 14:06

Array <= je m'attendait à 'boucle'
bool(false) <= normal, tu es en fin de boucle donc dernier fetch return false
array(1) { [0]=> string(1) "2" } <= tu as 1 valeur dans le $tab est ce normal ?

je ne comprends pas la ligne :
$tab[] = $donnees['id_gp']['gp_id_circuit'];
normalement on a $donnees['id_gp'] et $donnees['gp_id_circuit']

Ajoute ces lignes en début de script :
ini_set('display_errors', 1); // fait l'affichage des erreurs à l'écran et pas uniquement dans la log
error_reporting(E_ALL | E_STRICT); // reporte toutes les erreurs

Mammouth du PHP | 790 Messages

20 juin 2012, 17:55

Bon, merci a vous deux, tout est rentrer dans l'ordre, en fait, j'avais plusieurs soucis...
la config du serveur mais aussi la modélisation de la base de données, grace a vos poste, j'ai encore apris beaucoup, merci :D
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.