Ошибка MySQL при вставке данных, содержащих апострофы (одинарные кавычки)?

Когда я запрос вставки содержит цитату (например, Kellog's), она не может вставить запись.

ОШИБКА MSG:

У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса для использования около 's', 'Corn Flakes 170g', '$ 15,90', '$ 15,90', '$ 14,10', '-') 'на строка Ошибка обновления 1MySQL:

Первый 's' должен быть Kellogg's.

Есть ли какое-либо решение?

Ответ 1

Escape цитата с обратной косой чертой. Как 'Kellogg\'s'.


Вот ваша функция, используя mysql_real_escape_string:

function insert($database, $table, $data_array) { 
    // Connect to MySQL server and select database 
    $mysql_connect = connect_to_database(); 
    mysql_select_db ($database, $mysql_connect); 

    // Create column and data values for SQL command 
    foreach ($data_array as $key => $value) { 
        $tmp_col[] = $key; 
        $tmp_dat[] = "'".mysql_real_escape_string($value)."'"; // <-- escape against SQL injections
    } 
    $columns = join(',', $tmp_col); 
    $data = join(',', $tmp_dat);

    // Create and execute SQL command 
    $sql = 'INSERT INTO '.$table.'('.$columns.')VALUES('. $data.')'; 
    $result = mysql_query($sql, $mysql_connect); 

    // Report SQL error, if one occured, otherwise return result 
    if(!$result) { 
        echo 'MySQL Update Error: '.mysql_error($mysql_connect); 
        $result = ''; 
    } else { 
        return $result; 
    } 
}

Ответ 2

Вы должны передать переменную или данные внутри mysql_real_escape_string(trim($val)), где $val - это данные, по которым вы получаете сообщение об ошибке.

Если вы введете текст, то есть "Я люблю Kellog's", у нас есть строка ' в строке, чтобы он сломал запрос. Чтобы этого избежать, вам нужно хранить данные в переменной типа $val = "I love Kellog's".

Теперь это должно работать:

$goodval = mysql_real_escape_string(trim($val));

Ответ 3

Замените mysql на mysqli. Используйте это

mysqli_real_escape_string($connection,$_POST['Description'])

Ответ 4

Вам нужно избегать апострофа (то есть сказать SQL, что апостроф должен восприниматься буквально, а не как начало или конец строки) с помощью. \

Добавьте a до апострофа в Kellogg's, давая вам Kellogg's.

Ответ 5

В стандартном SQL вы используете две одинарные кавычки, чтобы указать одну одинарную цитату, следовательно:

INSERT INTO SingleColumn(SingleChar) VALUES('''');

Первая цитата открывает строку; вторая и третья - одинарная кавычка; и четвертый завершает строку. В MySQL вы также можете использовать обратную косую черту:

INSERT INTO SingleColumn(SingleChar) VALUES('\'');

Итак, в вашем примере один или оба из них должны работать:

INSERT INTO UnidentifiedTable
    VALUES('Kellog''s', 'Corn Flakes 170g', '$ 15.90', '$ 15.90', '$ 14.10', '--');
INSERT INTO UnidentifiedTable
    VALUES('Kellog\'s', 'Corn Flakes 170g', '$ 15.90', '$ 15.90', '$ 14.10', '--');

В PHP существует функция для дезинфекции пользовательских данных (mysql_real_escape_string), прежде чем вставлять ее в инструкцию SQL - или вы должны использовать заполнители. Обратите внимание: если вы не дезактивируете свои данные, вы подвергаете себя атакам SQL Injection.

Ответ 6

Пользователь этот.

mysql_real_escape_string(trim($val));

Ответ 7

Вы также можете использовать функцию addslashes(), которая автоматически ставит \ до ', чтобы избежать ошибки

Ответ 8

Оптимизировано для нескольких версий PHP

function mysql_prep($value){
        $magic_quotes_active = get_magic_quotes_gpc();
        $new_enough_php = function_exists("mysql_real_escape_string");//i.e PHP>=v4.3.0
        if($new_enough_php){//php v4.3.o or higher
            //undo any magic quote effects so mysql_real_escape_string( can do the work
            if($magic_quotes_active){
                $value = stripslashes($value);  
            }
            $value = mysql_real_escape_string(trim($value));
        }else{//before php v4.3.0
            //if magic quotes arn't already on, add slashes  
            if(!$magic_quotes_active){
                $value = addslashes($value);
            //if magic quotes are already on, shashes already exists        
            }   

        }
        return $value;
    }

Теперь просто используйте:

mysql_prep($_REQUEST['something'])