Re: Re-inserting newlines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, June 23, 2005 11:09 am, Philip Thompson said:
> On Jun 23, 2005, at 12:20 PM, John Nichel wrote:
>
>> Philip Thompson wrote:
>>
>>> Anyone know how/what to replace the \r\n in the textarea to that
>>> it  shows up correctly with the actual newlines, not the \r\n???

http://php.net/stripslashes

Your mysql_escape_string basically added slashes.

Actually, you *MIGHT* have Magic Quotes "on" in which case your real
problem is that *TWO* different mechanisms are adding slashes.

Magic Quotes calls http://php.net/addslasehes on everything in $_POST (and
$_GET)

Then, you call mysql_escape_string, and add a *SECOND* set of slashes.

Don't do that, first of all.

If Magic Quotes is "on" call stripslashes before you call
mysql_escape_string, or you'll just corrupt your data before you insert
it.

Also, the data you are inserting to the database, complete with escaped
characters, should not really be the data you are re-presenting to the
user if they need to change it.

You should be showing them un-escaped data.

Now, the data that comes back *OUT* of MySQL when you SELECT data that you
previously INSERTed is un-escaped -- The whole *point* of the escape
characters is to add characters that the MySQL parser "eats up" when it
reads in your data, thus correctly interpreting characters that would
otherwise be "special"

But the data you just tried to insert into MySQL, and didn't, for whatever
reason, is "escaped" data, and not suitable for presenting to the User.

If there is a mysql_unescape, use that.  If not, in an ideal world,
present them with the exact same data they gave you -- Only if you have
Magic Quotes "on" then you've already got http://php.net/addslashes called
on it, before you ever really saw it, so you still need to do
http://php.net/stripslashes to it.

>> You shouldn't need \r\n.  \n should work just fine.

Yes, but...

The \r\n came about because his user is on Windows with a Windows browser
with Windows newlines.

While the browser and TEXTAREA are "smart enough" to handle \r\n or \n or
even just \r "the same" there's no need to jump through hoops to strip out
the \r for what you send back to the User if the data was "bad"

You *DO* want to convert \r\n and \r to \n for consistency in your
database, probably... Or maybe not...  I prefer to do that, but that's
just me, maybe.

>> How are you 'inserting' the newlines?  Single quoted string?
>
> That's the thing, I'm not inserting \r\n at all. When filling in the
> form, I hit "Enter" to go to the next line in the textarea. When I
> pull the original data I do:

If you try it from a Linux browser, you're only gonna have \n

If you try it from a Mac browser, you're only gonna have \r

Windows is sending you \r\n, so that's what you got.  Deal with it, and be
prepared to deal with just \r and just \n.

> $textarea = mysql_real_escape_string($_POST["textarea"], $connection);
>
> if ($error) {
>      // somehow replace the \r\n that mysql_real_escape string put in
>
>      // then strip all the other slashes remaining: \' becomes '
>      $textarea = stripslashes($textarea);
>
>      // return to page
> }
>
> That clarify it a bit?

If that is what you are doing, and it works, then your REAL problem is,
indeed, that Magic Quotes is "on" *AND* you are doing mysql_escape_string,
so you are double-addslashing (in effect).  Do *NOT* do that.  You'll make
a mess of your data real fast.

Then you'll end up using http://php.net/stripslashes on data coming *out*
of MySQL, because it has bogus extra \ in it, because you
double-addslashes before you did the INSERT.

This is a very common newbie error, and I can guarantee there are millions
of "working" scripts out there on the 'net that do exactly that:
Magic Quotes "on" does addslashes
Naive programmer does addslashes in PHP
Naive programmer sees bad data coming out of MySQL and does stripslashes

Two wrongs don't make a right.

You'll end up having data problems any time you want to use that data
anywhere else other than that broken application.

Use the example posted earlier to call stripslashes if Magic Quotes is on.

Store *THAT* string as what to send back to the User.

Use mysql_escape_string on that previous result.  Use *that* for your INSERT.

If there is a mysql_unescape_string, you could do that instead of storing
the result of your possible stripslashes...

Kinda ugly, though, particularly if your mysql_escape_string chops of 99%
of War and Peace because there is a semi-colon (;) in the first paragraph,
and it looks like a hack attempt.  The User will not be real happy that
your mysql_escape/unescape threw away 99% of what they typed...

I'm NOT claiming this is what mysql_escape_string *DOES* -- Only that it's
something reasonable like that which it *could* do at some point, if the
string looks funky enough to look like an "attack" on MySQL security.

-- 
Like Music?
http://l-i-e.com/artists.htm

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux