Single quotes voor query verwijderen
Ten eerste zal ik zeggen dat ik nu enige tijd bezig met PHP(eigenlijk nu bijna 3 maanden, toen ik al een tijdje bezig was met de opleiding informatica).
Ik heb opzich inmiddels een aardige basis maar ik kan nog niet heel erg goed phpen dus ik hoop dat jullie me verder kunnen helpen met een klein probleempje waar ik mee zit. Mijn probleem is als volgt:
Ik gebruik een content-editor zodat ik zelf nieuws kan toevoegen op mijn pagina. (Ja dit kan via een textarea maar op deze manier kan ik gemakkelijk dingen dik gedrukt maken en ook werkelijk zien in mijn textarea(en nog veel meer)). Op het moment dat ik de tekst uit het textarea haal, encode die dat naar een String. Maar als ik nou wil dat ik ook single quotes kan toevoegen, zodat mensen bijvoorbeeld 't kunnen typen in het textarea, lukt dat niet.
De code die ik gebruik om het nieuws erin te zetten is als volgt:
Quote:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$titel = htmlentities($_POST['titel']);
$content = htmlentities($_POST['content']);
$content = str_replace("\n", "<br>", $content);
if (empty($titel))
die("Voeg alstublieft de titel toe.");
if (empty($content))
die("Voeg alstublieft inhoudt toe.");
$link = "INSERT INTO content_tb VALUES(0, '$titel', NOW(), '$content')";
$res = mysql_query($link) or die("Er is iets fout gegaan.");
if ($res) {
die("Het nieuws is succesvol toegevoegt.<br /><br />Klik <a href='http://dorpsraadloenenaandevecht.nl/'>hier</a> om het nieuws te bekijken of <br /><br /> klik <a href='index.php'>hier</a> om terug te gaan.");
} else {
die("Er is iets fout gegaan in het systeem.");
}
$titel = htmlentities($_POST['titel']);
$content = htmlentities($_POST['content']);
$content = str_replace("\n", "<br>", $content);
if (empty($titel))
die("Voeg alstublieft de titel toe.");
if (empty($content))
die("Voeg alstublieft inhoudt toe.");
$link = "INSERT INTO content_tb VALUES(0, '$titel', NOW(), '$content')";
$res = mysql_query($link) or die("Er is iets fout gegaan.");
if ($res) {
die("Het nieuws is succesvol toegevoegt.<br /><br />Klik <a href='http://dorpsraadloenenaandevecht.nl/'>hier</a> om het nieuws te bekijken of <br /><br /> klik <a href='index.php'>hier</a> om terug te gaan.");
} else {
die("Er is iets fout gegaan in het systeem.");
}
Ik ben er al even mee bezig geweest. Ik heb het een en ander geprobeerd met str_replace, mysql_real_escape_string(), preg_replace, maar ik heb nog geen succes gehad. Dit kan ook komen omdat ik nog niet echt ervaren ben, aangezien ik soms ook totaal niet kon begrijpen wat er uitgelegd werd op het internet.
Ik hoop dat jullie mij iets verder op weg kunnen helpen en in ieder geval bedankt voor het nemen van de moeite!
Met vriendelijke groet,
Thomas Helling
Geen htmlentities() in de database zetten, alleen mysql_real_escape_string() gebruiken. Je script is nu lek. Als je het later op de site gaat zetten gebruik je htmlentities() en nl2br().
Quote:
Als je het later op de site gaat zetten gebruik je htmlentities() en nl2br().
Ik heb nu zeg maar
mysql_real_escape_string($_POST['content']);
ipv gebruik van htmlentities. Maar ik krijg helaas nog steeds de foutmelding van SQL Syntax met 't op het moment dat ik probeer het te uploaden naar de database..
Heb je enig idee?
Laat de query eens zien.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
# Als er op POST is geklikt:
if($_SERVER['REQUEST_METHOD'] == 'POST') {
# Standaard variabele:
$error = '';
# Invoervelden naar variabelen:
$titel = trim($_POST['titel']);
$content = trim($_POST['content']);
# Nu gaan we kijken of alles goed is (lengte en dergelijke).
# Check de titel:
if(isset($titel)) {
if(strlen($titel) == 0) {
$error .= 'Voeg a.u.b. een titel toe.';
}
}
# Als titel niet bestaat:
else {
$error .= 'Er is geen titel!';
}
# Check de textarea content:
if(isset($content)) {
# Ik zou strlen verhogen:
if(strlen($content) == 0) {
$error .= 'Voeg a.u.b. meer content toe!';
}
}
# Textarea bestaat niet:
else {
$error .= 'Er is geen content!';
}
# Als er geen errors zijn, gaan we alles
# toevoegen aan de database:
if($error == '') {
# Eventueel kun je hier nog checken of er al een bericht zoals
# deze in de database zit. (Ga ik nu niet doen)
# Ik denk niet dat NOW() bij een insert lukt, dus hier een ommetje.
# De output zal zo zijn: jaar-maand-dag uur:minuten:seconden.
# Als je dit wilt veranderen, kijk eens naar de date functie van PHP:
$date = date('Y-m-d H:i:s');
# Connectie met de database:
$conn = mysqli_connect('localhost', 'root', 'password', 'database');
# Alles toevoegen:
$insert = mysqli_query($conn, "INSERT INTO content_tb (veldnaam1,veldnaam2,veldnaam3,veldnaam4)
VALUES (
'0',
'".mysqli_real_escape_string($conn, $titel))."',
'".$date."',
'".mysqli_real_escape_string($conn, $content)."')") or trigger_error('Er kon geen database connectie gemaakt worden.');
# Kijken of alles in de database zit:
if($insert) {
echo 'Het artikel is succesvol toegevoegd.';
}
else { # Als het niet succesvol is:
echo 'Het artikel kon NIET worden toegevoegd.';
}
}
# Alle errors tonen aan de mensen:
echo $error;
}
?>
# Als er op POST is geklikt:
if($_SERVER['REQUEST_METHOD'] == 'POST') {
# Standaard variabele:
$error = '';
# Invoervelden naar variabelen:
$titel = trim($_POST['titel']);
$content = trim($_POST['content']);
# Nu gaan we kijken of alles goed is (lengte en dergelijke).
# Check de titel:
if(isset($titel)) {
if(strlen($titel) == 0) {
$error .= 'Voeg a.u.b. een titel toe.';
}
}
# Als titel niet bestaat:
else {
$error .= 'Er is geen titel!';
}
# Check de textarea content:
if(isset($content)) {
# Ik zou strlen verhogen:
if(strlen($content) == 0) {
$error .= 'Voeg a.u.b. meer content toe!';
}
}
# Textarea bestaat niet:
else {
$error .= 'Er is geen content!';
}
# Als er geen errors zijn, gaan we alles
# toevoegen aan de database:
if($error == '') {
# Eventueel kun je hier nog checken of er al een bericht zoals
# deze in de database zit. (Ga ik nu niet doen)
# Ik denk niet dat NOW() bij een insert lukt, dus hier een ommetje.
# De output zal zo zijn: jaar-maand-dag uur:minuten:seconden.
# Als je dit wilt veranderen, kijk eens naar de date functie van PHP:
$date = date('Y-m-d H:i:s');
# Connectie met de database:
$conn = mysqli_connect('localhost', 'root', 'password', 'database');
# Alles toevoegen:
$insert = mysqli_query($conn, "INSERT INTO content_tb (veldnaam1,veldnaam2,veldnaam3,veldnaam4)
VALUES (
'0',
'".mysqli_real_escape_string($conn, $titel))."',
'".$date."',
'".mysqli_real_escape_string($conn, $content)."')") or trigger_error('Er kon geen database connectie gemaakt worden.');
# Kijken of alles in de database zit:
if($insert) {
echo 'Het artikel is succesvol toegevoegd.';
}
else { # Als het niet succesvol is:
echo 'Het artikel kon NIET worden toegevoegd.';
}
}
# Alle errors tonen aan de mensen:
echo $error;
}
?>
Bij je insert heb/had je de NOW() functie die denk ik alleen bij het ophalen werkt. En ook had je een er een 0 staan zonder ' tags erond, dus heb ik die ook even toegevoegd.
Ook had je geen veldnamen opgegeven, zie vooral de code bij $insert. Ook had ik een bedenking bij dat je een 0 erbij steekt... Je kunt toch gemakkelijk een DEFAULT in je database stoppen? :p
NOW() kan je prima in een insert gebruiken. Veel makkelijker dus dan eerst een datum aan te maken in php.
Erwin H op 05/01/2012 09:32:29:
Gebruik geen empty() om te controleren of variabelen wel of niet gezet zijn. isset() met eventueel waarde checks zijn veel beter.
Dat hangt er van af.
Dat zijn twee functies die je om andere redenen gebruikt.
if(empty($error)) {
Daar is de empty perfect op zijn plaats. Ik zie niet in waarom je nog met isset zou beginnen.
Maar je moet empty wel goed gebruiken.
Net zoals dat het geval is voor isset verwacht empty een variabele. Niet een string.
Dit:
if(empty(trim($_POST['titel']))) {
mag je niet doen. Als je zoiets wil, moet je eerst die trim(($_POST['titel']) in een variabele steken.
eventueel zoiets
Code (php)
Gewijzigd op 05/01/2012 10:46:19 door Kris Peeters
Even onthouden mijn php script werkt wel gewoon, alleen niet met single quotes in de variabele $content. Het is trouwens ook zo dat als ik gewoon \'t type dat het dan wel goed gaat. Ik heb addslashes ook wel geprobeerd, als addslashes($content), maar geen succes.
Voor de rest wil ik jullie sowieso al heel erg bedanken voor jullie reacties en ik hoop dat jullie me nog iets verder kunnen helpen! ^^. Ik zal mijn script inderdaad wel iets gaan moderniseren want als ik dit zo zie ziet het er wel wat duidelijker en ook beter voor mezelf uit om dat te doen.
In ieder geval heeft nog iemand suggesties wat het eventueel anders kan zijn(Aaron ik heb jouw script ook geprobeerd alleen die werkt ook niet..)
Gewijzigd op 05/01/2012 11:39:26 door Thomas Helling
Veel succes verder!
- SanThe - op 05/01/2012 02:55:55:
Laat de query eens zien.
Inclusief de relevante php die er omheen zit.
Quote:
include 'connection.php';
mysql_select_db($database_news, $news);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$titel = htmlentities($_POST['titel']);
$content = mysql_real_escape_string($_POST['content']);
$content = str_replace("\n", "<br>", $content);
$content = str_replace('\'', 'test', (String) $content);
if (empty($titel))
die("Voeg alstublieft de titel toe.");
if (empty($content))
die("Voeg alstublieft inhoudt toe.");
$link = "INSERT INTO content_tb VALUES(0, '$titel', NOW(), '$content')";
$res = mysql_query($link) or die("Er is iets fout gegaan.");
if ($res) {
die("Het nieuws is succesvol toegevoegt.<br /><br />Klik <a href='http://dorpsraadloenenaandevecht.nl/'>hier</a> om het nieuws te bekijken of <br /><br /> klik <a href='index.php'>hier</a> om terug te gaan.");
} else {
die("Er is iets fout gegaan in het systeem. Raadpleeg uw administrator.");
} */
} else {
echo '
<h2 class="item">Voeg nieuws toe</h2>
<form action="" method="POST">
Titel <input type="text" name="titel" size="50"><br /><br />
<textarea name="content" cols="84" rows="30">Inhoud</textarea><br /><br />
<input type="submit" value="Add News">
</form>
';
}
mysql_select_db($database_news, $news);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$titel = htmlentities($_POST['titel']);
$content = mysql_real_escape_string($_POST['content']);
$content = str_replace("\n", "<br>", $content);
$content = str_replace('\'', 'test', (String) $content);
if (empty($titel))
die("Voeg alstublieft de titel toe.");
if (empty($content))
die("Voeg alstublieft inhoudt toe.");
$link = "INSERT INTO content_tb VALUES(0, '$titel', NOW(), '$content')";
$res = mysql_query($link) or die("Er is iets fout gegaan.");
if ($res) {
die("Het nieuws is succesvol toegevoegt.<br /><br />Klik <a href='http://dorpsraadloenenaandevecht.nl/'>hier</a> om het nieuws te bekijken of <br /><br /> klik <a href='index.php'>hier</a> om terug te gaan.");
} else {
die("Er is iets fout gegaan in het systeem. Raadpleeg uw administrator.");
} */
} else {
echo '
<h2 class="item">Voeg nieuws toe</h2>
<form action="" method="POST">
Titel <input type="text" name="titel" size="50"><br /><br />
<textarea name="content" cols="84" rows="30">Inhoud</textarea><br /><br />
<input type="submit" value="Add News">
</form>
';
}
Gewijzigd op 05/01/2012 13:28:47 door Thomas Helling
- SanThe - op 04/01/2012 23:31:09:
Geen htmlentities() in de database zetten, alleen mysql_real_escape_string() gebruiken. Je script is nu lek. Als je het later op de site gaat zetten gebruik je htmlentities() en nl2br().
Je hebt hier nog niks mee gedaan.
Toevoeging op 05/01/2012 13:44:16:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$link = "INSERT INTO content_tb
(
// hier moeten de tablenamen komen waarin de data komt
)
VALUES
(
0,
'" . mysql_real_escape_string($_POST['titel'] . "',
NOW(),
'" . mysql_real_escape_string($_POST['content'] . "'
)";
?>
$link = "INSERT INTO content_tb
(
// hier moeten de tablenamen komen waarin de data komt
)
VALUES
(
0,
'" . mysql_real_escape_string($_POST['titel'] . "',
NOW(),
'" . mysql_real_escape_string($_POST['content'] . "'
)";
?>
Ik snap het echt niet want het werkt nog steeds niet, altijd nog steeds dezelfde error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't')' at line 1.
Heeft echt niemand een ideetje?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$link = "INSERT INTO content_tb
(
// hier moeten de tablenamen komen waarin de data komt
)
VALUES
(
0,
'" . mysql_real_escape_string(stripslashes($_POST['titel']) . "',
NOW(),
'" . mysql_real_escape_string(stripslashes($_POST['content']) . "'
)";
?>
$link = "INSERT INTO content_tb
(
// hier moeten de tablenamen komen waarin de data komt
)
VALUES
(
0,
'" . mysql_real_escape_string(stripslashes($_POST['titel']) . "',
NOW(),
'" . mysql_real_escape_string(stripslashes($_POST['content']) . "'
)";
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$link = "INSERT INTO content_tb
(
// hier moeten de tablenamen komen waarin de data komt
)
VALUES
(
0,
'" . mysql_real_escape_string($_POST['titel'] . "',
NOW(),
'" . mysql_real_escape_string($_POST['content'] . "'
)";
?>
$link = "INSERT INTO content_tb
(
// hier moeten de tablenamen komen waarin de data komt
)
VALUES
(
0,
'" . mysql_real_escape_string($_POST['titel'] . "',
NOW(),
'" . mysql_real_escape_string($_POST['content'] . "'
)";
?>
Ik heb wel mijn code wat opgeschoond maar volgens mij niet dingen aangepast die er ook een rol bij kunnen spelen lijkt me.
In ieder geval helemaal bedankt, en ik zou zeggen tot de volgende keer maar weer! ^^
Aaron - op 05/01/2012 13:16:32:
misschien moet je eens kijken naar de "magic quotes".
Dat staat waarschijnlijk aan.
Vandaar stripslashes().
Kris Peeters op 05/01/2012 10:45:15:
Dat hangt er van af.
Dat zijn twee functies die je om andere redenen gebruikt.
Erwin H op 05/01/2012 09:32:29:
Gebruik geen empty() om te controleren of variabelen wel of niet gezet zijn. isset() met eventueel waarde checks zijn veel beter.
Dat hangt er van af.
Dat zijn twee functies die je om andere redenen gebruikt.
En wat als iemand hier voor titel "0" meegeeft? Gaat empty op nat. Want "0" of 0 wordt als leeg gezien.
Daarnaast gebruik je in je voorbeeld
$titel = trim($_POST['titel']);
Zonder eerst met isset te kijken of $_POST['titel'] wel bestaat. Ga je nog een keer nat.
Daarvoor, je voorbeeld is niet goed. Veel beter is om gewoon op een bestaande waarde te testen (isset()) en daarna te kijken of het aan je eisen voldoet met normale checks, niet met empty().
Zelf zou ik bijvoorbeeld dit gebruiken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
# Even $code toevoegen:
$code = 'Dit is een test.';
# Standaard variabele:
$error = '';
# Kijken of $code bestaat:
if(isset($code)) {
if(strlen($code) < 5)) {
$error .= 'Voeg meer code toe.';
}
# Als er een maximum is:
if(strlen($code) > 1500)) {
$error .= 'De code is te lang.';
}
}
# Als $code niet bestaat:
else {
$error .= 'De variabele $code bestaat niet!';
}
?>
# Even $code toevoegen:
$code = 'Dit is een test.';
# Standaard variabele:
$error = '';
# Kijken of $code bestaat:
if(isset($code)) {
if(strlen($code) < 5)) {
$error .= 'Voeg meer code toe.';
}
# Als er een maximum is:
if(strlen($code) > 1500)) {
$error .= 'De code is te lang.';
}
}
# Als $code niet bestaat:
else {
$error .= 'De variabele $code bestaat niet!';
}
?>
Aaron - op 05/01/2012 19:03:27:
Erwin, normaal gaat $_POST['titel'] niet leeg zijn en anders krijg je toch een error van PHP en als je het wilt voeg je makkelijk een isset toe...
Je bedoelt dat je vertrouwt op het feit dat de gebruiker het wel goed doet? Big no-no natuurlijk.
Of, als hij dat niet doet, dan vind je het niet erg dat er een vreemde foutmelding op het scherm komt waar de gebruiker niets van snapt? Nog een big no-no wat mij betreft.
Gewoon controleren of alles klopt, dan weet je 1) zeker dat je geen vreemde troep in je variabelen krijgt en dus dat er niets mis gaat en 2) dat je een nette melding kan maken aan de gebruiker als het toch fout gaat.
De code hierboven zou je ook wel de kortere versie van PHP kunnen gebruiken...
Bijvoorbeeld inderdaad.