Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Notice: Undefined offset: ( PHP 4)

6 réponses
Avatar
Lea
Bonjour,

Le code suivant :

$i=0;
while($i<=sizeof($line)){
$dataPair=explode(",",$line[$i]);
if($dataPair[0]==$login){
$auth=1;
break;
}else{
$auth=2;
}
$i++;
}

me renvoie ceci :

Notice: Undefined offset: 5 in f:\...\...\script.php on line 40
Ce qui correspond à cette ligne : $dataPair=explode(",",$line[$i]);

Une idée?

Merci.

Léa

6 réponses

Avatar
RAKOTOMALALA Renaud
Le code suivant :

$i=0;
while($i<=sizeof($line)){
$dataPair=explode(",",$line[$i]);
if($dataPair[0]==$login){
$auth=1;
break;
}else{
$auth=2;
}
$i++;
}

me renvoie ceci :

Notice: Undefined offset: 5 in f:......script.php on line 40
Ce qui correspond à cette ligne : $dataPair=explode(",",$line[$i]);

Une idée?


avec $i=0; et while($i <= sizeof($line)

tu tombe dans la situation suivante, si $line (qui est un tableau si
j'ai bien suivi) est vide, la condition sera vrai malgré tout, ce qui
signifie que tu essayeras de faire un explode sur une valeur NULL ce qui
est interdit.

tu peux corriger soit par $i = 1; while($i <= sizeof($line)

ou

par $i = 0; while($i < sizeof($line);

qui plus est puisque le but est d'explorer un tableau j'aurais
personnellement procédé ainsi:

$auth = 2;
foreach($line as $value)
{
$tmp =(!empty($value))?explode(',',$value):'';

if(!empty($tmp) AND ($tmp[0] == $login))
$auth = 1;
}

Cdlt,
--
RAKOTOMALALA RENAUD
W-CONSULTING http://www.w-consulting.fr
Librenet Network http://www.librenet.net
InsideNetworks http://www.insidenetworks.net

Avatar
Stephane Pineau
Le 20 May 2004 17:45:08 GMT, "Lea"
écrivait:

$i=0;
while($i<=sizeof($line)){
$dataPair=explode(",",$line[$i]);
if($dataPair[0]==$login){
$auth=1;
break;
}else{
$auth=2;
}
$i++;
}

Notice: Undefined offset: 5 in f:......script.php on line 40


Suppose que ton tableau $line ne contient qu'un élément, sizeof renvoit 1,
par contre l'index de cet élément dans ton tableau est 0.

Tu vas donc rentrer dans la boucle à la première passe puisque $i=0 bien
inférieure ou égale à ton sizeof

Arrivé à la fin tu incrément $i qui devient 1, rebranchement sur ta
condition while, tu vas de nouveau rentrer dans la boucle puisque $i est
cette fois = à sizeof($line), mais $line[1] n'existe pas, tu n'avais qu'une
valeur dans ton tableau indexée $line[0], d'ou erreur sur la ligne suivante
qui tente d'accéder à un index de tableau inexistant.

De la même manière tu as une erreur de logique, puisqu'au cas ou
sizeof($line) te renvoit 0 (tableau vide) tu procède quand même au
traitement dans la boucle.

Enfin, tu demandes à PHP de recalculer la taille de $line qui ne ne varie
pas à chaque itération.

1ère solution :

$i=-1;
$max=sizeof($line);
while($i<$max){
$i++;
le reste de ton code....
}

2ème solution qui en fait est la plus adaptée, te pencher dans la
documentation sur la structure For each qui est tout spécialement adaptée à
l'examen séquentiel d'un tableau et évite d'avoir à utiliser un compteur
d'index.

Cdlt,
Stéph'

--
AcroDict : Dictionnaire francophone des acronymes informatiques
<URL:http://www.teaser.fr/~spineau/acrodict/index.htm>
PHP Page : Script PHP3 Gratuits (Forum, Gestionnaires BDD, etc..)
<URL:http://steph.pineau.free.fr/php/index.php>

Avatar
Lea
"Stephane Pineau" wrote in message
news:

$i=0;
while($i<=sizeof($line)){
$dataPair=explode(",",$line[$i]);
if($dataPair[0]==$login){
$auth=1;
break;
}else{
$auth=2;
}
$i++;
}



Est-ce qu'à la place je peux écrire :

$i=0;
while($i<sizeof($line)){
$dataPair=explode(",",$line[$i]);
if($dataPair[0]==$login && $dataPair[1]==$pass){
$auth=1;
break;
}else{
$auth=2;
$i++;
}
}

Léa


Avatar
Stephane Pineau
Le 22 May 2004 13:31:10 GMT, "Lea"
écrivait:

Est-ce qu'à la place je peux écrire :

$i=0;
while($i<sizeof($line)){
$dataPair=explode(",",$line[$i]);


En retirant ton test d'égalité sur le while effectivement tu vas régler ton
problème qui se produit autrement systématiquement après le dernier
enregistrement de ton tableau $line.

Par contre tu ne gères toujours pas le cas ou ton tableau $line ne contient
aucun élément ($i=0 et sizeof($line)=0), dans ce cas le code dans ta boucle
sera quand même exécuté avec une erreur à la clé. Ca ne te gènes peut-être
pas parcque tu est sure que ton tableau $line ne sera jamais vide...mais bon
autant prendre de bonnes habitudes.

Pour vraiment être sure de ne pas avoir d'erreur il faut que tu remplaces
tes deux premières lignes par :

$i=-1;
$max=sizeof($line); '<- pour éviter le recalcul du sizeof à chaque boucle
while($i<$max){
$i++;

et bien sur que tu enlève le $i++ à la fin de ton code initial.

Par contre comme dit dans le précédent post, la méthode la plus propre et
plus rapide est celle basée sur une boucle for each dont Renaud t'as donné
un exemple.

Cldt,
Stéph'


--
AcroDict : Dictionnaire francophone des acronymes informatiques
<URL:http://www.teaser.fr/~spineau/acrodict/index.htm>
PHP Page : Script PHP3 Gratuits (Forum, Gestionnaires BDD, etc..)
<URL:http://steph.pineau.free.fr/php/index.php>

Avatar
Akades
Stephane Pineau wrote:

Le 22 May 2004 13:31:10 GMT, "Lea"
écrivait:

Est-ce qu'à la place je peux écrire :

$i=0;
while($i<sizeof($line)){
$dataPair=explode(",",$line[$i]);


En retirant ton test d'égalité sur le while effectivement tu vas régler
ton problème qui se produit autrement systématiquement après le dernier
enregistrement de ton tableau $line.

Par contre tu ne gères toujours pas le cas ou ton tableau $line ne
contient aucun élément ($i=0 et sizeof($line)=0), dans ce cas le code dans
ta boucle sera quand même exécuté avec une erreur à la clé.


Non, pour que la boucle s'exécute au moins une fois le test doit valoir
'vrai'. Or c'est faux meme la premiere fois si le tableau $line est vide,
puisque la condition requiert que $i soit inférieur à 0, dans le cas d'un
tableau vide, soit -1. Valeur que sizeof() ne renvoie jamais. Donc,
impossible de rentrer dans la boucle avec un tableau vide.

Meme si foreach() peut s'avérer plus efficace dans ce cas précis, While()
est plus souple et permet de sortir de la boucle proprement en provoquant
la condition à 'vrai' dans un cas exceptionnel avant la fin de la boucle.

@++


Avatar
Stephane Pineau
Le 23 May 2004 00:57:30 GMT, Akades écrivait:

$i=0;
while($i<sizeof($line)){
$dataPair=explode(",",$line[$i]);



Non, pour que la boucle s'exécute au moins une fois le test doit valoir
'vrai'. Or c'est faux meme la premiere fois si le tableau $line est vide,


Oupss merci d'avoir relevé cette énormité dans mon message...

Meme si foreach() peut s'avérer plus efficace dans ce cas précis, While()
est plus souple et permet de sortir de la boucle proprement en provoquant
la condition à 'vrai' dans un cas exceptionnel avant la fin de la boucle.


En php tu peux sortir de n'importe quel type boucle selon une condition
donnée par l'instruction break et celà fonctionne également pour les boucles
foreach().

Cdlt,
Stéph'

--
AcroDict : Dictionnaire francophone des acronymes informatiques
<URL:http://www.teaser.fr/~spineau/acrodict/index.htm>
PHP Page : Script PHP3 Gratuits (Forum, Gestionnaires BDD, etc..)
<URL:http://steph.pineau.free.fr/php/index.php>