Door
Frits van Leeuwen
op 20-04-2020 00:22
gewijzigd op 20-04-2020 00:36
8.064 views
Hallo allemaal,
Ik doe ergens iets niet goed. Ik heb geen idee wat.
De regel "alert("record_id = " + id); " in de onderstaande code geeft aan dat id is gevuld met bijvoorbeeld 36.
Maar als ik daarna verder ga met de code wordt de code niet naar menu_tabel_update.php overgebracht te worden.
In je query wil je uiteraard filteren op een bepaalde waarde/waardes. Dus een ID-nummer van bijv. een lid. Dan geef je uiteraard die mee in je AJAX-request, en uiteraard escape je deze in je query.
De clientzijde mag nooit voorschrijven hoe de uiteindelijke query er uitziet, deze mag enkel informatie aanleveren die -na een grondige controle- in voorgeschreven invulvakken toegevoegd mag worden (die ook ge-escaped moeten worden) aan een door de serverzijde geformuleerde query.
Je kunt dit op legio manieren invullen, zo zou je aparte acties voor alles (getAll) of voor een enkel (getOne) record kunnen maken. In het laatste geval heb je een verplichte "id" parameter nodig, anders weet je niet om welk record het gaat. Of je laat het afhangen van het aanwezig zijn of ontbreken van dit id of je één of alle records teruggeeft.
Maar dat vanuit de php terug mag je me nog wat verduidelijken.
Alle requests en responses verlopen via het HTTP protocol (kijk eens in de netwerktab naar request en response headers...). Hierbij wordt oa onderhandeld over welke content je toestaat en hoe deze wordt aangeleverd. Als een webserver normaal gesproken een PHP-bestand uitbraakt dan zal dit meestal van het Content-Type text/html zijn. Als je een stuk content als JSON serveert dan zou je moeten aangeven dat dit JSON betreft. Al deze tekst heeft ook een encodering. Het beste lijkt mij altijd om expliciet aan te geven welke encodering je gebruikt, ten einde enige verwarring te voorkomen. Dit wordt met name belangrijk als jouw content diakritische tekens of multibyte karakters bevat. Je zou voor de gein eens kunnen kijken hoe snel jouw applicatie ontspoort als je ergens een trema in stopt.
Een typische snippet voor als je JSON serveert wordt zoiets als:
Bij alles wat je maakt, en vooral wanneer er allerlei interacties met gebruikers zijn, is het zaak dat je continu nadenkt over de veiligheid van je applicatie.
Het feit dat je dit alles voor je uitschuift ("Beveiligingen komen later aan bod, als ik over het internet heen wil.") plus de constante drang om delen of complete queries in JavaScript te stoppen zijn op zijn zachtst gezegd zorgwekkend.
Ik heb gevonden waar ik het antwoord kan vinden dat ajax terug krijgt.
Maar als ik nu ga zoeken wat het probleem is, kom ik er achter dat de id die ik aan de query geef niet mee komt naar action_get.php . Als ik achter de query 5 i.p.v. id invul, dan krijg ik wel een antwoord.
Dus op de één of andere manier kan ik +id er niet achter zetten.
Hoe ik de query hier weg haal weet ik nu niet. Ik dacht hem eerst maar werkend te krijgen, en als dat gelukt is wil ik de query wel verstoppen. Maar waar en hoe? Daar heb ik nog geen idee van.
$('#Listed_Rows').delegate("tr", "click", function()
{
var idstr = '#'+$(this).attr('id');
var idnr = idstr.substr(5);
$('#'+this.id).siblings().show(); // alle regels tonen
$('#'+this.id).hide();
$('#Mutatie_Form').show(); // formulier tonen
$('#Button_Add').hide(); // toevoegknop verbergen
$('#Button_Cancel_Add').hide();
$('#Button_Save_Add').hide();
$('#Button_Cancel_Update').show();
$('#Button_Save_Update').show();
$('#Button_Delete_Verzoek').show();
$('#Delete_Yes_No').hide(); // verwijderverzoek verbergen
// velden moeten gevuld worden
$.ajax(
{
url: 'action_get.php',
method: 'GET', // je haalt informatie op
dataType: 'json', // json code naar form te halen
data:
{
'action': 'ShowRecord',
'query_record': 'SELECT menu_id, menu_waarde, menu_sub_van, menu_tekst, menu_link FROM tabel_menu WHERE menu_id='+idnr
},
succes : function( data )
{
var result = $.parseJSON(data);
$('#fidnr').val(result[menu_id]);
$('#fwaarde').val(result[menu_waarde]);
$('#fsubvan').val(result[menu_sub_van]);
$('#ftekst').val(result[menu_tekst]);
$('#flink').val(result[menu_link]);
}
});
$('#fwaarde').focus();
});
Met regel 4 var idnr=idstr.substr(5); pik ik de id op.
Als ik in die buurt ook een alert(id); plaats krijg ik ook keurig het id nummer in beeld.
Met regel 5 en 6 stuur ik de lijst aan. Door er 1 regel tussen uit te halen. Dat doe ik via id.
De query moet ik dus opbouwen in action_get. Eerder deed ik al iets degelijks. toen had ik de velden die ik wilde hebben in de data gestopt. Dat zou ik dan weer doen.
Juist, en vergeet menu_id niet te escapen.
Waar zag je dat idnr niet meegestuurd werd? In je Network-tab?
Je hebt wel de naam query_record aangepast? Dat is je $_GET namelijk.
De enige DATA die je hoeft mee te geven in de AJAX-call zijn:
- optioneel een actie
- optioneel een id
Dit doe je met 'method': 'GET' en in 'data' stop je het id en eventueel de action.
In het aangeroepen PHP-bestand vis je de id en eventueel de action uit $_GET. Als je je id in het veld 'pietjepuk' stopt moet je deze vervolgens ook weer uit $_GET['pietjepuk'] halen uiteraard.
Snap je nu ondertussen de interactie tussen de AJAX-call en het afhandelend PHP-bestand?
Vervolgens bouw je je query in dit PHP-bestand.
SQL in je JavaScript stoppen die je vervolgens letterlijk uitvoert is knetter lijp. Dit is nu al een aantal keren gemeld. Het enige variabele deel aan de PHP-kant is eventueel het id. Voordat je dit in je query gooit zou je ook moeten controleren of dit id numeriek was en tevens zou dit veld ge-escaped moeten worden, anders kan iemand hier een lap SQL aan vast breien waarmee een heleboel ongein uitgehaald kan worden (SQL-injectie).
Zoals @Ariën hierboven aangeeft kun je in je netwerktab zien hoe de request headers er uitzien. Hier zou je de verstuurde data in terug moeten zien.
Ontwikkel anders dit PHP-bestand eerst eens in afzondering van al die AJAX-zut, zorg dat dit werkt, en klik dit vervolgens aan elkaar.
Ik kan je wel een compleet werkend voorbeeld geven maar dan schieten we het doel een beetje voorbij. Je moet zelf snappen hoe dit werkt en hoe je deze principes zou moeten toepassen.
Een paar fouten, action is een toegewezen onderdeel aan een html(5)formulier en kan derhalve niet gebruikt worden binen jquery. Met grote waarschijnlijkheid geeft het een internal server error 500 of hele vage foutmeldingen in je webdevelopper.
Query kent jquery standaard ook niet, dit is een component uit php. client-sided & serversided zijn op deez manier niet te mixen..
Heb het idee dat je beter de mogelijkheden via php af kunt lopen en de uitkomst via jquery-ajaax weer geeft want het aantal mogelijkheden die je gebruikt is zeer vors....
Volgens mij kan je de naam action prima gebruiken in je data. In PHP is dat dan $_GET['action'].
Database-queries kent jQuery standaard inderdaad niet. Maar dat er een query wordt doorgegeven boeit jQuery dan ook werkelijk niks, en hij behandelt het gewoon als tekst. Ik denk dat dat de gedachtegang van de topicstarter zou zijn geweest. Zoals Thomas als zegt is dit zwaar onveilig! Daarom is het zeer verstandig om de data die je aan je query wilt meegeven, zoals een ID-nummer, deze enkel als data mee te geven. Je query is namelijk iets wat serverside plaatsvindt, en daar ook hoort.
Ik ben weer een stap verder. Ik moest regel 4 veranderen in
var idnr = Number( $(this).attr('id').substr(5));
Zo geeft hij het id nummer als nummer door. Dan werkt het wel.
De aanwijzingen van Yoop Overmaat ook even ter harte genomen. Het is een kleine moeite om de naamgeving van variabele aan te passen.
Ik ga de query's opsplitsen. Ik zou alles kunnen overgooien naar de action_get.php en action_post.php, maar ik wilde die juist Multi inzetbaar maken.
Mijn gedachte is nu om de tabel te noemen, de actie, een voorwaarde-veld en een voorwaarde-antwoord.
Bij een lijst wil ik ook de benodigde velden noemen, Omdat ik niet alle velden wil gebruiken.
Onderin ajax heb ik nu dit staan:
succes : function( data )
{
var result = JSON.parse(data);
$('#fidnr').val(result.menu_id);
$('#fwaarde').val(result.menu_waarde);
$('#fsubvan').val(result.menu_sub_van);
$('#ftekst').val(result.menu_tekst);
$('#flink').val(result.menu_link);
}
Maar daarmee wordt er niets overgenomen.
Bij Netwerk lees ik het antwoord:
"{ menu_id :3 , menu_tekst :menu beheer , menu_waarde :80 , menu_sub_van :8 , menu_link :beheer_menu.php , menu_reg_date :2020-04-25 16:51:11 }"