php profile token script
Pagina: « vorige 1 2 3 4 5 volgende »
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
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
<?php
include 'config.php';
if(isset($_POST["submit"])){
$token = rand();
$result = hash("sha256", $token);
}
$sql="INSERT INTO `account` (u_naam, avatar)
VALUES ('{$_POST['naam']}','{$_POST['avatar']}')";
$sql1="INSERT INTO `tickets` (ticket_naam, token)
VALUES ('{$_POST['ticket_naam']}','{$_result}')";
if (mysqli_query($conn, $sql ,$sql1)) {
echo "Gelukt";
echo "br>"
$url = "http://example.com/tickets.php?listing=$result";
echo "kopieer het linkje:";
echo "br>";
echo $url;
} else {
echo "Error: " . $sql . "" . mysqli_error($conn);
echo "br>"
echo "Error: " . $sql1 . "" . mysqli_error($conn);
}
$conn->close();
}
?>
include 'config.php';
if(isset($_POST["submit"])){
$token = rand();
$result = hash("sha256", $token);
}
$sql="INSERT INTO `account` (u_naam, avatar)
VALUES ('{$_POST['naam']}','{$_POST['avatar']}')";
$sql1="INSERT INTO `tickets` (ticket_naam, token)
VALUES ('{$_POST['ticket_naam']}','{$_result}')";
if (mysqli_query($conn, $sql ,$sql1)) {
echo "Gelukt";
echo "br>"
$url = "http://example.com/tickets.php?listing=$result";
echo "kopieer het linkje:";
echo "br>";
echo $url;
} else {
echo "Error: " . $sql . "" . mysqli_error($conn);
echo "br>"
echo "Error: " . $sql1 . "" . mysqli_error($conn);
}
$conn->close();
}
?>
Dat gezegd hebbende, ik denk dat je er (dus) ook verstandiger aan doet om hier een echte relationele database van te maken, te meer omdat dit een soort van administratief systeem betreft. De InnoDB-engine is hier bij uitstek geschikt voor (in tegenstelling tot de MyISAM engine). Ook zou ik een uitgebreidere character set/encoding gebruiken dan latin1.
Er valt nog aardig veel winst te pakken bij een ander (en m.i. beter) database-ontwerp.
De flow is als volgt:
Code (php)
1
2
3
4
5
2
3
4
5
definieer query #1
voer query #1 uit
vraag autoincrement id op van query #1
definieer query #2 met gebruikmaking van dit id
voer query #2 uit
voer query #1 uit
vraag autoincrement id op van query #1
definieer query #2 met gebruikmaking van dit id
voer query #2 uit
Gewijzigd op 29/09/2019 17:02:34 door Thomas van den Heuvel
Lees mijn vorige bericht nog eens terug over je query.
maar als ik nu bestandje tickets.php aanmaak
dan moet ik het via get oproepen toch.
maar hoe weet ik dan als de token link bij welk formulier hoort die ingevuld is,
zodat die data afleest
zou je misschien de sql query kunnen schrijven zodat ik een idee heb
Gewijzigd op 29/09/2019 17:07:02 door pascal klienstra
Als je wilt controleren of een token van een ticket klopt, dan kan je die $_GET in de WHERE plaatsen. Uiteraard speelt het escapen hier ook weer een belangrijke rol.
Jouw reguliere expressie is voor de validatie van die hash niet goed, omdat deze *precies* 40 karakters verwacht.
Ook jouw token-kolom biedt maar ruimte aan 40 karakters.
Ik zou in ieder geval zorgen dat dat allemaal in de pas loopt.
definieer query #1
voer query #1 uit
vraag autoincrement id op van query #1
definieer query #2 met gebruikmaking van dit id
voer query #2 uit
Het zijn en blijven twee losse INSERT-queries. Het ID van de eerste gebruik je bij de tweede.
Je geeft de link ergens door, bijvoorbeeld via e-mail of via knippen en plakken bij wijze van test.
Vervolgens heb je een (ander) stuk code die dat allemaal weer uitleest, dat staat los van het bovenstaande.
Het helpt natuurlijk als je weet wat er precies in je database is gezet zodat je kunt testen en debuggen terwijl je iets aan het bouwen bent.
In het bovenstaande codefragment staat je link al:
Het gaat hierbij om $result, die plak je in de aanroep naar je tickets(.php) script. Maar die moet dan dus wel goed in de database staan en de validatie moet ook kloppen, anders kom je niet zover.
---
Laten we het over een andere boeg gooien. Het "invoer" script en het "uitlees" script zouden zelfs los van elkaar ontwikkeld kunnen worden als je een afspraak hebt over hoe je informatie doorgeeft. Dit ligt al grotendeels vast in de databasedefinitie.
Dus je zou zelfs met het uitleesscript kunnen beginnen zolang je maar wat testdata in je database hebt staan.
Oftewel: welke data staat er op dit moment in je database waar je mee aan de slag zou kunnen gaan?
Gewijzigd op 29/09/2019 17:24:57 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
2
3
4
5
$sql="INSERT INTO `account` (u_naam, avatar)
VALUES ('{$_POST['naam']}','{$_POST['avatar']}')";
$sql1="INSERT INTO `tickets` (ticket_naam, token)
VALUES ('{$_POST['ticket_naam']}','{$_result}')";
if (mysqli_query($conn, $sql ,$sql1)) {
VALUES ('{$_POST['naam']}','{$_POST['avatar']}')";
$sql1="INSERT INTO `tickets` (ticket_naam, token)
VALUES ('{$_POST['ticket_naam']}','{$_result}')";
if (mysqli_query($conn, $sql ,$sql1)) {
maar hoe kan ik table account vullen en table tickets
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE IF NOT EXISTS `account` (
`u_id` int(11) NOT NULL AUTO_INCREMENT,
`u_naam` varchar(250) NOT NULL,
`avatar` varchar(250) NOT NULL,
PRIMARY KEY (`u_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
--
-- Table structure for table `tickets`
--
CREATE TABLE IF NOT EXISTS `tickets` (
`token` CHAR(64) NOT NULL,
`ticket_naam` varchar(250) NOT NULL,
`ticket_datum` date NOT NULL,
`plaats` varchar(250) NOT NULL,
`prijs` int(2) NOT NULL,
`betaallink` varchar(250) NOT NULL,
`u_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`token`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
`u_id` int(11) NOT NULL AUTO_INCREMENT,
`u_naam` varchar(250) NOT NULL,
`avatar` varchar(250) NOT NULL,
PRIMARY KEY (`u_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
--
-- Table structure for table `tickets`
--
CREATE TABLE IF NOT EXISTS `tickets` (
`token` CHAR(64) NOT NULL,
`ticket_naam` varchar(250) NOT NULL,
`ticket_datum` date NOT NULL,
`plaats` varchar(250) NOT NULL,
`prijs` int(2) NOT NULL,
`betaallink` varchar(250) NOT NULL,
`u_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`token`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
Gewijzigd op 29/09/2019 17:28:19 door pascal klienstra
En mysqli_query werkt niet meet meerdere queries inéén.
Dus voer twee aparte mysqli_query() uit met je INSERT.
is dit is dus onzin. Leuk bedacht, maar gaat niet werken.
Bij twijfel: Check php.net/{functienaam} en bekijk de mogelijkheden en syntax.
Gewijzigd op 29/09/2019 17:33:39 door - Ariën -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$sql="INSERT INTO `account` (u_naam, avatar)
VALUES ('{$_POST['naam']}','{$_POST['avatar']}')";
}
if (mysqli_query($conn, $sql)) {
echo "query 1";
} else {
echo "niks gevonden";
}
$sql1="INSERT INTO `tickets` (u_naam, avatar)
VALUES ('{$_POST['naam']}','{$_POST['avatar']}')";
}
if (mysqli_query($conn, $sql1)) {
echo "query 2";
} else {
echo "niks gevonden";
}
?>
VALUES ('{$_POST['naam']}','{$_POST['avatar']}')";
}
if (mysqli_query($conn, $sql)) {
echo "query 1";
} else {
echo "niks gevonden";
}
$sql1="INSERT INTO `tickets` (u_naam, avatar)
VALUES ('{$_POST['naam']}','{$_POST['avatar']}')";
}
if (mysqli_query($conn, $sql1)) {
echo "query 2";
} else {
echo "niks gevonden";
}
?>
Het is dus zaak dat je de eerste query eerst uitvoert. Daarna zou je $sql prima kunnen hergebruiken, of je plaatst de query-tekst meteen in de aanroep, dan heb je niet eens een variabele nodig.
Maar ik heb ff terug zitten kijken in jouw historie.
Was je hier een aantal maanden geleden (interne link) niet ook al mee bezig?
Ik denk dat het voor de beeldvorming handig is als je hier gewoon even stap voor stap doorheen gaat en niet alles tegelijkertijd probeert te doen. Debug waarden, kijk of INSERTs slagen en of er iets in de database zit.
Begin eens met het uitvoeren van één INSERT-query. De documentatie is hier niet direct heel duidelijk over, maar met behulp van mysqli_insert_id() kun je het auto-increment id van het laatst geINSERTe record opvragen. Deze stop je vervolgens in je tweede query.
Dat mysql_insert_id() is de "vraag autoincrement id op van query #1"-stap uit het bovenstaande boodschappenlijstje. Als je deze gewoon stap voor stap implementeert ben je klaar (althans, met het invoer-deel). En zo zou je in zijn algemeenheid ook code moeten ontwikkelen. Bedenk eerst WAT je gaat doen, en vul het dan simpelweg een voor een in.
Gewijzigd op 29/09/2019 17:42:49 door Thomas van den Heuvel
En vergeet de mysqli_real_escape_string() niet!!!
Die "Niks gevonden" slaat ook nergens op, omdat een INSERT querie niks zoekt. Dat doet SELECT.
En dan alsnog controleer je in het geval van een SELECT met een mysqli_num_rows() of een record bestaat.
Waar worden deze tickets uberhaupt voor gebruikt? Zijn dat activatielinks ofzo? En zoja, waarom zitten die in een aparte tabel?
elk formulier moet een apparte code hebben
dus zo listing?=46fsjhksaadj
gebruikers info
naam: piet
ticket info
ticket naam hein
maak weer een nieuwe formulier aan
gebruikers info
naam: klaas
ticket info
ticket naam kaas
en krijg weer een nieuwe code link listing?=534rjfsjhfhs
zodat die toko die data afleest wat in de databse staat dan
Gebruikers en tickets zijn twee verschillende entiteiten, dus dat zijn twee tabellen.
Code (php)
Of voeg in ieder geval een beetje "zout" toe aan je hash functie:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
for($i = 0; $i < 64; $i++) $token .= $chars[random_int(0,strlen($chars) - 1)];
print($token);
$sql = "INSERT INTO account (u_naam, avatar)
VALUES ('. $_POST['naam'].', '. $_POST['avatar'].');";
$sql .= "INSERT INTO tickets (ticket_titel, token)
VALUES ('. $_POST['ticket_naam'].', '.$token.');";
if ($conn->multi_query($sql) === TRUE) {
echo "succesvol toegevoegd";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
for($i = 0; $i < 64; $i++) $token .= $chars[random_int(0,strlen($chars) - 1)];
print($token);
$sql = "INSERT INTO account (u_naam, avatar)
VALUES ('. $_POST['naam'].', '. $_POST['avatar'].');";
$sql .= "INSERT INTO tickets (ticket_titel, token)
VALUES ('. $_POST['ticket_naam'].', '.$token.');";
if ($conn->multi_query($sql) === TRUE) {
echo "succesvol toegevoegd";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
Escape je data die je in je query plaatst tegen SQL-injection.