Page 1 sur 2

Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 09:58
par kayorn
Bonjour,

Je reprends le script d'un site laissé à l'abandon, j'ai réussi à remettre un peu d'ordre dedans mais je bute sur ce pb sans pouvoir savoir comment dépanner.
J'ai recherché un peu partout... mais je ne trouve pas.

voilà le warning:

Code : Tout sélectionner

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 6 in /homez.443/
phpMyadmin
[img]
http://www.nutridelice.fr/bdd.jpg
[/img]

D'après mon pote, c'est ainsi depuis qu'il a demandé le transfert sur OVh, ça fonctionnait sans warning sur l'autre hébergeur et a priori, personne n'a touché au script.

la requète :
$requete=mysql_db_query($sql_bdd,"select * from actualites where Num=\"$Num\"",$db_link) or die(mysql_error());
La page sur laquelle on peut voir l'erreur:


http://www.nutridelice.fr/

aller sur le deuxième index et cliquer sur le lien Actualités.

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 10:05
par xTG
mysql_result() récupère une colonne du n-uplet courant dans le jeu de résultat.
Or le curseur est arrivé à la fin du jeu dans ton cas (indiqué par le message d'erreur).

Soit tu vas plus loin que le nombre de résultats renvoyés.
Soit ta requête ne renvoie aucun résultat.

Dans les deux cas il manque un test dans le code pour éviter ce genre d'erreur. Fais un test sur la fonction mysql_num_rows() pour savoir si la requête renvoie bien un résultat.
Et comme le drivers mysql n'est plus à jour, je te conseille de passer à mysqli (ou mieux à PDO).

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 10:35
par kayorn
merci de me répondre

var_dump de mysql_num_rows renvoie NULL

il y a quatre enregistrements dans la base, pourquoi cet index 6?

Pour ce qui est du reste de tes explications, et à mon grand regret, je ne capte pas grand-chose :|

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 11:15
par Ryle
Le problème vient du fait que la version et/ou la configuration de php de l'ancien hébergeur n'est pas la même que celle d'ovh.. du coup le code qui est semble-t-il dépendant de cette configuration, ne produit pas les mêmes résultats...

Montre nous le code de ton script Appel_Actualites.php (les 40 premières lignes devraient suffire d'après les messages d'erreur). Il doit effectivement manquer quelques tests pour s'assurer que les données en base ont bien été chargées et peuvent être affichées, avant de les afficher :)

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 11:45
par kayorn
Voici:

Code : Tout sélectionner

<?php require("Config.php"); $db_link = @mysql_connect($sql_serveur,$sql_user,$sql_passwd); if(!$db_link) {echo "Connexion impossible à la base de données <b>$sql_bdd</b> sur le serveur <b>$sql_server</b><br>Verifiez vos parametres ou reessayez plus tard"; exit;} $requete=mysql_db_query($sql_bdd,"select * from actualites where Num=\"$Num\"",$db_link) or die(mysql_error()); //$requete=mysql_db_query($sql_bdd,"select * from actualites",$db_link) or die(mysql_error()); $Num = $_GET['Num']; var_dump($mysql_num_rows); $Num=mysql_result($requete,0,"Num"); $Date=mysql_result($requete,0,"Date"); $Parution=mysql_result($requete,0,"Parution"); $Titre_Article=mysql_result($requete,0,"Titre_Article"); $Texte_Article=mysql_result($requete,0,"Texte_Article"); $PDV1=mysql_result($requete,0,"PDV1"); $PDV2=mysql_result($requete,0,"PDV2"); $PDV3=mysql_result($requete,0,"PDV3"); ?>

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 12:39
par xTG
Il y a fort à parier que le problème vient de $Num.
Je me rappelle plus le nom de cette configuration mais c'est une config dépréciée qui implique que toute variable globale peut être appelée via son nom d'index comme une simple variable.

Donc avant d'utiliser $Num (qui est en fait $_GET['Num']) il faut la récupérer (ce que tu fais mais plus loin).
$Num = $_GET['Num'];
Il serait bon aussi de vérifier cette donnée. Etant une variable d'url on peut lui mettre n'importe quoi !
Si tu attends un chiffre tu dois vérifier que c'en est un :
if( is_numeric($_GET['num']) )
Et surtout protéger les variables utilisées dans une requête SQL :
$Num = mysql_num_rows($Num);
$req = 'SELECT ...... WHERE num = '.$Num;

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 12:55
par Cyrano
Il y a fort à parier que le problème vient de $Num.
Je me rappelle plus le nom de cette configuration mais c'est une config dépréciée qui implique que toute variable globale peut être appelée via son nom d'index comme une simple variable.
register_globals qui est à OFF par défaut depuis la version 4.2 de PHP et ne sera plus disponible du tout (et encore moins modifiable) dans la prochaine version majeure de PHP, peut-être même avant ? 5.4 ou +) ?

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 13:23
par kayorn
j'ai commencé par remonter $Num = $_GET['Num']; en début de script mais j'ai toujours la même erreur.

en transformant la requête de cette manière, je n'ai plus de warnings,
$requete=mysql_db_query($sql_bdd,"select * from actualites ",$db_link) or die(mysql_error());
$num est récupérée quand-même.

par contre, quel que soit le lien affiché sur lequel je clique, le texte renvoyé de la bdd reste identique et n'a rien à voir avec ce que devrait afficher ...
$Texte_Article=mysql_result($requete,0,"Texte_Article");

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 13:32
par Cyrano
Fais voir ton code modifié, on ne devinera pas.

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 13:49
par kayorn
<?php
require("Config.php");

$db_link = @mysql_connect($sql_serveur,$sql_user,$sql_passwd);
if(!$db_link) 
{echo "Connexion impossible à la base de données <b>$sql_bdd</b> sur le serveur <b>$sql_server</b><br>Verifiez vos parametres ou reessayez plus tard"; exit;}


$requete=mysql_db_query($sql_bdd,"select * from actualites ",$db_link) or die(mysql_error());

//$requete=mysql_db_query($sql_bdd,"select * from actualites where Num=\"$Num\"",$db_link) or die(mysql_error());
$Num = $_GET['Num'];
$Num=mysql_result($requete,0,"Num");


$Date=mysql_result($requete,0,"Date");
$Parution=mysql_result($requete,0,"Parution");
$Titre_Article=mysql_result($requete,0,"Titre_Article");
$Texte_Article=mysql_result($requete,0,"Texte_Article");

$PDV1=mysql_result($requete,0,"PDV1");
$PDV2=mysql_result($requete,0,"PDV2");
$PDV3=mysql_result($requete,0,"PDV3");


$PDV1bis=$PDV1;
$PDV2bis=$PDV3;
$PDV3bis=$PDV3;




?>

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 14:05
par Cyrano
Ok, donc effectivement peu de changements : déplacement de l'initialisation de $Num et modification de la requête SQL.

Il y a un paquet de problèmes avec ce code :
- Ta variable $Num est d'abord définie avec la valeur postée dans l'url : admettons. Mais ensuite tu la redéfinis après l'exécution de la requête. Que se passera-t-il si aucun paramètre n'est envoyé avec l'url (et donc que $_GET['Num'] n'existe pas ?
- T'es-tu posé la question : « Que se passe-t-il si la requête ne retourne aucun résultat ? »

Ensuite, l'utilisation de mysql_fetch_assoc serait plus appropriée et permettrait d'écrire un peu moins de code, ce serait plus lisible. On l'utilise habituellement dans une boucle WHILE, mais comme tu ne veux qu'une seule ligne, on peut aussi l'utiliser dans un if. Un petit tour dans la doc sur les fonctions mysql te donnera plein d'exemples d'utilisation.

Tu dis qu'en modifiant la requête tu n'as plus l'erreur : comment interprètes-tu ça ?

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 17:43
par kayorn
je n'ai pas écrit de code du tout, je reprends un site existant et j'avoue que j'aurais mieux fait de réfléchir avant de me lancer, trop complexe pour moi qui n'ai fait que survoler le langage.
J'apprécie vraiment votre aide intelligente et didactique mais je ne me sens pas de le lancer dans l'apprentissage de php à mon âge.
Je pensais que l'erreur serait facile à déceler et en aucun cas refiler le travail à d'autres :D

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 17:49
par Cyrano
...je ne me sens pas de le lancer dans l'apprentissage de php à mon âge...
J'ai commencé à apprendre à programmer en PHP à 40 ans et je n'avais jamais programmé quoi que ce soit avant : objection rejetée :langue:

Mais bon, je vais être charitable et te donner des éléments de réponse avec ton code revu, corrigé et assorti de commentaires explicatifs :
<?php
/**
 * D'abord, on récupère la valeur de Num si elle existe.
 * On assigne la valeur à une variable indépendante :
 */
$NumInfo = (isset($_GET['Num'])) ? $_GET['Num'] : null;
/**
 * Si notre variable n'es pas nulle, on va récupérer les informations :
 */
if(!is_null($NumInfo))
{
    /**
     * In récupère les paramètres de configuration de la connexion à MySQL
     */
    require("Config.php");
    /**
     * On définit un message d'erreur de connexion
     */
    $msg_erreur = "Connexion impossible à la base de données <b>$sql_bdd</b> sur le serveur <b>$sql_server</b><br>".
    "Verifiez vos parametres ou reessayez plus tard";
    /**
     * On se connecte
     */
    $db_link = @mysql_connect($sql_serveur,$sql_user,$sql_passwd) or die($msg_erreur);
    /**
     * On définit la requête SQL :
     * --------------------------
     * PAS DE « SELECT * » On ne ramène pas tout en vrac, on
     * indique uniquement les colonnes dont on a besoin;
     */
    $sql  = "SELECT ".
            "  `Num`, ".
            "  `Date`, ".
            "  `Parution`, ".
            "  `Titre_Article`, ".
            "  `Texte_Article`, ".
            "  `PDV`, ".
            "  `PDV`, ".
            "  `PDV` ".
            "FROM actualites ".
            "WHERE Num = '". $NumInfo ."'";
    /**
     * On exécute la requête SQL.
     */
    $requete = mysql_db_query($sql_bdd, $sql, $db_link) or die(mysql_error());

    /**
     * On compte le nombre de résultats retournés :
     */
    $nb = mysql_num_rows($requete);
    /**
     * Si le nombre de résultats est supérieur à 0
     */
    if($nb > 0)
    {
        /**
         * On récupère la première ligne dans un tableau $ligne qui va 
         * nous servir à initialiser nos variables.
         */
        if(false !== ($ligne = mysql_fetch_assoc($requete)))
        {
            $Num            = $ligne["Num"];
            $Date           = $ligne["Date"];
            $Parution       = $ligne["Parution"];
            $Titre_Article  = $ligne["Titre_Article"];
            $Texte_Article  = $ligne["Texte_Article"];
            $PDV1           = $ligne["PDV1"];
            $PDV2           = $ligne["PDV2"];
            $PDV3           = $ligne["PDV3"];
        }
    }
    else
    {
        /**
         * Aucun résultat trouvé, on doit prévoir une alternavive
         * 
         * .....
         */
    }
}
else
{
    /**
     * Pas de paramètre de nouvelle.
     * Il faut prévoir une alternative
     * 
     * ......
     */
}
?>

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 19:38
par kayorn
J'ai commencé à apprendre à programmer en PHP à 40 ans et je n'avais jamais programmé quoi que ce soit avant : objection rejetée :langue:
Tu verras dans 16 ans :cry:

En tout cas mille fois merci pour ton aide je n'aurais pas été capable de trouver tout seul et j'aurais été obligé de tout refaire en html.

je vais quand même essayer de piger ce que tu m'as mis en commentaires.

Re: Warning "Unable to jump to row 0

Posté : 18 sept. 2011, 20:13
par Cyrano
J'ai commencé à apprendre à programmer en PHP à 40 ans et je n'avais jamais programmé quoi que ce soit avant : objection rejetée :langue:
Tu verras dans 16 ans
Ok, donc si je compte bien, en réalité ce sera dans 8 ans :langue:


Blague à part : j'ai justement mis les commentaires exprès, ils sont importants et donnent des indications plus qu'utiles.

J'ajouterais que si on faisait les choses complètement, on devrait en réalité commencer par écrire les commentaires et après y insérer le code, je veux dire par là que les commentaires décrivent les étapes d'un processus. Si on oublie une des étapes, on oubliera très probablement le code qui va avec. Mais il est largement plus facile de suivre un déroulement écrit dans notre propre langue plutôt qu'en PHP ou n'importe quel autre langage de programmation. Mais également, et ce n'est pas négligeable, si on a un bug, on l'identifiera beaucoup plus facilement en comprenant clairement ce qu'on a fait, ce qu'on a pu oublier et où (par « », entendre « à quel moment dans la chronologie du processus »)

Bon courage ;)