URL parameters submitten naar MySQL DB
Als beginnend en 'zelf-aanlerend' PHP gebruiker probeer ik het volgende te bereiken:
Ik gebruik een applicatie die data naar een webserver kan sturen middels een URL met variabelen. De data die in deze variabelen zit, wil ik graag opslaan in een database. De variabelen worden door de gebruiker van de applicatie ingevoerd. De applicatie werkt op basis van .xml bestanden om pagina's weer te geven in een desktop GUI.
Hierin kan ik ook berichten definieren, met een URL waar de data heen moet:
Quote:
<message id="test.msg" type="http" inactiveAdvisory="${psu.advisory.com}">
<url>http://127.0.0.1/test.php?Firstname=$disfname&LastName=$dislname&Role=$disrole</url>
<response />
</message>
<url>http://127.0.0.1/test.php?Firstname=$disfname&LastName=$dislname&Role=$disrole</url>
<response />
</message>
In bovenstaand voorbeeld zijn 'Firstname', 'Lastname' en 'Role' de columns in mijn database tabel, en de waarden $disfname, $dislname en $disrole de variabelen die door de gebruiker in de GUI worden ingevuld en dus in de database tabel moeten worden gesubmit.
Het is me gelukt om een script te schrijven (test.php) en als ik daarin variabelen declareer, lukt het me om de waarden die daarin staan te inserten in de database tabel, maar ik mis nog het stukje om data van een 'externe' URL te gebruiken. Ik ben al een week hiermee bezig en het wil me maar niet lukken. Onderstaand de code van mijn test.php script.
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "messageserver";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$stmt = $conn->prepare("INSERT INTO `testtabel` (FirstName, LastName, Role) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $FirstName, $LastName, $Role);
$stmt->execute();
echo "Nieuwe regel toegevoegd!";
$stmt->close();
$conn->close();
?>
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "messageserver";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$stmt = $conn->prepare("INSERT INTO `testtabel` (FirstName, LastName, Role) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $FirstName, $LastName, $Role);
$stmt->execute();
echo "Nieuwe regel toegevoegd!";
$stmt->close();
$conn->close();
?>
Ik ben overigens niet opzoek naar een kant-en-klaar antwoord (als dat al mogelijk is..) maar liever een paar aanwijzingen. Ik probeer het mezelf tenslotte allemaal aan te leren :)
Dank alvast!
Matts
Dit haalt de waarden uit de http aanroep van de app. De URL met variabelen moet dan de bijpassende aanroep doen:
var_1 stuur je dan met een ; separated string of als meedere get variabelen
Een en ander afhankelijk van hoe je app de data verzend. Kan je dat sturen of is het een vast formaat?
Gewijzigd op 24/01/2021 10:31:49 door Aad B
- Ariën - op 22/01/2021 20:29:50:
Bedoel je deze functie?
https://www.php.net/manual/en/function.parse-url.php
https://www.php.net/manual/en/function.parse-url.php
Hi Ariën,
Dank voor je reply. Dit lijkt inderdaad een waardevolle functie te (kunnen) zijn. Dat zou betekenen dat ik de waarde(s) die deze functie van de URL maakt in een array moet zetten om die vervolgens verderop in het .php bestand op de server in een SQL statement moet plaatsen?
Toevoeging op 24/01/2021 11:10:55:
Aad B op 23/01/2021 21:29:24:
Misschien simpel iets met GET params:
Dit haalt de waarden uit de http aanroep van de app. De URL met variabelen moet dan de bijpassende aanroep doen:
var_1 stuur je dan met een ; separated string of als meedere get variabelen
Een en ander afhankelijk van hoe je app de data verzend. Kan je dat sturen of is het een vast formaat?
Dit haalt de waarden uit de http aanroep van de app. De URL met variabelen moet dan de bijpassende aanroep doen:
var_1 stuur je dan met een ; separated string of als meedere get variabelen
Een en ander afhankelijk van hoe je app de data verzend. Kan je dat sturen of is het een vast formaat?
Goedemorgen Aad,
Dit lijkt mij inderdaad een stuk eenvoudiger. De app die de data submit via de http request vereist alleen wel dat de variabelen tussen {} staan (en volgens mij wordt php daar niet zo blij van??) en dat variabelen gescheiden worden door
Quote:
. Ik kan de URL zelf bepalen in een XML bestand (zie mijn eerste bericht) mits ik mij aan de bovengenoemde beperkingen houdt van de ${} en de &.&
Er zijn verschillende soorten berichten, maar ik kan zelf bepalen in welke volgorde de data (maw de variabelen) in de URL staan. Ik zit nu alleen naar mijn php script te kijken, en vermoed dat ik een variabele mis waardoor de SQL query niet werkt. Bij het binden van de parameters noem ik '$FirstName', '$LastName' en 'Role', terwijl de values in de SQL query als ? staan. Wanneer ik in mijn browser 'http://127.0.0.1/script.php?FirstName=Berend&LastName=Botje&Role=Kapitein' invoer, krijg ik netjes de echo 'Nieuwe regel toegevoegd!' te zien, maar in mijn database gebeurt helemaal niets..
Hartstikke interessant en leuk om mezelf PHP, XML en SQL aan te leren, maar soms ook wel eens frustrerend ;-)
Zie ook het voorbeeld onderaan deze link: https://www.w3schools.com/php/php_mysql_prepared_statements.asp (met de try/catch methode)
al iets binnen voor PHP en begin eens met een om te kijken of wellicht de hele regel of een deel van de regel in Firstname staat? Als dat zo is dan kan je de regel verder binnen php wel ontleden.
Matss je krijgt via Code (php)
Gewijzigd op 24/01/2021 14:05:15 door Aad B
Ik heb een nieuw php script geschreven met behulp van bronnen op het internet, en enkele aanpassingen in het xml bestand van de applicatie die de data verstuurd middels de HTTP request.
Even ter referentie mijn 'nieuwe' code, mocht iemand anders ooit met een vergelijkbaar issue zitten:
Quote:
Code (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
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
<?php
$link = mysqli_connect("localhost", "MijnGebruikersnaam", "MijnWachtwoord", "messageserver");
if($link === false){
die("ERROR: Could not connect. " . mysqli_connect_error());
}
$sql = "INSERT INTO `test` (firstname, lastname) VALUES (?, ?)";
if($stmt = mysqli_prepare($link, $sql)){
mysqli_stmt_bind_param($stmt, "ss", $FirstName, $LastName);
$FirstName = $_REQUEST['firstname'];
$LastName = $_REQUEST['lastname'];
if(mysqli_stmt_execute($stmt)){
echo "Nieuwe regel toegevoegd!.";
} else{
echo "ERROR: Could not execute query: $sql. " . mysqli_error($link);
}
} else{
echo "ERROR: Could not prepare query: $sql. " . mysqli_error($link);
}
// Close statement
mysqli_stmt_close($stmt);
// Close connection
mysqli_close($link);
?>
$link = mysqli_connect("localhost", "MijnGebruikersnaam", "MijnWachtwoord", "messageserver");
if($link === false){
die("ERROR: Could not connect. " . mysqli_connect_error());
}
$sql = "INSERT INTO `test` (firstname, lastname) VALUES (?, ?)";
if($stmt = mysqli_prepare($link, $sql)){
mysqli_stmt_bind_param($stmt, "ss", $FirstName, $LastName);
$FirstName = $_REQUEST['firstname'];
$LastName = $_REQUEST['lastname'];
if(mysqli_stmt_execute($stmt)){
echo "Nieuwe regel toegevoegd!.";
} else{
echo "ERROR: Could not execute query: $sql. " . mysqli_error($link);
}
} else{
echo "ERROR: Could not prepare query: $sql. " . mysqli_error($link);
}
// Close statement
mysqli_stmt_close($stmt);
// Close connection
mysqli_close($link);
?>
En nu lekker verder spelen, dank beiden voor jullie input en hulp!
Matts
Nog 1 advies: zet je PHP bestand niet in de webroot van de webserver, mocht die ooit verkeerd geconfigureerd zijn en PHP als tekst laten zien, dan weet niet iedereen je wachtwoord.
Ja daar had ik al wel over nagedacht, maar toch bedankt voor de reminder :)
Voor nu werk ik lokaal met Xampp, van welke ik de connectie naar buiten toe volledig heb afgeknepen.
Mooi dat het goed gelukt is en Xampp is prima voor de lokale connectie en ontwikkelen.