On Aug 2, 2010, at 4:42 PM, Bret Hughes wrote:

> I would turn on query logging and see what exactly is making it to mysql.
> 
> Niel Archer wrote:
>>> Before I send the following SQL to MySQL from PHP I print it to screen. PHP 
>>> chokes on it, but I can paste the exact same query from the screen directly 
>>> to MySQL and it works just fine. For example:
>>> 
>>> Here's the relevant PHP code:
>>> ======================================
>>> $sql_insert_registration = sprintf("INSERT INTO
>>>  Registrations (
>>>    Class_ID,
>>>    prid,
>>>    Registrant,
>>>    Company,
>>>    Phone,
>>>    Email
>>>  )
>>> VALUES (
>>>    $_POST[Class_ID],
>>>    $_POST[prid],
>>>    '%s',".
>>>    parseNull($_POST['Company']).",
>>>    '$_POST[Phone]',
>>>    '$_POST[Email]'
>>> )", mysql_real_escape_string($_POST['Registrant']));
>>> 
>>> echo "<pre>".$_POST["Registrant"]."</pre>";
>>> echo "<pre>".mysql_real_escape_string($_POST["Registrant"])."</pre>";
>>> echo "<pre>".$sql_insert_registration."</pre>";
>>> 
>>> if (!mysql_query($sql_insert_registration, $con)) {   die('Error: ' . 
>>> mysql_error()); ....
>>> ======================================
>>> 
>>> 
>>> Here's the output:
>>> =======================
>>> 
>>> INSERT INTO
>>>  Registrations (
>>>    Class_ID,
>>>    prid,
>>>    Registrant,
>>>    Company,
>>>    Phone,
>>>    Email
>>>  )
>>> VALUES (
>>>    355,
>>>    257,
>>>    'Brian O\'Brien',NULL,
>>>    '612-456-5678',
>>>    'paul_s_john...@mnb.uscourts.gov'
>>> )
>>> 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 
>>> 'Brien', 'Class registration confirmation', ' This email ' at line 16
>>> ==================================================
>>> 
>>> 
>>> Also very oddly if the name "O'Brien" is input into the HTML form with two 
>>> apostrophes side by side (O''Brien) then MySQL will take it (but then of 
>>> course we have the problem of two apostrophes side by side inserted into 
>>> the MySQL table). For example:
>>> 
>>> ===================================
>>> 
>>> INSERT INTO
>>>  Registrations (
>>>    Class_ID,
>>>    prid,
>>>    Registrant,
>>>    Company,
>>>    Phone,
>>>    Email
>>>  )
>>> VALUES (
>>>    355,
>>>    257,
>>>    'Brian O\'\'Brien',NULL,
>>>    '612-456-5678',
>>>    'paul_s_john...@mnb.uscourts.gov'
>>> )
>>> You have been signed up for the class,
>>> and a confirmation email has been sent to you.
>>> =================================
>>> 
>>> Very strange.
>>> 
>>> I've checked various PHP variables and cannot figure out. It works fines 
>>> from another PHP server that's using the same MySQL database.
>>> 
>>> Thanks,
>>> 
>>> Paul
>>>    
>> 
>> Probably needs a double backslash for O'Brien. One to escape the
>> apostrophe and one to escape the backslash escaping the apostrophe. ;-)
>> This would be because you're not using mysql_real_escape_string() on the
>> third parameter. Try this (not tested):
>> 
>> $sql_insert_registration = sprintf("INSERT INTO
>>  Registrations (
>>    Class_ID,
>>    prid,
>>    Registrant,
>>    Company,
>>    Phone,
>>    Email
>>  )
>> VALUES (%s, %s, '%s', '%s', '%s', '%s')", $_POST[Class_ID],
>> $_POST[prid],
>> mysql_real_escape_string(parseNull($_POST['Company'])),
>> mysql_real_escape_string($_POST[Phone]),
>> mysql_real_escape_string($_POST[Email]),
>> mysql_real_escape_string($_POST['Registrant']));
>> 
>> 
>> --
>> Niel Archer
>> niel.archer (at) blueyonder.co.uk

To reduce the amount of repetitive called to mysql_real_escape_string(), create 
a method/function to do the work for you....

<?php
function escape ($item) {
    if (is_array ($item)) {
        foreach ($item as $field => $value) {
            $escaped[$field] = escape ($value);
        }
    }
    else {
        $escaped = mysql_real_escape_string ($item);
    }
    
    return $escaped;
}

$_POST['Company'] = parseNull ($_POST['Company']);
$p = escape ($_POST);

$sql = "INSERT INTO Registrations (Class_ID, prid, Registrant, Company, Phone, 
Email) VALUES ('{$p['Class_ID']}', '{$p['prid']}', '{$p['Registrant']}', 
'{$p['Company']}', '{$p['Phone']}', '{$p['Email']}')";
?>

Don't know if that helps any, but it may take some of the monotony out of it.

Cheers,
~Philip

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

Reply via email to