[PHP/JS] Array met ajax

Pagina: 1
Acties:
  • 279 views sinds 30-01-2008
  • Reageer

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06-2025
lolo
ik ben al een tijdje bezig aan een opdracht en dankzij dit forum ben ik ook een tijdje bezig met de methode AJAX.

Nu ben ik al een beetje verder maar nu loop ik vast.
Het problem is als volgt:

Ik heb een scherm met een active widget erin en bij een dubbelklik op een row wordt er een functie aangeroepen. Deze functie (onderdeel van ajax) geeft een id mee die uit het geselecteerde row komt van de active widget. Dit werkt na zorgvuldig testen.
Vervolgens wordt er dus een php file aangeroepen die met dat id een query uitvoert en vervolgens moeten de results weer teruggegeven worden.
Dit werkt normaal wel maar het probleem zit hem nu in de type, want uit de query komt niet 1 item uit maar een hele rij dat aan het geselecteerde ID hangt (een hele row dus).
Dit wil ik in een array proppen en vervolgens moet de array terug gegeven worden.
Maar met de array gaat het volgens mij mis.
mijn script:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function abonTotalSendRequest(id) {
    if(id !== ''){
    req.open('get', '/functions/function_abontotal_parse.php?abonid=' + id)
      req.onreadystatechange = abonTotalHandleResponse
      req.send(null)
    }
}
function abonTotalHandleResponse() {
  if(req.readyState == 4){
                var response = new Array();
    response = req.responseText;
    alert(response[0]);
    var gsm = response[0];
    document.getElementById('gsm').value = gsm;
}

mijn php file:
PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    //connection
    include_once("../includes/db.inc.php"); 
    
    //input waarde
    $abonid = $_REQUEST['abonid'];

    //query
    $query = 'SELECT *
              FROM Abonnementen 
              WHERE id = ' .$abonid .'
              LIMIT 1';
    $res = mysql_query($query, $conn);
    $abon_info = new array();
    for($count = 0; $count = 18; $count = $count + 1){
        $abon_info[$count] = mysql_result($res,0,$count);
    }
        
    //output
    echo "".$abon_info."";

ik kan nu wel in de echo van de php telkens elke waarde appart neerzetten maar dit is zeer omslachtig en er bestaan niet voor niets arrays....
hij geeft dus niet de array terug want de waarde is: undefined...
iemand een idee? ben wel zelf continu bezig met het uitpuzzelen van dit :)

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 06-03 11:52

DizzyWeb

Ondertiteld

Wat je nu doet gaat sowieso niet werken. Je hebt een array, die kan je niet gewoon echo'en.

En...
PHP:
1
2
 for($count = 0; $count = 18; $count = $count + 1){
}


Da's natuurlijk onzin he.

PHP:
1
2
 for($count = 0; $count <= 18; $count++){
}


Bedoel je niet zoiets?

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06-2025
niet gewoon echoen of helemaal niet???
en jah bedankt voor de tip maar dat had ik al vervangen ;)
had tijdelijk ff een oude for lus gebruikt
maar daa zit de fout dan ook niet...
als het namelijk niet kan dan zal ik het de omslachtige manier moeten doen..
waar ik dus geen zin in heb...

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11-2025

OkkE

CSS influencer :+

Ik ben sinds kort ook met AJAX aan 't klooien; ik heb in het php-script het resultaat (de array) via een while-loop in een variabele gestopt (als string) en deze return ik aan de javascript.
PHP:
1
2
3
4
5
6
7
8
9
$Retults = '<![CDATA[';
            
            while( $Row = mysql_fetch_object( $Rs ) ) {
                $Retults .= $Row->body;
            }
            
            $Retults .= ']]>';
            
            return $Retults;
Dat javascript print het dan via een document.getElementById('mijnveld').innerHTML = deStringUitDePHP; op het scherm. :)

[ Voor 50% gewijzigd door OkkE op 27-10-2005 14:28 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06-2025
hoezo laat ook maar???
ik ga het dan gewoon proberen met return ipv echo...

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11-2025

OkkE

CSS influencer :+

Tijgertje84 schreef op donderdag 27 oktober 2005 @ 14:06:
hoezo laat ook maar???
ik ga het dan gewoon proberen met return ipv echo...
Ik had bij die edit nog wat gezet, maar later bedacht ik me dat die toevoeging onzin was; de 'laat maar' sloeg dus op de tekst die eerst onder '---edit---' stond. :)

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


  • MeIsTwisted
  • Registratie: November 2001
  • Laatst online: 28-07-2023

MeIsTwisted

not a Twisted mind

waarom niet gewoon een xml teruggeven met je data?
of javascript code genereren en dan met eval runnen?

Multimonitor is relax :P


  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06-2025
MeIsTwisted schreef op donderdag 27 oktober 2005 @ 14:33:
waarom niet gewoon een xml teruggeven met je data?
of javascript code genereren en dan met eval runnen?
tjah is leuk maar heb 0% verstand van xml..... dus gaat al over voor mij...
ik wil het gewoon alleen in JS en php houden....om het niet te moeilijk voor mezelf ter maken

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Verwijderd

Tijgertje84 schreef op donderdag 27 oktober 2005 @ 14:39:
tjah is leuk maar heb 0% verstand van xml..... dus gaat al over voor mij...
ik wil het gewoon alleen in JS en php houden....om het niet te moeilijk voor mezelf ter maken
Dan is het geen AJAX :+ maar remote scripting. (8>

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 02-01 15:55
Je moet de waarden in je array als platte tekst weergeven (echo'en) in php, zorg daarbij dat je een duidelijk scheidingsteken hebt tussen de waarden (zie ook de php functie implode).
Via javascript kun je deze platte string weer naar een array omzetten als je dat makkelijk vindt werken.

If I can't fix it, it ain't broken.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:50

crisp

Devver

Pixelated

Andere mogelijkheid is een vorm van serializen om de array om te zetten naar een stringformaat (denk aan komma-gescheiden of aan PHP's serialize() ism een JS implementatie van unserialize())
JavaScript:
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
33
34
35
36
37
38
39
40
function unserialize(data)
{
    var re = /(\w):([\d.]+)[:;]/g;
    re.lastIndex = 0;
    return unserialize_do(re, data);
}

function unserialize_do(re, data)
{
    var cur, ret = '', i, key;
    if ((cur = re.exec(data)) !== null)
    {
        switch (cur[1])
        {
            case 'a':
            case 'o':
                ret = cur[1] == 'a' ? [] : {};
                i = cur[2];
                while (i--)
                {
                    key = unserialize_do(re, data);
                    ret[key] = unserialize_do(re, data);
                }
                break;
            case 's':
                ret = data.substr(re.lastIndex+1, cur[2]);
                re.lastIndex += cur[2] - 1;
                break;
            case 'i':
            case 'd':
                ret = cur[2] / 1;
                break;
            case 'b':
                ret = cur[2] ? true : false;
                break;
        }
    }

    return ret;
}

;)

[ Voor 67% gewijzigd door crisp op 27-10-2005 14:47 ]

Intentionally left blank


  • MeIsTwisted
  • Registratie: November 2001
  • Laatst online: 28-07-2023

MeIsTwisted

not a Twisted mind

Tijgertje84 schreef op donderdag 27 oktober 2005 @ 14:39:
[...]

tjah is leuk maar heb 0% verstand van xml..... dus gaat al over voor mij...
ik wil het gewoon alleen in JS en php houden....om het niet te moeilijk voor mezelf ter maken
een simpel xml bestandje samenstellen is niet zo moeilijk overigens.

Dan waarom niet een array maken

code:
1
2
3
4
5
$ret = "blaat = new Array(";
while(voorwaarde){
concateneer een element met $ret;
}
return $ret . ");";


zo hebbie het alleen met php en javascript

Multimonitor is relax :P


  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06-2025
ok stel ik krijg het voorelkaar om in de php file een lange string te maken gescheiden door een - of , of whatever..
hoe kan ik in JS nu deze regel splitten op dat scheidingsteken???
niet met de functie split want dat gaat maar 1 keer op...
heb al gezocht maar niet iets gevonden als explode wat bij php werkt...

edit:
ok ik heb het nu op de stomste manier opgelost:
PHP:
4
5
6
7
8
9
10
11
12
13
$query = 'SELECT gsm FROM Abonnementen WHERE id = ' .$abonid .' LIMIT 1';
    $res = mysql_query($query, $conn);
    $gsm = mysql_result($res,0,0);
    $query = 'SELECT tijdnr FROM Abonnementen WHERE id = ' .$abonid .' LIMIT 1';
    $res = mysql_query($query, $conn);
    $tijdnr = mysql_result($res,0,0);
                //etc etc
                $items = array($gsm,$tijdnr,etc);
    $abon_info = implode(',',$items);
                echo "".$abon_info."";

JavaScript:
1
2
3
4
5
6
7
8
9
10
function abonTotalHandleResponse() {
  if(req.readyState == 4){
    var update = new Array();
    var response = req.responseText;
        alert(response); //uitslag: correct
    update = response.split(",");
    alert(update[0]);
    alert(update[1]);
    alert(update[2]);
}


edit
fixed :O

maar ik wil die omslachtige manier eigenlijk wel iets korter hebben....
mij lijkt dat zoals ik eerder had gedaan met:
PHP:
4
5
6
7
8
$res = mysql_query($query, $conn); 
    $abon_info = new array(); 
    for($count = 0; $count = 18; $count = $count + 1){ 
        $abon_info[$count] = mysql_result($res,0,$count); 
    }

maar dat werkt dus niet...

[ Voor 104% gewijzigd door Tijgertje84 op 27-10-2005 15:50 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:50

crisp

Devver

Pixelated

JavaScript:
1
var update = response.split(/,/);

split is een method (en geen functie zoals in PHP) en accepteert maar 1 argument: een reguliere expressie (een string wordt echter ook door de RegExp constructor heengehaald).

[ Voor 19% gewijzigd door crisp op 27-10-2005 15:47 ]

Intentionally left blank


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

waar ik vaak gebruik van maak is er een javascript objectje van maken. XML geeft te veel overhead en een hoop onzinnig gedoe met encodings voor een paar divjes die wat content veranderen naar mijn mening.

de responseText op je AJAX query wordt dan zoiets:

JavaScript:
1
var results = {blaat: 'mekker', kwaak:'blaaat'}


Uiteindelijk doet je event handler dan dit:
JavaScript:
1
2
3
4
5
6
7
8
9
//even uit het hoofd
eval(req.responseText); // results object wordt aangemaakt
if (typeof (results) != 'undefined')
{
 for (var i in results)
 {
   document.getElementById(i).innerHTML = results[i];
 }
}


Zo kan je heel simpel een compleet object met key=>waarden uitpoepen, hij zoekt de ID op in je document, en vervangt de innerHTML door de waarde :)

Om dit nóg makkelijker te maken heb ik een simpel php(5) objectje aangemaakt:

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
33
class jsObject
{
    var $properties;

    function __construct()
    {
        $this->properties = array();
    }

    function __set($key, $value)
    {
        $this->properties[$key] = $value;
    }

    function __get($key)
    {
        return ($this->properties[$key]);
    }

    function display()
    {
        foreach ($this->properties as $key=>$val)
        {
            $val = addslashes($val);
            $val = str_replace("\n", "", $val);
            $val = str_replace("\r", "", $val);
            $output .= ($output != '') ? ', ' : '';
            $output .=  "$key: '{$val}'";
        }
        die("var results = {{$output}}");
    
    }
}


Dan kan je heel simpel in php je waarden allemaal in dit object hangen:

PHP:
1
2
3
4
$js = new jsObject();
$js->gsm = 'blaaat';
$js->kwaak = 'mekkker';
$js->display(); // die't en echo't alleen het object.


Maybe it helps :)

[ Voor 22% gewijzigd door SchizoDuckie op 27-10-2005 16:16 ]

Stop uploading passwords to Github!


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:50

crisp

Devver

Pixelated

smaken verschillen, maar eval blijft evil ;)

Intentionally left blank


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

crisp schreef op donderdag 27 oktober 2005 @ 16:33:
smaken verschillen, maar eval blijft evil ;)
uiteraard, ik moet er nog wel een keer een function() van maken die gewoon die array returned :P

Stop uploading passwords to Github!

Pagina: 1