Bonjour
je souhaite créer un module d'actualité. Une actualité peut avoir plusieurs images, donc j'ai créé une table actu et une table image. Dans la table image il y 'a en clé étrangère, l'ID de l'actu.
Je souhaite récupérer TOUTES les images, associés aux 4 derières actualités.
Je travaille en modèle MVC et actuellement j'ai fait ça :

modèle

function getIdActu(){
  $db = connect();
  $sql = "SELECT idActu FROM Actu ORDER BY idActu DESC LIMIT 4";
  try {
    $retour["donnees"] = $db->query($sql);
    $retour["statut"] = "ok";
  } catch (PDOException $erreur) {
    $retour["donnees"] = $erreur->getMessage();
    $retour["statut"] = "erreur";
  }
  return $retour;
}

function getImageActu($id){
  $db = connect();
  $sql2 = "SELECT idImage, nomImage, altImage, idActuImage, idActu FROM
  Actu, image
  WHERE Actu.idActu = image.idActuImage AND image.idActuImage = $id ORDER BY idActu";
  try {
    $retour["donnees"] = $db->query($sql2);
    $retour["statut"] = "ok";
  } catch (PDOException $erreur) {
    $retour["donnees"] = $erreur->getMessage();
    $retour["statut"] = "erreur";
  }
  return $retour;
}

fichier controleur

$idActu = getIdActu();
while ($id = $idActu["donnees"]->fetch()) {
  var_dump($id["idActu"]);
  foreach ($id as $id["idActu"]) {
    $image = getImageActu($id["idActu"]);
    while($image = $image["donnees"]->fetch()){
      var_dump($image);
    }
  }
}

donc avec ça, je récupère bien tous mes ID. Mais je n'arrive pas à récupérer toutes les images.
Le premier var_dump, me donne ça :controleurAccueil.php:15:string '7' (length=1)

controleurAccueil.php:15:string '6' (length=1)

controleurAccueil.php:15:string '4' (length=1)

ontroleurAccueil.php:15:string '3' (length=1)

et le second, donne ça :
controleurAccueil.php:19:
array (size=10)
'idImage' => string '4' (length=1)
0 => string '4' (length=1)
'nomImage' => string 'ez' (length=2)
1 => string 'ez' (length=2)
'altImage' => string 'gez' (length=3)
2 => string 'gez' (length=3)
'idProjetImage' => string '3' (length=1)
3 => string '3' (length=1)
'idProjet' => string '3' (length=1)
4 => string '3' (length=1)

( ! ) Notice: Undefined index: donnees in controleurAccueil.php on line 18
Call Stack

Time Memory Function Location

1 0.0009 365432 {main}( ) ...\index.php:0
2 0.0014 365808 routeur( ) ...\index.php:19
3 0.0072 370704 require( 'controleurAccueil.php' ) ...\index.php:15

( ! ) Fatal error: Uncaught Error: Call to a member function fetch() on null in controleurAccueil.php on line 18
( ! ) Error: Call to a member function fetch() on null incontroleurAccueil.php on line 18
Call Stack

Time Memory Function Location

1 0.0009 365432 {main}( ) ...\index.php:0
2 0.0014 365808 routeur( ) ...\index.php:19
3 0.0072 370704 require( controleurAccueil.php' ) ...\index.php:15

je ne comprends pas vraiment pourquoi ça ne marche pas.
Je pense qu'il me récupère l'image associée au dernier id, mais je n'arrive pas à comprendre pourquoi il ne récupère pas toutes les images du dernier id, ainsi que les images des autres id.

Avez vous une petite piste svp ? Je bloque dessus depuis trop longtemps...

5 réponses


Ton pb vient du fait que tu gardes ta première requête ouverte alors que tu lances la deuxième
Il suffit juste de récupérer le résultat de la première dans un tableau avec fetchall
ensuite tu fermes le curseur avec closeCursor() puis tu récupères les images

bloum
Auteur

Hello, merci pour ta réponse.
J'ai fait ça

function getIdActu(){
  $db = connect();
  $sql = "SELECT idActu FROM Actu ORDER BY idActu DESC LIMIT 4";
  try {
    $retour["donnees"] = $db->query($sql);
    $retour["statut"] = "ok";
  } catch (PDOException $erreur) {
    $retour["donnees"] = $erreur->getMessage();
    $retour["statut"] = "erreur";
  }
  return $retour;
  $ret = $retour["donnees"]->fetchAll();
  $req->closeCursor();
  $img = getImageActu($retour["idActu"]);
}

mais ça ne fonctionne pas mieux.
Je suis totalement perdu là...

ton return est placé trop haut

function getIdActu(){
  $db = connect();
  $sql = "SELECT idActu FROM Actu ORDER BY idActu DESC LIMIT 4";
  try {
    $stmt = $db->query($sql);
    $retour["donnees"] = $stmt->fetchAll();
    $stmt->closeCursor();
    $retour["statut"] = "ok";
  } catch (PDOException $erreur) {
    $retour["donnees"] = $erreur->getMessage();
    $retour["statut"] = "erreur";
  }
    return $retour;
}

$idActu = getIdActu();
  var_dump($id["idActu"]);
  foreach ($row as $idActu['donnees']) {
    $image = getImageActu($row["idActu"]);
    while($image = $image["donnees"]->fetch()){
      var_dump($image);
    }
  }
}
bloum
Auteur

Je pense que je n'en suis plus très loin. Maintenant il me dit Undefined variable: row...
j'ai modifié le foreach($row as $idActu) par foreach($row as $idActu["donnees"])
et j'ai l'erreur de la variable inexistante

Edit : il suffisait d'inverser l'ordre des variables dans le foreach ^^
Par contre maintenant j'obtiens ça :

array (size=2)
'donnees' =>
array (size=4)
0 =>
array (size=2)
'idActu' => string '7' (length=1)
0 => string '7' (length=1)
1 =>
array (size=2)
'idActu' => string '6' (length=1)
0 => string '6' (length=1)
2 =>
array (size=2)
'idActu' => string '4' (length=1)
0 => string '4' (length=1)
3 =>
array (size=2)
'idActu' => string '3' (length=1)
0 => string '3' (length=1)
'statut' => string 'ok' (length=2)

controleurAccueil.php:10:
array (size=4)
0 =>
array (size=2)
'idActu' => string '7' (length=1)
0 => string '7' (length=1)
1 =>
array (size=2)
'idActu' => string '6' (length=1)
0 => string '6' (length=1)
2 =>
array (size=2)
'idActu' => string '4' (length=1)
0 => string '4' (length=1)
3 =>
array (size=2)
'idActu' => string '3' (length=1)
0 => string '3' (length=1)

( ! ) Warning: Illegal string offset 'idActu' in controleurAccueil.php on line 12
Call Stack

Time Memory Function Location

1 0.0010 365496 {main}( ) ...\index.php:0
2 0.0017 365872 routeur( ) ...\index.php:19
3 0.0083 370496 require( 'controleurAccueil.php' ) ...\index.php:15

controleurAccueil.php:14:
array (size=10)
'idImage' => string '6' (length=1)
0 => string '6' (length=1)
'nomImage' => string 'qsfe' (length=4)
1 => string 'qsfe' (length=4)
'altImage' => string 'fqs' (length=3)
2 => string 'fqs' (length=3)
'idActuImage' => string '7' (length=1)
3 => string '7' (length=1)
'idActu' => string '7' (length=1)
4 => string '7' (length=1)

( ! ) Notice: Undefined index: donnees in controleurAccueil.php on line 13
Call Stack

Time Memory Function Location

1 0.0010 365496 {main}( ) ...\index.php:0
2 0.0017 365872 routeur( ) ...\index.php:19
3 0.0083 370496 require( 'controleurAccueil.php' ) ...\index.php:15

( ! ) Fatal error: Uncaught Error: Call to a member function fetch() on null incontroleurAccueil.php on line 13
( ! ) Error: Call to a member function fetch() on null in controleurAccueil.php on line 13
Call Stack

Time Memory Function Location

1 0.0010 365496 {main}( ) ...\index.php:0
2 0.0017 365872 routeur( ) ...\index.php:19
3 0.0083 370496 require( 'controleurAccueil.php' ) ...\index.php:15

j'ai fait une erreur , sur le foreach il fallait préciser ['données']
apparemment tu l'as vu
désolé