Ошибка 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'])