Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.php > #3259
| From | Jerry Stuckle <jstucklex@attglobal.net> |
|---|---|
| Newsgroups | comp.lang.php |
| Subject | Re: PHP/MySQL oddity |
| Date | 2011-10-02 09:55 -0400 |
| Organization | A noiseless patient Spider |
| Message-ID | <j69qgj$37b$1@dont-email.me> (permalink) |
| References | <n6le87lkemajdupb9d24qn811ult5t4dm1@4ax.com> <us2kl8-apa.ln1@luuk.invalid.lan> <ej1f87d8q3kh47e3bf45okpiv8t4doc9dn@4ax.com> <4e8792f1$0$31289$a8266bb1@newsreader.readnews.com> <4486353.dkDdi1TLyq@PointedEars.de> |
On 10/1/2011 10:30 PM, Thomas 'PointedEars' Lahn wrote:
> Denis McMahon wrote:
>
>> On Sat, 01 Oct 2011 17:31:38 -0400, Mason Barge wrote:
>>> On Sat, 01 Oct 2011 20:31:31 +0200, Luuk<Luuk@invalid.lan> wrote:
>>>> On 01-10-2011 20:14, Mason Barge wrote:
>>>>> <form name=...><input type=text . . . value = '<?php echo $info;?>'
>>>> After PHP is done, and when $info contains "some'text" (without the
>>>> double-quotes) What would you guess to be send to your browser?
>>>>
>>>> Indeed, it's:
>>>> <form name=...><input type=text . . . value = 'some'text'.....
>>>
>>> Thank you very much.
>>>
>>> Changed it to value=\"$info\"
>>
>> You need to understand where and when to use the escape functions.
>>
>> Specifically, when using text that was supplied by the user in any sql
>> statement, use e.g:
>>
>> <?php
>>
>> if (isset($_POST['fieldname']))
>> {
>> $fielddata = mysql_real_escape_string($_POST['fieldname']);
>> }
>> else
>> {
>> $fielddata = "some_default_value";
>> }
>>
>> $sql = "UPDATE tablename SET fieldname = '{$fielddata}' WHERE
>> _condition_";
>
> This approach fails for
>
> $fielddata = "That's my default";
>
No it will not. Denis's method is the correct way to escape the string.
> And let us hope that the default value is not, e. g. because of an
> accidental copy& paste operation,
>
> $fielddata = "That'; DROP TABLE tablename; …";
>
Gee, let's hope you know how to program. There are a lot of things
which can go wrong when you write the wrong code. For instance, let's
hope that you don't code, e.g. because of an accidental copy & paste
operation:
exec ('rm -r /');
And BTW - your code will fail anyway. mysql_query() will not execute
multiple queries in a single call.
> It is a good idea to always escape values in database queries.
>
Not necessary when you have a known, fixed default value.
> It is an even better idea to use prepared statements to do that only when
> necessary and in the way required by the used DBMS. MySQLi and PDO are
> among the DBA PHP modules which support this.
>
> $mysqli = new Mysqli(…);
> $stmt = $mysqli->prepare(
> "UPDATE tablename SET fieldname=? WHERE foo = ?");
> $stmt->bind_param('ss', $fielddata, $condition);
> $stmt->execute();
> $stmt->close();
>
> (If you do not like the object-oriented variant you can still use the simple
> functional variant. Function identifiers would be `mysqli_prepare' and so
> forth.)
>
A matter of opinion. For instance, prepared statements also have
additional overhead. Neither is "better" than the other - as long as
you escape your data.
> Using the mysqli module, and the corresponding MySQL versions, instead of
> mysql, and corresponding MySQL versions, is /*strongly*/ recommended:
>
> <http://php.net/manual/en/mysqli.overview.php>
>
The mysqli interface does have some advantages - but also some
disadvantages (i.e. more processing required). Neither is "best" and
both should be evaluated in the context they will be used.
> However, I prefer PDO as it is more flexible in terms of configuration and
> reuse:
>
> $pdo = new PDO(…);
> $stmt = $pdo->prepare(
> "UPDATE tablename SET fieldname=:fieldname WHERE foo = :condition");
> $stmt->execute(array(
> 'fieldname' => $fielddata,
> 'condition' => $condition
> ));
> $stmt->closeCursor();
>
> (You can also still bind your parameters the mysqli way.)
>
> <http://php.net/manual/en/book.pdo.php>
>
Which has significant overhead when compared to the mysql and mysqli
interfaces. And any code can be reused if it is designed properly.
> In Zend Framework it would be as simple as
>
> $db = new Zend_Db_Adapter_Pdo_Mysql(…);
> $db->update('tablename',
> array(
> 'fieldname' => $fielddata
> ),
> array(
> 'foo' => $condition
> ));
>
> <http://framework.zend.com/apidoc/1.11/db_Db_Adapter_Pdo_Mysql.html#%5CZend_Db_Adapter_Pdo_Mysql>
>
>
> PointedEars
Adding even more overhead!
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================
Back to comp.lang.php | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
PHP/MySQL oddity Mason Barge <masonbarge@gmail.com> - 2011-10-01 14:14 -0400
Re: PHP/MySQL oddity Luuk <Luuk@invalid.lan> - 2011-10-01 20:31 +0200
Re: PHP/MySQL oddity Mason Barge <masonbarge@gmail.com> - 2011-10-01 17:31 -0400
Re: PHP/MySQL oddity Denis McMahon <denismfmcmahon@gmail.com> - 2011-10-01 22:23 +0000
Re: PHP/MySQL oddity Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2011-10-02 04:30 +0200
Re: PHP/MySQL oddity Jerry Stuckle <jstucklex@attglobal.net> - 2011-10-02 09:55 -0400
Re: PHP/MySQL oddity Arno Welzel <usenet@arnowelzel.de> - 2011-10-02 19:35 +0200
csiph-web