Hallo,
Ik ben sinds kort weer een beetje begonnen met php en ik loopt een beetje vast bij het update van tekst naar de database.

Dit is het script:
<?php

error_reporting(0);
include('config/database.php');
$id = $_GET['id'];
$task = $_POST['task'];

mysql_select_db("todo",$conn);
if(isset($_POST['edit'])){
$edit = "UPDATE todo SET task='$task' WHERE id='$id'";
mysql_query($edit, $conn);
};

$sql = "SELECT * FROM todo WHERE id='$id'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "<b>ID:</b> ".$row['id']."<br /> <b>Taak:</b><br />
<form method=post>
<textarea name=task cols=73 rows=9>".$row[task]."</textarea><br />
<input type=submit name=edit value=edit style=float: left>
</form>
</p>";
}
} else {
echo "Verkeerde ID";
}


$conn->close();

?>
(het is misschien een beetje rommelig maar dat komt wel als ik wat meer van php ken)
En als ik dan tekst verander en op submit button klik gebeurt er niks. Wat doe ik fout? Ik heb al meerdere tutorials gevold maar het wilt niet lukken.

Alvast bedankt.
- SanThe - op 05/02/2017 18:43:53

[quote="Marco - op 05/02/2017 18:35:31"]
<form method=post><input type=submit name=delete id=delete value=Delete!></form>
Is toch niks mis mee?


Er is niks goed aan.
Je mist alle dubbele html quotes.
En eventueel ook de action mist.


Verder probeer je de value op "Delete!" te zetten.
Ik neem niet aan dat jij in de database een id hebt met die waarde.
Dus er wordt niks verwijderd.
[/quote]
De HTML quotes gebruik ik niet, gebruik ik bij andere html codes ook niet en die werken wel.
de action is gewoon het zelfde bestand dus die hoeft niet?
Ja de value is toch wat op de button komt te staan?
Allereerst werkt de DELETE-functie in MySQL op record basis, dus hoef je niet aan te geven dat de inhoud van bepaalde velden wilt verwijderen, waar jij blijkbaar nu een * gebruikt.
De query DELETE FROM todo WHERE id=2 voldoet prima.

Los daarvan is je query onbeveiligd tegen SQL-injection. Iemand met kwaadwillende bedoelignen kan nu je query manipuleren met een hoop ander kwaads, dus moeten we de inhoud van $id escapen met $conn->real_escape_string.

Ook het versturen van je formulier gaat niet helemaal op de juiste manier. je wilt immers niet controleren of een knop bestaat, maar of het formulier is verstuurd.

Dat alles bij elkaar levert deze code op:

<?php
if($_SERVER['REQUEST_METHOD'] == "POST"){
	$id = $conn->real_escape_string($_GET['id']); // of $_POST['id'] indien het uit een formulier komt.
	$sql_delete = "DELETE FROM todo WHERE id='".$id."'";
   	if ($conn->query($sql_delete) === TRUE) {
		echo "<script type= 'text/javascript'>alert('Verwijderd!');</script><a onclick=window.open('index.php','name','width=600,height=400') class=edit >Ga terug!</a>";
	} else {
    		echo "<script type= 'text/javascript'>alert('Error: " . $sql . "<br>" . $conn->error."');</script>";
	}
}
?>

Als je site in productie is is, en dus publiekelijk op het internet, dan zou ik sowieso geen technische foutmeldingen uit bijv. $conn->error tonen. Gebruikers hebben daar weinig aan, en hackers maak je meer wijs dan ze zouden moeten weten.
Je kan een variabele in je configuratiebestand (config.php) plaatsen waarin je dergelijke uitgebreide foutmeldingen aan kan zetten, wat handig is tijdens ontwikkeldoeleinden. Uiteraard is het ook verstandig om zulke foutmeldingen te loggen in een log-file. Dit kan met de error_log functie in .htaccess.
**quoteknip**
Dit werkt opzich wel, alleen er zit ook nog een andere submit button om het een en ander aan te passen en als je dus die button gebruikt word het gene ook verwijderd en dat is niet de bedoeling.

Van de real_escape_sting wist ik niet. Er is mij verteld dat bij een ID oid niet zo veel kan gebeuren. Ja dit 'project' is op een openbare host maar niemand weet van die host. Maar ik ga me zeker ook verdiepen in het beveiliging gedeelte, maar dat komt later pas. Want als je bijna niks van php kan valt er ook weinig te beveiligen :P

Als je meerdere submit knoppen hebt, dan kan je die isset er wel aan toevoegen.

<?php
if(($_SERVER['REQUEST_METHOD'] == "POST") && (isset($_POST['delete'])) ) {
// doe iets!
?>
Ik heb wel al htmlspecialchars geleerd maar dat is alleen voor de text uit de database te halen toch?

[size=xsmall]Toevoeging op 05/02/2017 19:02:36:[/size]

Oke ik ga die er even aan toevoegen.
htmlspecialchars is bedoeld om speciale HTML-karakters om te zetten naar entities. Zo wordt een < onschadelijk gemaakt naar een &lt; (Lower than) entitie. In het algemeen kan je met deze functie HTML-opmaak escapen en onschadelijk maken. Dit is geen oplossing tegen SQL-injection. het gebruik van die functie hoort alleen op de uitvoer te gebeuren, waar je de data dus op het scherm toont.

Dus NIET voordat je het in de database zet. Je wilt de data namelijk niet verminken.
Oké, maar zoals ik zei ga ik me later bezig houden met beveiligingen.

Het is gelukt en het werkt, maar wat ik raar vind is:
Als ik een isset maak voor gegevens naar de databse te sturen dat die wel gewoon werkt, maar als ik dan een isset maak voor het verwijderen van gegevens dat die dan niet werkt. Maar het werkt en ik zal dit zeker onthouden. Bedankt voor je hulp (alweer :P).
Marco - op 05/02/2017 19:15:24

Oké, maar zoals ik zei ga ik me later bezig houden met beveiligingen.

Kijk....en dan verlies je steken, en is de kans op lekken groter. Dit is juist de bron waarin veel veiligheidslekken al worden misbruikt. Een huis beveilig je ook vanaf het moment dat de deur erin zit. Meteen komt er een slot op!

Ook een goede tip voor iedereen is om oude code grondig door te nemen, en te patchen indien nodig. Op die manier heb ik ooit eens een lek gevonden in een grote website.

Ja ik snap wat je bedoelt, maar ik ben nog lang niet bezig met grote / openbare projecten. Ik ben van mening als ik eerst de PHP codering onder de knie dat de beveiliging dan makkelijker gaat. Ik kan wel een htmlspecialchars of een real_escape_string achter iets plakken, maar ik heb dan eigenlijk geen idee van wat ik doe. natuurlijk ik realiseer me al te goed dan als je beveiliging niet goed is dat je website ook niet veilig is.

Reageren