AJAX tabel volgorde probleem

Pagina: 1
Acties:

  • keet1
  • Registratie: Maart 2007
  • Laatst online: 04-08-2020
Hallo,

Ik heb een formulier met 2 kolommen.
Zie http://www.deskuddebuikkies.nl/AJAX/volgorde.php
In het voorbeeld heb ik 4 soorten fruit en het aantal van die soorten.
Het aantal kan ik veranderen en als ik dat doe in het tekstvak wordt de waarde in mysql opgeslagen en wordt de tabel opnieuw weergegeven met de nieuwe waarde.
Nu heb ik het zo gemaakt dat de tabel met het minste aantal bovenaanstaat.

Alleen is het probleem dat hij de waardes van de eerste tabel onthoud.

Ik heb bv in de bovenste kolom banaan staan met aantal 12.
Als ik deze verander naar 121 gaat hij veranderen in de tabel.
In de rij waar eerst banaan in stond staat nu perzik met aantal 11.
Als ik deze waarde verander verandert hij die van banaan en niet die van perzik.

Weet iemand hoe ik dit kan oplossen?

Bvd.

Dit is de code


volgorde.php

[code = p h p]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<script type="text/javascript" src="order.js"></script>
<head>
<title></title>

</head>

<body>
<div id="nainvullen">
<?
include("formulier.php");
?>
</div>


</body>

</html>
[/code = p h p]

formulier.php

[code = p h p]
<?
$q=$_GET["q"];
$q2=$_GET["q2"];

include("connect.php"); //mysql verbinding

if ($q!="")
{
$query ="UPDATE aantalfruit SET aantal=$q WHERE soort= '".$q2."'";
mysql_query($query);
}

//$sql="SELECT * FROM aantalfruit";
$sql="SELECT * FROM aantalfruit ORDER BY aantal ASC";
$result = mysql_query($sql);


$i=0;
while($row = mysql_fetch_array($result))
{
$aantal=$row['aantal'];
$soort=$row['soort'];

echo"<script> var jstest$i = '$soort'; </script>";

echo "<table border='1'>";
echo "<tr>";
echo "<th><input type=\"text\" id=\"$aantal\" onkeyup=\"volgordeFunction(this.value,jstest$i)\" value=\"$aantal\"></th>";
echo "<th><input type=\"text\" id=\"$soort\" value=\"$soort\"></th>";
echo "</tr>";
echo "<tr>";
echo "<td></td>";
echo "<td></td>";
echo "</tr>";
echo "</table>";

$i++;
}
?>
[/code = p h p]

order.js

[code = js]
var xmlHttpqw

function volgordeFunction(str1,str2)
{
xmlHttpqw=GetXmlHttpObject()
if (xmlHttpqw==null)
{
alert ("Browser does not support HTTP Request");
return;
}
alert("ALERT "+str1+" Q2 "+str2);
var url="formulier.php";
url=url+"?q=" + str1 + "&q2=" + str2;
url=url+"&sid="+Math.random();
xmlHttpqw.onreadystatechange=stateChanged;
xmlHttpqw.open("GET",url,true);
xmlHttpqw.send(null);

}

function stateChanged()
{
// var objID="nainvullen";
// var serverPage="formulier.php";
// var obj = document.getElementById(objID);
// ajaxDisplay.open("GET",serverPage);

if (xmlHttpqw.readyState==4 || xmlHttpqw.readyState=="complete")
{
var ajaxDisplay = document.getElementById('nainvullen');
ajaxDisplay.innerHTML = xmlHttpqw.responseText;
}

}

function GetXmlHttpObject()
{
var xmlHttpqw=null;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttpqw=new XMLHttpRequest();
}
catch (e)
{
//Internet Explorer
try
{
xmlHttpqw=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttpqw=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttpqw;
}
[/code = js]

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 09-10 21:36
Klopt de aanroep van de functie volgordeFunction wel?

echo "<th><input type=\"text\" id=\"$aantal\" onkeyup=\"volgordeFunction(this.value,jstest$i)\"

de 2e paramater is 'jstest$i'?

Kun je daar sowieso niet beter $row['soort'] gebruiken i.p.v. $i?

  • keet1
  • Registratie: Maart 2007
  • Laatst online: 04-08-2020
Het aanroepen klopt volgens mij wel.
Het probleem is dat de id's in de tekstvakken niet lijken te veranderen, maar de value's veranderen wel waardoor het verkeerde getal aan het verkeerde stuk fruit gekoppeld wordt.
Zie voorbeeld http://www.deskuddebuikkies.nl/AJAX/volgorde.php

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

  1. Gebruik [code = p h p] of js maar dan met wat minder spaties om je code duidelijker weer te geven voor ons (highlighting)
  2. Als je de geretourneerde HTML eerst alert, klopt het dan?
  3. Kloppen de gegevens in je database?
Je trekt de gegevens uit de database en ik neem aan dat het daar dan in klopt. Als dan de geretourneerde HTML in je alert nog klopt, dan loop je waarschijnlijk tegen een freaky uitzondering aan met innerHTML. In dat geval moet je echt direct in het DOM aan de slag, createElement en dat soort zaken.

Als het al eerder fout gaat (de geretourneerde HTML of wat in je database staat) dan zit de fout daar dus in, maar ik heb die code niet erg aandachtig gelezen (lastig zonder highlighting).

[ Voor 60% gewijzigd door BikkelZ op 01-04-2007 22:22 ]

iOS developer


  • keet1
  • Registratie: Maart 2007
  • Laatst online: 04-08-2020
Ik heb de highlighting toegepast en hoop dat je er nog even naar wilt kijken.
Als ik in de bron kijk voor en na het invoeren van een waarde blijft het id van het tekstvak hetzelfde en verandert alleen de value.
Als de volgorde verandert zou het id van de tekstvakken ook moeten veranderen.

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Probeer eens:

JavaScript:
1
alert(xmlHttpqw.responseText);


....voordat je het wegschrijft via innerHTML. Dan weet je dus of de data goed is die je geretourneerd krijgt. Als ik dit soort URLs ga testen:

http://www.deskuddebuikki...ulier.php?q=1450&q2=appel

Dan zie ik volgens mij wel de juiste resultaten namelijk. Als dat echt waar is, dan is innerHTML dus een probleem, en moet je dus hardcore via appendChild en dergelijke aan de slag moeten.

iOS developer


  • keet1
  • Registratie: Maart 2007
  • Laatst online: 04-08-2020
BikkelZ ik heb gedaan wat je aangaf en nog een alert er in gezet.

Het is nu goed te zien wat er verstuurd wordt en wat ontvangen.
Als bv. perzik op de bovenste positie staat en die gaat door het getal naar bv positie 2 dan wordt de waarde die wordt gegeven in positie 1 toch nog aan perzik gekoppeld.

Zal het dan de innerhtml zijn?
Hier heb ik nooit iets mee gedaan, zou je me hier dan tips voor kunnen geven, heb net wat gekeken met google en er staat wel veel over maar wat ik er nu precies mee kan.
En of het nu echt betrekking heeft tot mijn probleem zou ik zelf niet kunnen zeggen.

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Als het geen wat je ziet dat je terug krijgt via alert() er anders uit ziet dan je krijgt in FireFox met view selection source, dan gaat er echt iets mis met innerHTML.

Deze site heeft me het meeste geleerd:

http://www.quirksmode.org/resources.html

iOS developer


  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 09-10 21:36
Het zit hem wel in het aanroepen lijkt mij, dit is een stukje HTML van de 'peer':

HTML:
1
2
3
4
5
6
7
8
<tr>
  <th>
    <input type='text' value='1' onkeyup='volgordeFunction(this.value,jstest0)' id='1' />
  </th>
  <th>
  <input type='text' value='peer' id='peer' />
  </th>
</tr>


Zodra ik iets in ga typen in het intypen in het tekstvak wordt de formulier.php pagina dus zo opgevraagd:

http://www.deskuddebuikki...ulier.php?q=99&q2=jstest0

Als je deze pagina opvraagt zul je zien dat de waarde van 'peer' niet veranderd. Dit komt dus omdat die 2e parameter nergens opslaat. De volgende query wordt namelijk uitgevoerd:

MySQL:
1
UPDATE aantalfruit SET aantal=99 WHERE soort=jstest0


Echter als je de pagina als volgt aanroept zul je zien dat de waarde van 'peer' wel veranderd:

http://www.deskuddebuikki...mulier.php?q=9999&q2=peer

Dan wordt de query dus ook als volgt:
MySQL:
1
UPDATE aantalfruit SET aantal=9999 WHERE soort=peer


Regel 28 in formulier.php moet dus zoiets worden:
PHP:
28
echo "<th><input type=\"text\" id=\"$aantal\" onkeyup=\"volgordeFunction(this.value, $row['soort'])\" value=\"$aantal\"></th>";

  • keet1
  • Registratie: Maart 2007
  • Laatst online: 04-08-2020
Volgens mij is dit niet zo.
Op het moment dat ik iets gewijzigd heb zie ik in de bron van de pagina dat het id van het tekstvlak de oude waarde heeft, de waarde die het tekstvak op het moment van het openen van de site had.

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 09-10 21:36
De JavaScripts in een AJAX response worden voor zover mij bekend niet uitgevoerd.

Als je het nou gewoon zo doet zou het volgens mij wel moeten werken:
formulier.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?

$q = $_GET["q"];  
$q2 = $_GET["q2"];  

include("connect.php"); // mysql verbinding  

if($q!="") {  
  $query = "UPDATE aantalfruit SET aantal=$q WHERE soort= '".$q2."'";  
  mysql_query($query);  
} 

$sql = "SELECT * FROM aantalfruit ORDER BY aantal ASC";  
$result = mysql_query($sql);  

while($row = mysql_fetch_array($result)) {  
  $aantal=$row['aantal'];  
  $soort=$row['soort'];  

  echo "<table border='1'>";  
  echo "<tr>";  
  echo "<th><input type=\"text\" id=\"$aantal\" onkeyup=\"volgordeFunction(this.value, $soort)\" value=\"$aantal\"></th>";  
  echo "<th><input type=\"text\" id=\"$soort\" value=\"$soort\"></th>";  
  echo "</tr>";  
  echo "<tr>";  
  echo "<td></td>";  
  echo "<td></td>";  
  echo "</tr>";  
  echo "</table>";  
}

?>

  • keet1
  • Registratie: Maart 2007
  • Laatst online: 04-08-2020
remcotolsma ik heb het jouw code gebruikt en dat wil niet werken.
Ik krijg de juiste waarde en voort soort krijg ik [Object]
Ik heb het nog zo gelaten dan kan je het zien.
Lijkt wel een lastig probleem, maar volgens mij blijft het probleem dat de id's van de tekstvakken niet veranderen na het antwoord van ajax.

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 09-10 21:36
Ik krijg de volgende JavaScript errors:
perzik is not defined
appel is not defined

De 2e parameter van volgordeFunction moet een string zijn, ik was de quotes er om heen vergeten.

formulier.php
PHP:
22
  echo "<th><input type=\"text\" id=\"$aantal\" onkeyup=\"volgordeFunction(this.value, '$soort')\" value=\"$aantal\"></th>";

  • keet1
  • Registratie: Maart 2007
  • Laatst online: 04-08-2020
Remcotolsma wat je zei werkt, bedankt voor de hulp :*)

BikkelZ jij ook bedankt, kan nog een hoop leren van die site waar je een link van hebt gegeven.
Pagina: 1