2010-06-21 4 views
0

Je pense que c'est juste quelque chose que je n'ai pas rencontré auparavant!Erreur fatale, pas très bien pourquoi?

$r = $database->currentChallengers($f, $g); 
     while($row=mysql_fetch_assoc($r)) 
     { 
      $u[]=$row['username']; 
      $i[]=$row['userid']; 
      $s[]=$row['streak']; 
     } 

     for ($i = 0; $i < count($u); $i++) 
     { 
      foreach ($u as $user) 
      { 
       echo "Challenger: $u[$i]"; 
      } 
     } 

que PHP est pour la requête de base de données suivante:

function currentChallengers($f, $g) 
{ 
    $q = "SELECT k.userid, k.streak, u.username 
      FROM ".TBL_KOTH." k 
      INNER JOIN ".TBL_USERS." u 
      ON k.userid = u.id 
      WHERE k.format = '$f' && k.game = '$g' && k.king = '0' && k.done = '0' 
      ORDER BY k.userid"; 
    return mysql_query($q, $this->connection); 
} 

Je reçois l'erreur

Fatal error: [] operator not supported for strings

Sur la ligne

$u[]=$row['username'];

Quelqu'un pourrait me dire pourquoi cela arrive? En outre, le code que j'ai écrit doit-il indiquer chaque nom d'utilisateur de la requête? Merci

Répondre

2

PHP semble être en supposant que vos variables non initialisées sont des chaînes. See Pekka's Answer. Essayez d'initialiser/déclarer ces variables avant de commencer à y insérer des valeurs.

$u = array(); 
$i = array(); 
$s = array(); 
+2

Non, je viens de tester. Si $ u n'était pas initialisé, PHP le traiterait comme un tableau et lancerait un avis mais pas une erreur fatale. Cela signifie que '$ u' est utilisé ailleurs dans le code, et ne devrait pas être réinitialisé sans d'abord vérifier soigneusement. Ou le PO devrait utiliser des noms de variables significatifs en premier lieu pour éviter de telles confusions. –

+0

@Pekka intéressant, je suis corrigé. Je vais augmenter votre réponse, j'espère que Luc va changer la réponse acceptée. –

0

Essayez ceci, au lieu de tableaux:

  $u=$row['username']; 
      $i=$row['userid']; 
      $s=$row['streak']; 
0

Êtes-vous sûr que $ u est pas déjà défini? Initialisez-le avec $ u = array(); avant le premier "while" ...

0

Le problème semble venir du fait que $ u (et éventuellement $ s et $ i) semble être une chaîne.

Essayez d'ajouter:

$u = array(); 
$s = array(); 
$i = array(); 

avant:

$r = $database->currentChallengers($f, $g); 
2

Utilisez les noms de variables meaningfull. Vous avez utilisé $ u pour stocker une chaîne quelque part au-dessus de ce code. Vous avez probablement enregistré un nom d'utilisateur.

Donc, je recommande d'utiliser les variables $ username et $ users.

Et de définir $ users = array(); avant une boucle, comme proposé par Mike/

+0

+1 pour un bon conseil général de codage –

+0

+1 si vous voulez obscurcir votre code, il existe des outils automatiques pour cela. – greg0ire

1

Qu'essayez-vous de faire avec $u[]=$row['username'];? $u est actuellement une chaîne et vous ne pouvez pas écrire dans un index spécifique d'une chaîne (vous n'avez spécifié aucun index).

Si vous essayez de stocker des lignes dans des tableaux, déclarez-les comme des tableaux et utilisez une variable d'itération pour les stocker.

$u = array(); 
$i = array(); 
$s = array(); 
$k = 0; 
while($row=mysql_fetch_assoc($r)) 
{ 
    $u[$k] = $row['username']; 
    $i[$k] = $row['userid']; 
    $s[$k] = $row['streak']; 
    $k = $k + 1; 
} 
0

Vous devez ajouter $u = array() avant d'y accéder. Vous utilisez probablement d'autres $ u comme une chaîne dans une autre partie de votre script et PHP croit toujours que c'est la même chose.

3

Les autres réponses indiquent déjà ce que vous devez faire: Utiliser un tableau. Mais avant cela, vérifiez si $u etc. sont déjà utilisés ailleurs dans le code. Vous pourriez avoir des ennuis parce qu'ils peuvent déjà être utilisés ailleurs - comme des ficelles.

Et, vous devriez vraiment utiliser des noms de variables plus verbeux pour éviter de créer un cauchemar de maintenance. Pourquoi ne pas utiliser par exemple

 $username[] = $row['username']; 
     $userid[] = $row['userid']; 
     $streak[] = $row['streak']; 
    } 
Questions connexes