2010-11-22 20 views
1

Actuellement, j'utilise freetds pour me connecter à un serveur MSSql où j'utilise beaucoup de données de comptabilité. Les données tirent bien jusqu'à ce qu'il atteigne une valeur nulle. À ce stade, je ne reçois aucune erreur PHP. Au lieu de cela, j'obtiens l'erreur suivante dans le journal des erreurs Apache.Erreur d'erreur de segmentation PHP PDO sur une valeur de retour nulle

[Avis] enfant pid 10235 signal de sortie Segmentation fault (11)

je fait quelques recherches pour cela et trouvé this page, mais il n'a pas vraiment aider. La requête J'utilise ressemble à quelque chose comme ça,

SELECT DISTINCT(t1.PEREND), t2.ERATE, t2.EEXTEND, t2.EARNDED, t1.ENTRYSEQ 
     FROM UPCHKD as t1 LEFT JOIN 
      (SELECT EARNDED, PEREND, ERATE, EEXTEND, ENTRYSEQ FROM UPCHKD 
        WHERE (EARNDED LIKE '401K%'AND EARNDED NOT LIKE '401KL%') AND 
          EMPLOYEE = ? AND PEREND >= ? AND PEREND <= ?) as t2 ON t1.PEREND = t2.PEREND 
     WHERE t1.PEREND >= ? AND t1.PEREND <= ? AND t1.EMPLOYEE = ? ORDER BY PEREND 

Et je reçois les données en utilisant une boucle while comme suit,

while($result = $sth->fetch(PDO::FETCH_ASSOC)) { 
    //Deal with data here 
} 

Je ne peux pas dire si cela est un problème avec AOP, ma couche de base de données, MSSQL, ou ma requête. Aussi, je tiens à souligner que si je prends la requête et l'exécute manuellement en utilisant MSSQL studio, cela fonctionne bien, et montre les valeurs nulles correctement.

Répondre

0

Une solution à ce problème fonctionne en ajoutant si les déclarations nulles à toutes les colonnes de retour comme si,

ISNULL(t2.ERATE, 0) as ERATE, ISNULL(t2.EEXTEND, 0) as EEXTEND, ISNULL(t2.EARNDED, '') as EARNDED 

Si des valeurs nulles sont trouvées maintenant, elles sont renvoyées sous forme de zéros sans erreur. Ce n'est pas le plus joli, mais ça marche.

1

Les failles de segmentation ne sont pas amusantes à gérer. La meilleure réponse que je peux vous donner est de placer continuellement des appels die('okay'); dans différents endroits pour voir jusqu'où dans différents blocs de codage vous obtenez avant que vous ne rencontriez une faute de seg. (Vous ne verrez rien s'il y a un défaut de seg).

Il est également intéressant de juste essayer de mettre à niveau juste que tout les versions les plus récentes: PHP, PDO, etc.