Un probleme mysql+php retour de requete vide

Résolu/Fermé
burnedsyn Messages postés 170 Date d'inscription samedi 29 septembre 2007 Statut Membre Dernière intervention 21 février 2009 - 1 nov. 2007 à 12:52
burnedsyn Messages postés 170 Date d'inscription samedi 29 septembre 2007 Statut Membre Dernière intervention 21 février 2009 - 1 nov. 2007 à 21:53
Bonjour,

Voila j'ai comme configuration de travail ceci :

un machine portable avec win xp pro et wamp 5 installé dessus.
j'ai une base de donnée dans laquelle j'ai plusieurs tables de news (une par langue activée dans la config du site).
le nommage des tables est news$lang (code fr en de etc)

structure générale des tables news
CREATE TABLE `newsen` (
  `id` int(11) NOT NULL auto_increment,
  `titre` varchar(50) collate utf8_bin NOT NULL,
  `textenews` longtext collate utf8_bin NOT NULL,
  `auteur` int(11) NOT NULL,
  `date` date NOT NULL,
  `status` tinyint(1) NOT NULL,
  `translated` tinyint(1) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `titre` (`titre`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin ;


a l'interieur de ces tables j'ai plusieurs records.

tout est ok a l'affichage et a l'ajout des news de bases
je vous explique le mieux possible car cette erreur je ne la comprend vraiment pas.

lorsque que l'on ajoute une news cela se fais a la base en français, et lors de la création de la news les autres tables sont aussi mises a jours avec le drapeau tranlated a zéro.

dans le module de gestion des news lorsque qu'il detectes des news non traduites il le dis et mets un lien avec le paramètre de la langue selectionnée :

http://217.136.35.18/ackros/controladmin/index.php?tp=addnews&lang=en

A partir de ce lien rien ne vas plus
un bete select * from newsen renvois un set vide...

je vous mets le code complet ci après.

   <?php
       
   if(isset($_GET['lang']))
      {
         //$news=array();
         $lang=$_GET['lang'];
         $query="SELECT * FROM newsen";
         //$query="select * from newsen";
         $resi= mysql_query($query)or die ('erreur :'.mysql_error());
         $nb=0;
         while($t=mysql_fetch_object($resi));
         {
            var_dump($t);
            $news[$nb]['id']=$t->id;
            $news[$nb]['titre']=$t->titre;
            $news[$nb]['textenews']=$t->textenews;
            $nb++;
            echo("<br>");
            var_dump($news);
         }
         for($a=0;$a<$nb;$a++)
         {
            print_r($news);
         $baseid=$news[$a]['id'];
         $query="SELECT * from newsfr where id=$baseid";
        echo("<br>$query<br>");
         $subres=mysql_query($query)or die ('erreur :'.mysql_error());
        
         $tmp=mysql_fetch_object($subres);
         $news[$a]['basetitre']=$tmp->titre;
         $news[$a]['basestextenews']=$tmp->textenews;
        echo <<< EOT
   <input type="checkbox" name="artid[]" value="$baseid" />
   
   EOT;
   
         }
      exit();
      }
   if(isset($_POST['add']))
   {
      $auteur=$_SESSION['id'];
      $titre=$_POST['Titre'];
      $textenews=$_POST['textenews'];
      $status=1;
      $translated=1;
      
      $query="insert into newsfr value('','$titre','$textenews','$auteur',NOW(),'$status','$translated')";
      mysql_query($query) or die (mysql_error());
      
      $sub="select * from sitelang";
      $subres=mysql_query($sub) or die(mysql_error());
      $a=0;
   while($row=mysql_fetch_row($subres))
   {
      $lang[$a]=$row[1];
      $a++;
   }
   $translated=0;
   
   for ($b=0;$b<count($lang);$b++)
      {
         $lg=$lang[$b];
         if($lg!='fr')
         {
         $query="insert into news".$lg." value('','$titre','$textenews','$auteur',NOW(),'$status','$translated')";
      mysql_query($query) or die (mysql_error());
         }
         
      }
     echo <<< EOM
           news  enregistré.
           <meta http-equiv="refresh" content="02;url=./index.php?tp=addnews">
   EOM;
   exit();
   }
   
   
   ?>
   <hr>
      <span class="note1">Ajout de news</span><br>
      L'ajout se fait en français puis les news sont<br>
      placées dans les tables des différentes langues<br>
      à fin de traduction.<br>
      <form name="addnews" action="" method="POST" enctype="application/x-www-form-urlencoded">
         
         Titre : <input type="text" name="Titre" value="" size="50" maxlength="50"  min="" max="" accept=""/><br>
         textenews :<textarea name="textenews" cols="50" rows="10" wrap="SOFT"></textarea>
         <br>
         <input type="submit" name="add"/><input type="reset"/>
      
      </form>
   <hr>
       <span class="note1">Gestion rubrique news</span><br>
     <?php
        $sub="select * from sitelang";
      $subres=mysql_query($sub) or die(mysql_error());
      $a=0;
   while($row=mysql_fetch_row($subres))
   {
      $lang[$a]=$row[1];
      $a++;
   }
   $translated=0;
   
   for($c=0;$c<$a;$c++)
      {
         $tmplang=$lang[$c];
         $query="select count(id) from news".$tmplang." where translated='".$tranlated."'";
         $tmpres=mysql_query($query) or die(mysql_error());
         $obj=mysql_fetch_array($tmpres);
         if($obj[0]!=0)
         {
         echo ("<span class=\"note1\">".$obj[0]." news en attente de traduction langue code : $tmplang </span>");
         echo <<< EOT
        <br> <a href="?tp=addnews&lang=$tmplang">Afficher & traduire</a>
       
   EOT;
         }
      }
     ?>


ET pourtant ce code d'affichage ci après fonctionne parfaitement...
<?php
$table="news".$_SiteLang;

$query="SELECT * FROM $table WHERE status='1'";
$res=mysql_query($query)or die(mysql_error());
while($t=mysql_fetch_object($res))
    {
        if($t->translated!=1)
        {
            $color="nottranslated";
        }
        else
        {
            $color="translated";
        }
   ?>
   <span>
    <table width="400px">
        <tr>
            <td colspan='2' class="newstitle"><?php echo htmlentities($t->titre) ;?></td>
        </tr>
        <tr><td colspan='2' class="<?php echo $color;?>" >
                <?php echo $t->textenews; ?>
            </td>
            
            
        </tr>
        <tr>
            <td><?php echo$t->date; ?></td>
            <td><?php
                    $query="SELECT * from zcontrole where id=".$t->auteur;
                    $sub=mysql_query($query)or die(mysql_error());
                    $user=mysql_fetch_object($sub);
                    
                    echo $user->Aname;
                    
                ?>
            </td>
        </tr>
    </table>
    </span>
   
<?php    }
?>

Voila si quelqu'un a une idée ce serait le bienvenu merci de votre lecture et pardonnez la longueur de ce post
Tim
A voir également:

9 réponses

Salut,

pourquoi as tu mis:

collate utf8_bin

essayes en mettant latin_bin1

sinon fais des echos pour voir ce que tu as réellement, si la valeur recherchée existe bien dans le champ
0
burnedsyn Messages postés 170 Date d'inscription samedi 29 septembre 2007 Statut Membre Dernière intervention 21 février 2009 16
1 nov. 2007 à 13:39
en fais j'ai repris le code de phpmyadmin directement pour montrer l'exemple de la table... je sais pas pourquoi ce drapeau est activé.

pour les echos j'en ai fais plein avant d'écrire sur ce poste car au départ j'ai eu toujours au meme endroit du code et nulle part ailleur une fausse erreur de syntax un bug de mysql qui en fait renvois une erreur de syntaxe lorsque que l'un des champ a un mot reserver non echappé comme nom.

bref y avait des echo de tous et a tous les moment la query etait bonne je la fais dans phpmyadmin et elle marche (enfin c'est une bete query select * from table...) et elle retourne un set vide null

c'est plus complexe que cela n'en a l'air
0
burnedsyn Messages postés 170 Date d'inscription samedi 29 septembre 2007 Statut Membre Dernière intervention 21 février 2009 16
1 nov. 2007 à 13:54
voici ce qui s'affiche en ajoutant des echo var dump et print r aux endroit ou c'est nécessaire

SELECT * FROM newsen <<< la query fautive
le premier et seul set de donnée en retour avec des valeur null
bool(false) et un dump de news un tableau Array
array(1) { [0]=> array(3) { ["id"]=> NULL ["titre"]=> NULL ["textenews"]=> NULL } } Array ( [0] => Array ( [id] => [titre] => [textenews] => ) )
SELECT * from newsfr where id=
erreur :You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line

Encore une fois cela n'interviens que dans la condition que $GET['lang'] soit reçu le reste du code fonctionne a merveille

0
Salut,

as tu mis:

$query="SELECT * from newsfr where id=$_GET['lang']"

essayes:

$query="SELECT *FROM newsfr WHERE id='".$_GET['lang']."'"


et avec des majuscules c'est plus facile à lire, donc a debugger
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
burnedsyn Messages postés 170 Date d'inscription samedi 29 septembre 2007 Statut Membre Dernière intervention 21 février 2009 16
1 nov. 2007 à 18:56
non et cela ne serait d'aucune aide...

la query etant $query="SELECT * FROM newsen";
je ne vois pas pourquoi ajouter une condition a cela vu que ca lante sur ce select qui tant que la table contient des données devrait retourner un resultat non nul!!!

lis mieux tu verras que la query fautive n'est pas la deuxième celle de newsfr mais bien le retour vide de la première select *from newsen

enfin je veux dire y a rien qui te choque dans ce que j'écris ?
tim
0
Bonsoir,

une suggestion peut être toute bête:

Puisque tu fais un var_dump($t)
ne faudrait-il pas que tu fasses juste après un reset($t);
pour remettre le pointeur de l'array à zéro ??
0
burnedsyn Messages postés 170 Date d'inscription samedi 29 septembre 2007 Statut Membre Dernière intervention 21 février 2009 16
1 nov. 2007 à 21:38
non car le var duvar dump est la uniquement pour montrer l'etat de $t en plus ne deplace pas le pointeur interne.

ne trouvant pas de solution j'ai externaliser le process (dans un autre fichier) et la ca marche pourquoi ou qu'est ce je ne sais pas
bref ce thread n'est plus necessaire

tim
0
ah !

var_dump() est similaire à print_r()

alors j'ai lu ça sur le site php.net:

"Gardez en tête que print_r() place le pointeur de tableau à la fin du tableau. Utilisez reset() pour le ramener au début."
0
burnedsyn Messages postés 170 Date d'inscription samedi 29 septembre 2007 Statut Membre Dernière intervention 21 février 2009 16
1 nov. 2007 à 21:53
pardonne mioi c'est possible toutefois je n'ai eu aucuns probleme avec var-dump ou print_r sans faire de reset du tableau

sorry si je me suis trompé en affirmant que var dump ne deplacais pas le pointeur

tim
0