Single quotes voor query verwijderen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Thomas Helling

Thomas Helling

04/01/2012 23:18:28
Quote Anchor link
Beste lezers,

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.");
}


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
 
PHP hulp

PHP hulp

13/11/2024 07:36:31
 
- SanThe -

- SanThe -

04/01/2012 23:31:09
Quote Anchor link
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().
 
Thomas Helling

Thomas Helling

04/01/2012 23:55:17
Quote Anchor link
hmm, ik had inderdaad wel gelezen dat mysql_real_escape_string() tegen sql injections was. Ik heb wel al enige beveiliging op de website gezet en er worden eigenlijk alleen maar dingen uitgelezen in het open gedeelte. Maar to the point:

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?
 
- SanThe -

- SanThe -

05/01/2012 02:55:55
Quote Anchor link
Laat de query eens zien.
 

05/01/2012 04:44:30
Quote Anchor link
Ik heb even een kleine code geschreven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }

    
?>

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
Gewijzigd op 05/01/2012 19:07:37 door
 
Erwin H

Erwin H

05/01/2012 09:32:29
Quote Anchor link
Gebruik geen empty() om te controleren of variabelen wel of niet gezet zijn. isset() met eventueel waarde checks zijn veel beter.
NOW() kan je prima in een insert gebruiken. Veel makkelijker dus dan eerst een datum aan te maken in php.
 
Kris Peeters

Kris Peeters

05/01/2012 10:45:15
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if(isset($_POST['titel'])) {
  $titel = trim($_POST['titel']);
  if (empty($titel)) {
    ...
  }
}

?>
Gewijzigd op 05/01/2012 10:46:19 door Kris Peeters
 
Thomas Helling

Thomas Helling

05/01/2012 11:19:44
Quote Anchor link
Erg bedankt voor de moeite.
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
 

05/01/2012 13:16:32
Quote Anchor link
Thomas, als ik dat hier zou proberen zou het hoogstwaarschijnlijk wel werken. Ik weet niet wat het zou kunnen zijn, misschien moet je eens kijken naar de "magic quotes".

Veel succes verder!
 
- SanThe -

- SanThe -

05/01/2012 13:18:31
Quote Anchor link
- SanThe - op 05/01/2012 02:55:55:
Laat de query eens zien.


Inclusief de relevante php die er omheen zit.
 
Thomas Helling

Thomas Helling

05/01/2012 13:28:16
Quote Anchor link
In ieder geval bedankt. Dit is mijn gehele file:

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>
';
}
Gewijzigd op 05/01/2012 13:28:47 door Thomas Helling
 
- SanThe -

- SanThe -

05/01/2012 13:39:42
Quote Anchor link
- 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)
PHP script in nieuw venster Selecteer het PHP script
1
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'] . "'
    )"
;
?>
 
Thomas Helling

Thomas Helling

05/01/2012 17:52:48
Quote Anchor link
Sorry voor de late reactie, ik kom net terug van werk.( ja ik weet het ambtenaar dagen) ^^. Ja ik heb het geprobeerd maar het werkt echter niet.
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?
 
- SanThe -

- SanThe -

05/01/2012 17:55:03
Quote Anchor link
En zo?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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']) . "'
    )"
;
?>
 
Thomas Helling

Thomas Helling

05/01/2012 18:03:48
Quote Anchor link
Op een of andere manier, werkt die nu wel! Ik snap echt niet wat er mis kon zijn maar jouw kleine scriptje heeft me wel geholpen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'] . "'
    )"
;
?>


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! ^^
 
- SanThe -

- SanThe -

05/01/2012 18:06:02
Quote Anchor link
Aaron - op 05/01/2012 13:16:32:
misschien moet je eens kijken naar de "magic quotes".


Dat staat waarschijnlijk aan.
Vandaar stripslashes().
 
Erwin H

Erwin H

05/01/2012 18:09:55
Quote Anchor link
Kris Peeters op 05/01/2012 10:45:15:
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().
 

05/01/2012 19:03:27
Quote Anchor link
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...

Zelf zou ik bijvoorbeeld dit gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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!';
}

?>
Gewijzigd op 05/01/2012 19:14:24 door
 
Erwin H

Erwin H

05/01/2012 19:07:39
Quote Anchor link
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.
 

05/01/2012 19:12:27
Quote Anchor link
Kijk even hierboven hoe ik het zou doen Erwin :p. Ik weet ook wel dat je moet kijken of de gebruiker het formulier niet gemanipuleerd heeft of dat het gewoon compleet is.

De code hierboven zou je ook wel de kortere versie van PHP kunnen gebruiken...
Gewijzigd op 05/01/2012 19:14:58 door
 
Erwin H

Erwin H

05/01/2012 19:16:07
Quote Anchor link
Bijvoorbeeld inderdaad.
 



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.