[Postgresql / PHP] Single quote als null waarde opgeslagen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bij het opslaan van gegevens in een Postgresql database wordt een single quote ( ' ), opgeslagen als null value in de database.

In het invulveld bij description voer ik de volgende waarde in: Jeroen '
Na het uitvoeren van de functie: pg_escape_string op de get variabele, staat er het volgende in de GET variabele:

code:
1
2
3
4
5
6
7
8
9
10
11
Array
(
    [fuseaction] => users_groups.save_user
    [user_id] => 1
    [name] => Jeroen
    [password1] => 
    [password2] => 
    [emailaddress] => test
    [description] => Jeroen \\''
    [organisation_id] => 1
)


Als ik vervolgens via php de gegevens in de database insert via een stored procedure, komt er in de database in het description veld het volgende te staan: Jeroen \null

Wanneer ik direct op de database de volgende query uitvoer, komt het wel juist in de DB te staan:

update user set description = 'Jeroen \\''';

Iemand een idee hoe ik dit kan voorkomen?

[ Voor 6% gewijzigd door Verwijderd op 29-05-2006 10:42 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Sowieso moet je je magic_quotes_gpc even uitzetten of zelf teniet doen, want zo te zien wordt er dubbel geescaped.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, dat is waar. maar dat lost het probleem niet op.

Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

En je weet zeker dat die SP het probleem niet is ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou in de SP doe ik niet veel anders dan dit:

code:
1
UPDATE org_user SET name = _name, emailaddress = _emailaddress, description = _description, organisation_id = _organisation_id WHERE user_id = _user_id;


Waar _description gewoon de variabele is, die aan de sp wordt mee gegeven. De sp roep ik op deze manier aan:

code:
1
pg_query ($this->dbconnection, $this->sql);


De waarde in $this->sql is:

code:
1
select set_update_org_user_proc(1, '2006-05-29 11:06:08.448002', 1, 'Jeroen', null, 'test', 'Jeroen \\null', 1)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
aii, ik heb het al gevonden. In m'n DB classe heb ik een fout gemaakt bij het replacen van empty strings.

Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

Ik snap niet waarom [jeroen '] ge-escaped wordt naar [jeroen \\''], ik verwacht namelijk [jeroen ''], die \\ horen er niet in. Kan het zijn dat de input uit je form default ge-escaped wordt door de post method en dat je eerst een unescape moet gebruiken op de string voordat je hem aan pg_escape_string() geeft?

Heb even PHP.net geraadpleegt wordt niet veel wijzer. Interessant: bij addslashes() stond een opmerking:
Also, it is worth mentioning that PostgreSQL will soon start to block queries involving escaped single quotes using \ as the escape character, for some cases, which depends on the string's encoding. The standard way to escape quotes in SQL (not all SQL databases, mind you) is by changing single quotes into two single quotes (e.g, ' ' ' becomes ' '' ' for queries).

You should look into other ways for escaping strings, such as "mysql_real_escape_string" (see the comment below), and other such database specific escape functions.

... gecensureerd ...


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik voer op elke get variabele de volgende funties uit

$_GET = array_map('htmlspecialchars', $_GET);
$_GET = array_map('pg_escape_string', $_GET);

code:
1
[description] => jeroen \'


wordt vervolgens

code:
1
[description] => jeroen \\''

Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

Zie waarschuwing mijn vorige posting, zorg er voor dat ook de single quotes (in 'htmlspecialchars')worden omgezet.
This function is useful in preventing user-supplied text from containing HTML markup, such as in a message board or guest book application. The optional second argument, quote_style, tells the function what to do with single and double quote characters. The default mode, ENT_COMPAT, is the backwards compatible mode which only translates the double-quote character and leaves the single-quote untranslated. If ENT_QUOTES is set, both single and double quotes are translated and if ENT_NOQUOTES is set neither single nor double quotes are translated.
gebruik dus ENT_QUOTES.

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Het is bij dit soort conversie slagen altijd handig om bij te houden waarom iets waarin veranderd. Waarschijnlijk staat het automatisch escapen van get en post variabelen aan waardoor er nu dingen dubbel gebeuren. Bedenk je eens waarom je die eerste slash nodig hebt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1