2013-05-24 4 views
0

J'ai ce morceau de code qui fonctionne sur mon serveur de test XAMPP local. Le problème est, lorsqu'il est poussé vers le serveur de production, il casse. Ce n'est pas un problème avec la connexion à la base de données, et PHP/MySQL sont tous deux à 5.3 sur le serveur de production donc ce n'est pas l'utilisation des anciennes versions de l'un ou l'autre. Je pense que c'est l'utilisation de la boucle foreach au lieu de la boucle while plus standard; si c'est ça, pourquoi?PHP Foreach sur MySQLi Jeu de résultats

<?php 
    $res = $mysqli->query('DESCRIBE '.$table); 
    $columnCount = 0; 
    echo '<ul>'; 
    foreach($res as $field) { 
    if(in_array($field["Field"], $sheetData[0])) { 
     echo '<li>'; 
      //var_dump($field); 
     echo $field['Field'].' - '.$field['Type']; 
     echo "</li>\r\n"; 
     $columnCount++; 
    } 
    } 
    echo '</ul>'; 
?> 

EDIT: Pour clarifier, il casse en n'émettant rien du tout; lors de l'insertion d'une simple déclaration d'écho dans la boucle, il semble même ne pas l'exécuter.

EDIT2: J'ai ajouté une réponse ci-dessous qui va dans un peu plus de détails sur ce que le problème était réellement et pourquoi ce code fonctionne réellement dans certaines conditions.

+2

Comment ça casse? Quelles erreurs récupérez-vous de la base de données? – andrewsi

+0

vérifiez 'phpinfo' et assurez-vous que l'extension pour mysql est activée, et ajoutez une vérification d'erreur à votre code – ManseUK

+0

@andrewsi: J'ai ajouté plus de détails à la question. – moberemk

Répondre

4

Pour ce faire, à la place:

if ($result = $mysqli->query('DESCRIBE ' . $table)) { 
    $columnCount = 0; 
    echo '<ul>'; 

    /* fetch associative array */ 
    while ($field = $result->fetch_assoc()) { 
     if (in_array($field["Field"], $sheetData[0])) { 
      echo "<li>$field[Field] - $field[Type]</li>\r\n"; 
      $columnCount++; 
     } 
    } 

    echo '</ul>'; 

    /* free result set */ 
    $result->free(); 
} 
+0

Cela a fonctionné! Merci beaucoup. – moberemk

4

Donc, puisque j'ai demandé il y a ce vieillissement de la question que je me dis que je devrais le mettre à jour avec quelques précisions supplémentaires en disant ceci: ce que je faisais d'abord avec la boucle foreach fonctionne. L'inconvénient étant que cela ne fonctionne que dans PHP 5.4+ car c'est alors que la classe mysqli_result a implémenté l'interface Traversable. Cela signifie que vous pouvez itérer dessus en utilisant une boucle foreach dans les versions ultérieures de PHP. Ce changement n'était apparemment pas très bien connu au moment où j'ai posté ma question (mi-2013), probablement parce que de nombreux serveurs utilisent toujours 5.3 - probablement parce que c'est la dernière version de PHP disponible pour Ubuntu 12.x - ce qui limite son utilité aux serveurs récemment mis à jour. Mais quand vous êtes dans un environnement qui le supporte, c'est une technique totalement valable à utiliser.