firstchild null : pourquoi, comment ?

Eléphanteau du PHP | 19 Messages

14 févr. 2012, 12:51

J'essaie d'implémenter une aide à remplir un champ par auto-complétion. Ça marche ... sauf quand ça coince.
Pour une raison que je ne m'explique pas le navigateur me met parfois une fenêtre d'alerte me signalant un FirstChild null.

Pourtant le mot demandé existe bel & bien. J'en perds mon PHP, mon javascript et mon latin.
Voilà les codes :

1 - testajax.php
<?php
header('Content-Type: text/xml ; charset = ISO-8859-1');
include ('connect.inc.php');

$dom = new DOMDocument();
$respont = $dom->createElement('respont');
$dom->appendChild($respont);

$name = $_GET['name'];
$kinnigou = mysql_query("SELECT poz FROM ajaks WHERE poz LIKE '".$name."%"."' LIMIT 20");
while ($linenn = mysql_fetch_array($kinnigou))
{
$kinnig = $dom->createElement('kinnig');
$kinnigText = $dom->createTextNode("$linenn[poz]");
$kinnig->appendChild($kinnigText);
$respont->appendChild($kinnig);
}

$xmlString = $dom->saveXML();
echo $xmlString;

mysql_close();
?>
2 - la partie concernée en javascript

Code : Tout sélectionner

function handleRequestStateChange() { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) // || xmlHttp.status == 304) { try { handleServerResponse(); } catch(e) { alert("Erreur de lecture de la réponse : " + e.toString()); } } else { alert("Problème d'obtention des données :\n" + xmlHttp.statusText); } } } function handleServerResponse() { var xmlResponse = xmlHttp.responseXML; xmlRoot = xmlResponse.documentElement; kinnigArray = xmlRoot.getElementsByTagName("kinnig"); var html = ""; for (var i=0; i<kinnigArray.length; i++) {html += kinnigArray.item(i).firstChild.data + "<br/>";} var xmlResponse = xmlHttp.responseText; var myDiv = document.getElementById("goulakaat"); myDiv.innerHTML = html; }
La table ajaks contient une série de mots triés alphabétiquement. Si je tape dans mon formulaire la lettre b, j'obtiens bien les 20 premiers mots commençant par cette lettre. Idem avec ba et même bar. Mais si je tape barr, cela provoque l'erreur mentionnée (exactement : kinnigArray.item(i).firstChild is null), alors que ma table contient des mots commençant par barr...

Merci de votre aide

Eléphanteau du PHP | 19 Messages

22 févr. 2012, 20:49

Je me réponds à moi-même, car si je suis loin d'avoir compris le problème, j'en ai au moins cerné la cause.

J'ai eu l'idée de modifier le fichier testajax.php pour qu'il ne crée plus un fichier XML d'après une variable, mais j'ai au contraire codé "en dur" le mot qui pose problème :
<?php
header('Content-Type: text/xml ; charset = ISO-8859-1');
include ('connect.inc.php');

$dom = new DOMDocument();
$respont = $dom->createElement('respont');
$dom->appendChild($respont);

$name = $_GET['name'];
$kinnigou = mysql_query("SELECT poz FROM ajaks WHERE poz LIKE 'barr%' LIMIT 20"); // la modif est LÀ
while ($linenn = mysql_fetch_array($kinnigou))
{
$kinnig = $dom->createElement('kinnig');
$kinnigText = $dom->createTextNode("$linenn[poz]");
$kinnig->appendChild($kinnigText);
$respont->appendChild($kinnig);
}

$xmlString = $dom->saveXML();
echo $xmlString;

mysql_close();
?>
Et voilà ce que ça donne quand je l'appelle (remarquer la 3ème ligne):

[img]
http://geriaoueg.free.fr/essai/testajax.png
[/img]

Je ne vois pas ce qui peut provoquer ce <kinnig/> à l'origine du firstChild null ??!?

Mon phpMyAdmin me montre ceci après la même requête MySQL :

[img]
http://geriaoueg.free.fr/essai/phpmyadmin.png
[/img]

Quelqu'un a une idée ?

ViPHP
xTG
ViPHP | 7331 Messages

22 févr. 2012, 21:08

Semblerait un problème d'encodage vu que tu as des lettres qui disparaissent.

Eléphanteau du PHP | 19 Messages

23 févr. 2012, 13:33

J'y ai pensé aussi mais je ne sais pas quoi faire. J'avais pensé passer ma base en uft-8 mais du coup l'affichage des caractères spéciaux (nombreux ñ) déconnait.

Eléphant du PHP | 179 Messages

23 févr. 2012, 14:01

Peu être une de tes pages qui à un encodage différent ? à méditer ( notepad++ gère bien les encodages )

Eléphanteau du PHP | 19 Messages

23 févr. 2012, 18:53

J'ai vérifié dans Geany : tous les fichiers sont codés en ISO-8859-1...

Peut-être faut-il encoder $linenn[poz] dans la ligne suivante
 $dom->createTextNode("$linenn[poz]");
mais je ne sais pas avec quelle fonction..

Eléphant du PHP | 179 Messages

23 févr. 2012, 18:57

j'essaie toujours les utf8_encode() ou utf8_decode() en prems quand j'ai des problèmes d'accent, mais la t'es en ISO, enfin ca ne coute rien d'essayé ( ta bdd est encodé en quoi ?)

Eléphanteau du PHP | 19 Messages

23 févr. 2012, 19:21

Youpiii, j'ai résolu mon problème de la façon suivante:
j'ai modifié :
$kinnigText = $dom->createTextNode("$linenn[poz]"); 
en :
$encoded=htmlentities ("$linenn[poz]", ENT_QUOTES, 'ISO-8859-1');
$kinnigText = $dom->createTextNode("$encoded"); 
et ça marche.
Un grand merci à Thibaud et xTG pour leur aide et aux mainteneurs du forum sans qui nous ne pourrions en profiter.
(j'espère avoir bien mis le 'résolu', je ne suis pas trop sur).

J'ai d'autres soucis que je vais tenter de résoudre moi-même avant de créer si nécessaire un autre fil.
Tchao, kenavo & merci encore !