Aanvullen van PHParray of DB via javascript-functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Paul Ulje

Paul Ulje

30/07/2016 16:27:25
Quote Anchor link
Dag,
Ik ben redelijk bekend met programmeren, maar nieuw hier en vrij nieuw met PHP.
Dus vergeef me als ik de etiquette hier niet goed toepas of een vraag stel die ooit al beantwoord is.

Ik heb een probleem met PHP.

$aDitArray[]='Paul';
Dit vult het array aan, met het element 'Paul'.
Nu heb ik op dit forum een omweg gevonden om een (javascript)popupvenstertje in PHP te maken. Dat ziet er in de kern zó uit. En dat werkt, ogenschijnlijk....

function prompt($s) {
echo("<script type='text/javascript'> var answer = prompt('" . $s . "'); </script>");
$answer = "<script type='text/javascript'> document.write(answer); </script>";
// addContext('$answer');
return $answer;
}

$antw=prompt('Geef naam: '); geeft netjes de ingetoetste waarde terug.
$aDitArray[]=$antw; lijkt te werken.
foreach ($aDitArray as $regel) print "$regel<br/>"; geeft de lijst inclusief de aanvulling netjes weer.
En bij een volgende aanroep van prompt() komt wél de nieuwe waarde netjes terug.
Maar... bij het aanvullen van de array, wijzigt de vorige waarde in de nieuwe waarde en staat er tweemaal de nieuwe waarde in.
???

Om een eventueel PHP intern pointerprobleem te omzeilen zou addContext $answer in de MySqlDB moeten zetten, maar ook dit wil niet lukken. (De SQL functie klopt en met zelf ingegeven waardes werkt het wel.)
Ook var_dump($antw); meldt netjes dat het een string(65) is.
Heeft iemand enig idee waar ik het zoeken moet ?
Gewijzigd op 30/07/2016 16:32:50 door Paul Ulje
 
PHP hulp

PHP hulp

30/11/2024 07:43:28
 
Ward van der Put
Moderator

Ward van der Put

30/07/2016 16:51:53
Quote Anchor link
Als je na $aDitArray[]='Paul'; ongecontroleerd $aDitArray[]=$antw; doet, stapelen de data zich op. Zonder meer code is er weinig concreets over te zeggen, maar het lijkt erop dat je alle willekeurige input op één grote hoop veegt.
 
Paul Ulje

Paul Ulje

30/07/2016 17:14:23
Quote Anchor link
Meer code is er niet.
Een functie met een returnwaarde die aan een array wordt toegevoegd. Normaliter erg eenvoudig.
Wat bedoel je met 'stapelt de data zich op'?
$a=array();
$a[]='een';
$a[]='twee';
foreach ($a as $b ) print "$b<br/>";
geeft:
een
twee
Wat gaat hier dan fout en hoe kan ik dat voorkomen?

Natuurlijk is de variabele $antw gecontroleerd.
1. De functie prompt werkt.
2. De returnwaarde wordt door PHP herkent als een normale string en bevat de string die ingegeven is en kan worden afgedrukt.
3. Het aanvullen van een array op deze wijze is elementair in PHP.
DUS 1,2,3: Alles werkt, behalve deze specifieke combinatie.
Gewijzigd op 30/07/2016 17:21:28 door Paul Ulje
 
Ward van der Put
Moderator

Ward van der Put

30/07/2016 17:39:14
Quote Anchor link
Toch mis je ergens iets: als $aDitArray[]=$antw; namelijk een onverwacht resultaat geeft, dan zijn je verwachtingen verkeerd.

Of zoals we anders zeggen: assumption is the mother of all *onheil*.

Aangezien je met $aDitArray[]=$antw; geen sleutel gebruikt, moet je maar raden wat er in de array zit. Kennelijk is dat je bedoeling, alleen is/wordt je oplossing (te) sterk afhankelijk van de volgorde waarin je de array opbouwt. Als je met $aDitArray[]='Paul'; begint, dan is $aDitArray[0] waarschijnlijk een voornaam, maar je wilt niet iets bouwen op waarschijnlijkheid en liever op zekerheid.
Gewijzigd op 30/07/2016 17:40:40 door Ward van der Put
 
Ben van Velzen

Ben van Velzen

30/07/2016 18:34:19
Quote Anchor link
Je zit PHP en JavaScript te mixen. Dit kan en zal nooit werken.
 
Paul Ulje

Paul Ulje

30/07/2016 20:43:43
Quote Anchor link
Dank je Ward.
Het gekke is dat ik geen resultaat verwacht had, want, net als Ben zegt de waarde van een Javascript-variabele naar een PHP overhevelen? Vergeet het maar. En toen vond ik dat voorbeeld op dit forum. Ook al ziet het regel 3 er zeer onwaarschijnlijk uit, het blijkt te werken!

function prompt($s) {
echo("<script type='text/javascript'> var answer = prompt('" . $s . "'); </script>");
$answer = "<script type='text/javascript'> document.write(answer); </script>";
//$answer = filter_var($answer, FILTER_SANITIZE_STRING);
return $answer;
}
print $anwer;

Tot ik $answer verder wilde gebruiken. Dan lijkt er toch wat anders in $answer te zitten dan een nette string en gaat het fout. NAV je opmerking heb ik verder gekeken en heb de invoerfilters ontdekt. Met het geschreven filter valt $answer zoals verwacht genadeloos door de mand. Wat er in zit is wat je verwacht, de hele string. Dus <script type='text/javascript'> document.write(answer); </script> En dat wordt door PHP dan ook netjes gedaan.

Dus dank voor je tips. Daardoor is het wonder verklaard....:-)
Overigens was het een test in een poging om een echte PHP-combobox, dus met nieuwe invoer, te maken.

En Ben, als nooit iemand had geprobeerd wat overduidelijk niet kan, was de aarde nog steeds plat geweest. :-)
Gewijzigd op 30/07/2016 20:48:43 door Paul Ulje
 
Ben van Velzen

Ben van Velzen

30/07/2016 20:59:26
Quote Anchor link
Afgezien van het feit dat de Grieken prima wisten dat de aarde niet plat was en volgens de flat earth society de aarde nog steeds plat is uiteraard ;)
Je ziet hier het verschil tussen een serverside taal en een clientside taal, welke ook nog eens geen enkel verband met elkaar hebben. PHP poept HTML uit en heeft geen verdere interactie met de HTML en/of Javascript. Wanneer je van de grond af leert hoe PHP werkt is dit één van de eerste dingen die hieruit volgen.
Gewijzigd op 30/07/2016 21:00:49 door Ben van Velzen
 
Paul Ulje

Paul Ulje

22/04/2017 14:10:17
Quote Anchor link
Het duurde even maar ik had opnieuw een promptfunctie nodig.
Zoals veel in PHP moest ik het via de omweg aanpakken.....

[meta]
Prompt met JS en maak daarmee een cookie.
Laat door JS het formulier opnieuw laden anders hervult $_COOKIE zich niet
Lees en gebruik de cookie in PHP
[/meta]

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
function prompt($s) {
    print "<script> var naam = 'koek='+window.prompt('$s'); ";
    print "document.cookie = naam; document.getElementById('test').submit(); </script>";
}


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
print "<form id='test' method='post' action='test.php' target='_top'>";
// de $_SESSION alleen voor testen
// normaal: if (voorwaarde voor prompten) dan prompt('deze vraag');
if (!isset($_SESSION['doePrompt'])) {
    $_SESSION['doePrompt'] = false;
}
if ($_SESSION['doePrompt']) {
    $_SESSION['doePrompt'] = false;
    prompt('Hoesje naam Bommel');
} else
    $_SESSION['doePrompt'] = true;
print $_COOKIE['koek'];
 
Thomas van den Heuvel

Thomas van den Heuvel

22/04/2017 16:20:27
Quote Anchor link
Paul Ulje op 22/04/2017 14:10:17:
Laat door JS het formulier opnieuw laden anders hervult $_COOKIE zich niet

Pretty much this? PHP (serverside) kent de inhoud van het cookie (clientside) niet totdat je een nieuw request doet naar de server en hiermee de (bijgewerkte) cookie-informatie terugstuurt zodat PHP deze uit kan lezen.
 
Paul Ulje

Paul Ulje

22/04/2017 17:29:30
Quote Anchor link
Ja. Zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
$_SESSION['lijst'][] = $_COOKIE['koek'];
$_SESSION['lijst'] = array_unique($_SESSION['lijst']);
asort($_SESSION['lijst']);

print "<!doctype html><html><head><title>redactiesysteem</title>";
print "<link rel='stylesheet' href='redactie.css' type='text/css' />";
print "</head><body><form id='test' method=post action='test.php' target='_top'>";

if (isset($_POST['nw'])) {
    print "<script> var naam = 'koek = '+window.prompt('Geef naam'); ";
    print "document.cookie = naam; document.getElementById('test').submit(); </script>";
}
Gewijzigd op 22/04/2017 17:34:57 door Paul Ulje
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.