In message <[EMAIL PROTECTED]>, Duncan Booth wrote:
> Lawrence D'Oliveiro <[EMAIL PROTECTED]> wrote:
>
>> In message <[EMAIL PROTECTED]>, Duncan Booth
>> wrote:
>>
>>> Lawrence D'Oliveiro <[EMAIL PROTECTED]> wrote:
>>>
>>>> def EscapeSQLWild(Str) :
>>>> """escapes MySQL pattern wildcards in Str."""
>>>> Result = []
>>>> for Ch in str(Str) :
>>>> if Ch == "%" or Ch == "_" :
>>>> Result.append("\\")
>>>> #end if
>>>> Result.append(Ch)
>>>> #end for
>>>> return "".join(Result)
>>>> #end EscapeSQLWild
>>>
>>> That doesn't quite work. If you want to stop wildcards being
>>> interpreted as such in a string used as a parameter to a query, then
>>> you have to escape the escape character as well.
>>
>> That's part of the separation of function. Note that the above
>> function does not generate a MySQL string literal: you must still put
>> it through the previously-defined SQLString routine, which will
>> automatically escape all the specials added by EscapeSQLWild.
>>
> You are still missing the point. I'm not talking about generating a MySQL
> string literal, I'm talking about preventing wildcards characters having
> their special meaning when using the string as a parameter in
> cursor.execute.
But that's what cursor.execute will do if you use its parameter-substitution
mechanism--generate a string literal.
> You still have to escape the escape character...
Which will be done by cursor.execute if you use its parameter-substitution
mechanism.
> Calling the SQLString routine in this situation would be wrong because it
> would escape characters such as newline which must not be escaped.
SQLString will convert newlines into the \n sequence in the generated string
literal, which MySQL will interpret as a newline. cursor.execute's
parameter-substitution mechanism would do exactly the same thing.
--
http://mail.python.org/mailman/listinfo/python-list