Почему строка с одинарными кавычками вызывает ошибку при вставке в БД? - PullRequest
1 голос
/ 26 февраля 2011

У меня вопрос: как разрешить одинарные кавычки в строках?

Например, у меня есть форма и текстовое поле.Он настроен так, чтобы пользователь мог ввести свое имя.Оттуда он отправляет и передает данные в базу данных.

Мне нужно разрешить одинарные кавычки (апостроф), так как имена некоторых людей имеют апостроф в именах, например, «O'Reilly».

Есть предложения?

Ответы [ 4 ]

8 голосов
/ 26 февраля 2011

Одиночные кавычки не запрещены никоим образом. Я просто предположу, что вы получили ошибку при вставке в базу данных. Это, вероятно, связано с пропуском mysql_real_escape_string() для входных значений.

Вы получите ошибку SQL, если попробуете INSERT ... ('O'Reilly'), что является основным смыслом экранирующих функций SQL.

(Вот почему изначально было введено magic_quotes: заставить SQL работать «из коробки» для новичков.

5 голосов
/ 26 февраля 2011

Используйте функцию mysql_real_escape_string () для любого текста, который вы вставляете в свою базу данных. Вы можете получить ошибку в своем скрипте, если вы публикуете данные непосредственно в базу данных, потому что на самом деле вы заканчиваете цитату MySQL.

Это также необходимость безопасности, чтобы вы сбежали от своих данных. Что-то похожее на то, что вы должны иметь:

$q = "INSERT INTO `table` (`body`) VALUES ('".mysql_real_escape_string($_POST['body'])."')";
2 голосов
/ 26 февраля 2011

Если я правильно читаю ваш вопрос, вы запрограммировали ошибку SQL-инъекция в вашу программу, позволяющую слегка злонамеренным людям и вирусам читать и писать вашу базу данных. (Представьте, что кто-то печатает ';drop table users; в поле ... прощайте данные.)

Самый простой способ борьбы с атаками SQL-инъекций - это написать свои SQL-запросы с использованием подготовленных операторов , которые просят библиотеки баз данных безопасно обрабатывать входные данные:

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>
0 голосов
/ 19 марта 2012
           USe like:-

           insert into question(question,points,choice1,choice2,
           choice3,choice4,choice3_correct,tags,error_status,
           base_or_derived,language)    
           values('".mysql_real_escape_string($result4)."',
           '".$points."','".$ans1."','".$ans2."',
           '".$correct_ans."','".$ans3."','1','".$tags."',
            '".$error."','D','".$language."')
...