71 votes

Ce qui cause : "Avis : Uninitialized string offset" apparaît ?

J'ai un formulaire que les utilisateurs remplissent, et sur le formulaire il y a plusieurs champs identiques, comme "nom du projet", "date du projet", "catégorie", etc. En fonction du nombre de formulaires qu'un utilisateur soumet, mon objectif est de :

  1. boucle sur le nombre de formulaires
  2. créer des instructions d'insertion SQL individuelles

Cependant, PHP me lance un AVIS que je ne semble pas comprendre :

Avis :

Avis : Chaîne non initialisée, décalage : 1 ...dataPasser.php on line 90

PHP

$myQuery = array();

if ($varsCount != 0)
{
  for ($i=0; $i <= $varsCount; $i++)
  {
    $var = "insert into projectData values ('" . $catagory[$i] . "', '" .  $task[$i] . "', '" . $fullText[$i] . "', '" . $dueDate[$i] . "', null, '" . $empId[$i] ."')";
    array_push($myQuery, $var);     
  }
}

Il existe des références au problème que je rencontre, mais elles ne sont pas exactes et j'ai du mal à déduire d'où vient le problème. J'apprécierais grandement toute aide pour comprendre ce qui fait que le tableau ne s'initialise pas correctement.

0 votes

Vous laissez beaucoup de choses de côté dans l'exemple, mais quel est le résultat de var_dump($myQuery) ?

0 votes

Où se trouve la ligne 90, et quel est l'avis complet ?

1 votes

Je voulais juste ajouter que vous n'avez pas du tout besoin d'utiliser array_push ici. Faites simplement ceci. $myQuery[] = $var ;

69voto

zombat Points 46702

Cette erreur se produirait si l'une des variables suivantes était en fait une chaîne ou une valeur nulle au lieu d'un tableau, auquel cas il faudrait y accéder avec la syntaxe des tableaux $var[$i] reviendrait à essayer d'accéder à un caractère spécifique dans une chaîne de caractères :

$catagory
$task
$fullText
$dueDate
$empId

En bref, tout ce qui se trouve dans votre requête d'insertion.

Peut-être que le $catagory variable est mal orthographié ?

1 votes

Mec, j'ai juste envie de me frapper dans la tête. BIEN SÛR ! Il n'y a qu'un seul $empId unique. J'étais concentré sur le tableau $myQuery et je n'ai pas fait attention aux autres. Merci beaucoup ! J'ai changé $empID[$i] en $empId et l'avis a disparu car $empId n'est PAS un tableau.

0 votes

Je pense qu'une partie de la confusion ici est que lorsque l'indexation $var[$i] il peut s'agir d'une chaîne ou d'un tableau...

0 votes

+1 pour une réponse parfaite (Y) ... !

15voto

cletus Points 276888

Cela signifie que l'un de vos tableaux n'est pas vraiment un tableau.

Au fait, votre contrôle "if" est inutile. Si $varsCount est égal à 0, la boucle for ne s'exécutera pas de toute façon.

0 votes

Oui, j'ai déjà vu ce commentaire. Malheureusement, je ne comprends pas pourquoi ce n'est pas un tableau ? J'envoie les données dans FirePHP et je les vois via le POST et ensuite dans les variables également.

0 votes

Ok merci, je n'ai posté qu'une partie du code pour le rendre facile à lire. Merci encore !

10voto

blackbee Points 682

L'erreur peut se produire lorsque le nombre de fois où vous itérez le tableau est supérieur à la taille réelle du tableau. par exemple :

 $one="909";
 for($i=0;$i<10;$i++)
    echo ' '.$one[$i];

affichera l'erreur. Dans le premier cas, vous pouvez prendre le mod de i par exemple

function mod($i,$length){
  $m = $i % $size;
  if ($m > $size)
  mod($m,$size)
  return $m;
}

for($i=0;$i<10;$i++)
{
  $k=mod($i,3);
  echo ' '.$one[$k];
}

ou peut-être que ce n'est pas un tableau (peut-être que c'était une valeur et que vous avez essayé d'y accéder comme à un tableau) par exemple :

$k = 2;
$k[0];

4voto

Kiki974 Points 11

Essayez de tester et d'initialiser vos tableaux avant de les utiliser :

if( !isset($catagory[$i]) ) $catagory[$i] = '' ;
if( !isset($task[$i]) ) $task[$i] = '' ;
if( !isset($fullText[$i]) ) $fullText[$i] = '' ;
if( !isset($dueDate[$i]) ) $dueDate[$i] = '' ;
if( !isset($empId[$i]) ) $empId[$i] = '' ;

Si $catagory[$i] n'existe pas, vous en créez un (non initialisé) ... c'est tout ; => PHP essaie de lire sur votre table dans l'adresse $i mais à cette adresse, il n'y a rien, cette adresse n'existe pas => PHP vous renvoie un avis, et il ne vous met rien à la chaîne. Donc votre code n'est pas très propre, il consomme des ressources qui diminuent les performances de votre serveur (juste un peu).

Faites attention aux valeurs par défaut de vos tables MySQL

if( !isset($dueDate[$i]) ) $dueDate[$i] = '0000-00-00 00:00:00' ;

ou

if( !isset($dueDate[$i]) ) $dueDate[$i] = 'NULL' ;

0 votes

D'accord, mais si c'est censé être un tableau, if(!isset($myarray[$i])) $myarray[$i]=array(); peut-être ?

2voto

zbee Points 6

Vérifiez le contenu de votre tableau avec

echo '<pre>' . print_r( $arr, TRUE ) . '</pre>';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X