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

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

ОШИБКА MSG:

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 's', 'Corn Flakes 170g', '$ 15.90', '$ 15.90', '$ 14.10', '-') 'на линии Ошибка обновления 1MySQL:

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

Есть ли решение?

Побег цитаты с обратной косой чертой. Как '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; } } 

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

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

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

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

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

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

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

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

В стандартном 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 .

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

 mysql_real_escape_string(trim($val)); 

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

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

 function mysql_prep($value){ $magic_quotes_active = get_magic_quotes_gpc(); $new_enough_php = function_exists("mysql_real_escape_string");//ie 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'])